2017-08-25 64 views
0

第一次在这里发布海报。SQL Server 2008 - 查询永远在多个表上运行

我有一个问题,试图运行在我的数据库查询。这是一个相对简单的查询,但涉及多个表(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 
+2

是否每个表都有一个索引DAUID? DAUID是多部分索引中的第一个元素?也会显示你的执行计划(或者至少看看它在过程中的僵局应该很容易看到,因为它会有最大的百分比)。可能存在各种各样的问题,但通过查看执行计划,我们可以确定最大的瓶颈并相应地花费的时间。https://docs.microsoft.com/en-us/sql/relational-databases/performance/display-an-actual-execution-plan – xQbert

+0

检查,看看是否有是阻塞另一个进程运行这个 – HLGEM

+0

你可以选择你的答案是正确的,而且满足查询条件的索引称为覆盖索引,对于优化器来说,你可以查看它,然后查看你的巨大的宽行。第一或第二,扫描将需要大量的阅读,因为一行会迅速吸收你的范围内的页面,导致大量的逻辑/物理读取。最后,你有一个表设计,超过200列? 这是 真的正常化了吗? –

回答

2

我是小白。在阅读了执行计划的工作方式之后,我开始追溯我的代码到一行,然后加入2个表格。结果在那里出现了超过20万行的结果,这是错误的。那是当我意识到我已经加入了DAUID而不是DBUID的表。 DAUID是用于聚合的下一个级别。

我就这么一个简单的错误尴尬。学过的知识!感谢所有提供他们建议的人!

+0

你的尴尬问题(如你所说)可以通过删除它来删除。 –