当前位置: 代码迷 >> Sql Server >> 一张表的大数据查询插入响应慢,求解决方法,越详细,越多越好.
  详细解决方案

一张表的大数据查询插入响应慢,求解决方法,越详细,越多越好.

热度:121   发布时间:2016-04-24 09:46:10.0
一张表的大数据查询插入响应慢,求解决办法,越详细,越多越好...
每天数据插入可能几千~几十万
从数据库请求这个存储过程响应很慢
后面就重建索引,


DBCC DBREINDEX ( 'PrintRecord','PK_PrintRecord')
DBCC DBREINDEX ( 'PrintRecord','IX_PrintRecord')

马上就变快了,但是过一段时间,又很慢,又重建索引,越来越频繁..

不知有没好的办法,不要这么折腾人..

存储过程:

ALTER PROCEDURE [dbo].[P_InsertPrint]
    @dataNumber  INT, -- 需要插入的数据量
    @barcode_sku nvarchar(50),
@printerName nvarchar(200),
@print_count_number int,
@print_ModelChild_Id int,
@print_user int
AS

if(@barcode_sku = '' or @barcode_sku is null)
select 1
else
begin
INSERT INTO PrintRecord(barcode_sku,PrinterName,print_count_number,print_ModelChild_Id,print_user,fid,barcode_code) 
SELECT TOP(@dataNumber)
 @barcode_sku,
 @printerName,
 @print_count_number,
 @print_ModelChild_Id,
 @print_user,
 CAST((case when (select max(fid) from PrintRecord where barcode_sku = @barcode_sku) is not null then ((select max(fid) from PrintRecord where barcode_sku = @barcode_sku)+( ROW_NUMBER() OVER(ORDER BY o.object_id)))  else ( ROW_NUMBER() OVER(ORDER BY o.object_id)) end) AS nvarchar(20)),
 @barcode_sku+'_'+RIGHT('000000'+CAST((case when (select max(fid) from PrintRecord where barcode_sku = @barcode_sku) is not null then ((select max(fid) from PrintRecord where barcode_sku = @barcode_sku)+( ROW_NUMBER() OVER(ORDER BY o.object_id)))  else ( ROW_NUMBER() OVER(ORDER BY o.object_id)) end) AS nvarchar(20)),7)
FROM sys.all_objects AS o,sys.all_columns AS c      
select 0
end


表结构如下:


查了下这张表的索引如下:


这个库没什么东西,主要就是这张表..










------解决思路----------------------
目测你的select top  语句需要优化。
------解决思路----------------------
可以把 select max() from ...  这段作为一个变量吧!非得写实际的查询里。
------解决思路----------------------
看CASE部分代码太折腾人了。
你还是用数据说明一下,逻辑是什么?
自动生成编码不至于要到CASE中做子查询。
------解决思路----------------------
我觉得那一块CASE可以优化一下~~
------解决思路----------------------
后半部分有优化的空间,如上述各位所说,可以单独处理下 后面最后一个字段。
------解决思路----------------------
每天插入数据几十万,那必然你的需要每天重建一次索引,做个JOB跑吧
最后两个字段需求不怎么合理,尝试优化,或者再业务上修正们,最好把max值先提取出来
还觉得慢可以考虑使用with(nolock),若要保证不重复可以考虑加上事务以及唯一索引和try catch捕捉错误后做循环重试插入
查询系统表获取最大值并不是最精准的
SQL并不擅长运算字符串,主键关联什么的最好用int或者bigint

------解决思路----------------------
误(滥)用了DTA,都喜欢用工具,在不知其内情的情况下乱用
根据描述,根本没有慢的逻辑
  相关解决方案