SQL Server 2008 - 使用多个表永远运行查询

时间:2017-08-25 21:10:32

标签: sql-server

我在尝试在数据库中运行查询时遇到问题。这是一个相对简单的查询,但涉及多个表(10),大量行(~60k +)和许多列(~200 +)。

当我尝试执行查询时,它似乎永远运行(2小时+),并且在我终止进程之前,数据库大小从原始5gb扩展到60gb。我已经在每个表上设置了一个主键,希望能够加快这个过程,但它没有什么不同。

奇怪的问题是虽然我尝试在另一个具有相同结构的数据库上运行类似的查询,但这次有11个表,我的结果是在10分钟内执行的。

对于我应该检查的内容的任何建议将不胜感激。

由于

示例代码

SELECT 
    A.DBUID, A.DAUID, A.CSDUID, A.CSDNAME,
    A.CDUID, A.CDNAME, A.PRUID,
    --W1
    A.[COM1-W1-LC] + B.[COM2-W1-LC] + C.[COM3-W1-LC] + D.[COM4-W1-LC] + 
      E.[COM5-W1-LC] + F.[COM6-W1-LC] + G.[COM7-W1-LC] + H.[COM8-W1-LC] + 
      I.[COM9-W1-LC] + J.[COM10-W1-LC] AS 'W1-LC',
    A.[COM1-W1-LS] + B.[COM2-W1-LS] + C.[COM3-W1-LS] + D.[COM4-W1-LS] +  
      E.[COM5-W1-LS] + F.[COM6-W1-LS] + G.[COM7-W1-LS] + H.[COM8-W1-LS] + 
      I.[COM9-W1-LS] + J.[COM10-W1-LS] AS 'W1-LS',
    A.[COM1-W1-PC] + B.[COM2-W1-PC] + C.[COM3-W1-PC] + D.[COM4-W1-PC] + 
      E.[COM5-W1-PC] + F.[COM6-W1-PC] + G.[COM7-W1-PC] + H.[COM8-W1-PC] + 
      I.[COM9-W1-PC] + J.[COM10-W1-PC] AS 'W1-PC',
    A.[COM1-W1-MC] + B.[COM2-W1-MC] + C.[COM3-W1-MC] + D.[COM4-W1-MC] +  
      E.[COM5-W1-MC] + F.[COM6-W1-MC] + G.[COM7-W1-MC] + H.[COM8-W1-MC] + 
      I.[COM9-W1-MC] + J.[COM10-W1-MC] AS 'W1-MC',
    A.[COM1-W1-MS] + B.[COM2-W1-MS] + C.[COM3-W1-MS] + D.[COM4-W1-MS] + 
      E.[COM5-W1-MS] + F.[COM6-W1-MS] + G.[COM7-W1-MS] + H.[COM8-W1-MS] + 
      I.[COM9-W1-MS] + J.[COM10-W1-MS] AS 'W1-MS',
    A.[COM1-W1-HC] + B.[COM2-W1-HC] + C.[COM3-W1-HC] + D.[COM4-W1-HC] + 
      E.[COM5-W1-HC] + F.[COM6-W1-HC] + G.[COM7-W1-HC] + H.[COM8-W1-HC] + 
      I.[COM9-W1-HC] + J.[COM10-W1-HC] AS 'W1-HC',
    A.[COM1-W1-HS] + B.[COM2-W1-HS] + C.[COM3-W1-HS] + D.[COM4-W1-HS] + 
      E.[COM5-W1-HS] + F.[COM6-W1-HS] + G.[COM7-W1-HS] + H.[COM8-W1-HS] + 
      I.[COM9-W1-HS] + J.[COM10-W1-HS] AS 'W1-HS',

    -- this continues on for ~200 sets
INTO 
    COM_Results
FROM 
    SeismicDesign_COM1 A
INNER JOIN 
    SeismicDesign_COM2 B ON A.DAUID = B.DAUID
INNER JOIN 
    SeismicDesign_COM3 C ON A.DAUID = C.DAUID
INNER JOIN 
    SeismicDesign_COM4 D ON A.DAUID = D.DAUID
INNER JOIN 
    SeismicDesign_COM5 E ON A.DAUID = E.DAUID
INNER JOIN 
    SeismicDesign_COM6 F ON A.DAUID = F.DAUID
INNER JOIN 
    SeismicDesign_COM7 G ON A.DAUID = G.DAUID
INNER JOIN 
    SeismicDesign_COM8 H ON A.DAUID = H.DAUID
INNER JOIN 
    SeismicDesign_COM9 I ON A.DAUID = I.DAUID
INNER JOIN 
    SeismicDesign_COM10 J ON A.DAUID = J.DAUID

1 个答案:

答案 0 :(得分:2)

我是个菜鸟。在阅读了执行计划的工作原理之后,我开始将我的代码追溯到一行并加入两个表。这导致了超过20万行的结果,这是错误的。多数民众赞成,当我意识到我加入DAUID表而不是DBUID。 DAUID是用于聚合的下一级别。

我对这么简单的错误感到尴尬。学过的知识!感谢所有提出建议的人!