第一次在这里发布海报。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
是否每个表都有一个索引DAUID? DAUID是多部分索引中的第一个元素?也会显示你的执行计划(或者至少看看它在过程中的僵局应该很容易看到,因为它会有最大的百分比)。可能存在各种各样的问题,但通过查看执行计划,我们可以确定最大的瓶颈并相应地花费的时间。https://docs.microsoft.com/en-us/sql/relational-databases/performance/display-an-actual-execution-plan – xQbert
检查,看看是否有是阻塞另一个进程运行这个 – HLGEM
你可以选择你的答案是正确的,而且满足查询条件的索引称为覆盖索引,对于优化器来说,你可以查看它,然后查看你的巨大的宽行。第一或第二,扫描将需要大量的阅读,因为一行会迅速吸收你的范围内的页面,导致大量的逻辑/物理读取。最后,你有一个表设计,超过200列? 这是 真的正常化了吗? –