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

十三- 2014-10-31 04:56:32
每天数据插入可能几千~几十万
从数据库请求这个存储过程响应很慢
后面就重建索引,


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


表结构如下:


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


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









...全文
576 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
十三- 2014-11-05
  • 打赏
  • 举报
回复
问题已解决,谢谢楼上各位..
Q315054403 2014-11-01
  • 打赏
  • 举报
回复
误(滥)用了DTA,都喜欢用工具,在不知其内情的情况下乱用 根据描述,根本没有慢的逻辑
starseeker7 2014-11-01
  • 打赏
  • 举报
回复
每天插入数据几十万,那必然你的需要每天重建一次索引,做个JOB跑吧 最后两个字段需求不怎么合理,尝试优化,或者再业务上修正们,最好把max值先提取出来 还觉得慢可以考虑使用with(nolock),若要保证不重复可以考虑加上事务以及唯一索引和try catch捕捉错误后做循环重试插入 查询系统表获取最大值并不是最精准的 SQL并不擅长运算字符串,主键关联什么的最好用int或者bigint
无涯大者 2014-10-31
  • 打赏
  • 举报
回复
后半部分有优化的空间,如上述各位所说,可以单独处理下 后面最后一个字段。
还在加载中灬 2014-10-31
  • 打赏
  • 举报
回复
我觉得那一块CASE可以优化一下~~
Tiger_Zhao 2014-10-31
  • 打赏
  • 举报
回复
看CASE部分代码太折腾人了。
你还是用数据说明一下,逻辑是什么?
自动生成编码不至于要到CASE中做子查询。
十三- 2014-10-31
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
目测你的select top 语句需要优化。
不知道再怎么更优化了 原理是这样的==>批量插入 这只是sql优化上的一点...
AcHerat 元老 2014-10-31
  • 打赏
  • 举报
回复
可以把 select max() from ... 这段作为一个变量吧!非得写实际的查询里。
exception92 2014-10-31
  • 打赏
  • 举报
回复
目测你的select top 语句需要优化。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧