MS SQL Serv:为什么我的查询运行得如此之慢?

时间:2017-01-20 22:48:28

标签: sql-server

自学成才,小企业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

2 个答案:

答案 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)

总体而言,我们必须查看您的表,键和索引以对其进行优化。

祝你好运!