每天数据插入可能几千~几十万
从数据库请求这个存储过程响应很慢
后面就重建索引,
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,都喜欢用工具,在不知其内情的情况下乱用
根据描述,根本没有慢的逻辑