自学成才,小企业DIYer在这里。运行MS Sql Server '14。
我现在每月运行此查询4次,差不多2年。然而,在过去的两个月中,查询运行时间已经变得无法忍受。在2-3分钟内运行的用途现在需要24小时以上。
我将每周文件导入到月度表中,然后针对前2个月表对该表进行重复数据删除,以获得用于导出的唯一文件。表的数量与数据类型,索引和允许的空值保持一致。
这不是计算能力。今年1月份我可以替换去年1月份的文件,查询会在几分钟内完成。同样,这开始于2016年12月的文件。任何以前的文件运行得非常快。
有什么想法吗?提前谢谢!
查询:
SELECT [2017_JAN].*
FROM [dbo].[2017_JAN]
LEFT JOIN [dbo].[2016_NOV]
ON [2016_NOV].[ID] = [2017_JAN].[ID]
LEFT JOIN [dbo].[2016_DEC]
ON [2016_DEC].[ID] = [2017_JAN].[ID]
WHERE [2016_NOV].[ID] IS NULL
and [2016_DEC].[ID] IS NULL
答案 0 :(得分:0)
如上所述,重建索引表上的索引解决了这个问题。 在这种情况下,您可以运行DBCC CHECKTABLE以确保您的表健康。
答案 1 :(得分:0)
如果选择*,索引将不起作用。如果仅选择所需的实际列,则可以避免表扫描并加快运行速度。
另一个提示,如果确实有足够的内存,则可以向联接中添加哈希查询提示: https://docs.microsoft.com/en-us/sql/relational-databases/performance/joins?view=sql-server-2017
In [29]: import random
In [30]: size = 15
In [31]: maxval = 20
In [32]: a, q = zip(*[random.sample(range(1, maxval+1), 2) for z in range(size)])
In [33]: a
Out[33]: (18, 7, 12, 6, 17, 16, 12, 1, 14, 20, 9, 5, 8, 5, 18)
In [34]: q
Out[34]: (12, 10, 6, 1, 12, 15, 20, 7, 6, 10, 5, 7, 16, 7, 10)
总体而言,我们必须查看您的表,键和索引以对其进行优化。
祝你好运!