多个联接+大量数据优化

时间:2013-12-13 16:55:29

标签: sql sql-server tsql

我正在开展大规模的工作连接,并且在能够添加索引方面拥有非常有限的资源,以及由于环境而在查询中可以做的事情(即我只能选择数据,不允许变量或表创建)。我在某处读过子查询会自动索引结果,这是真的吗?同样对于我的主要连接表(3),每个都有~140K行。我必须加入2个额外的表来确保过滤是正确的。我有下面列出的查询,我目前有JOIN条款的标准。另一个问题是,如果我将我的标准移到子查询中的where子句中,它会受益吗?

  SELECT * 
FROM   (SELECT          NULL AS A1, 
                        DFS_ROHEADER.TECHID, 
                        DFS_ROHEADER.RONUMBER, 
                        DFS_ROHEADER.CUSTOMERNUMBER, 
                        DFS_CUSTOMER.BNAME, 
                        DFS_ROHEADER.UNITNUMBER, 
                        DFS_ROHEADER.MILEAGE, 
                        DFS_ROHEADER.OPENEDDATE, 
                        DFS_ROHEADER.CLOSEDDATE, 
                        DFS_ROHEADER.STATUS, 
                        DFS_ROHEADER.PONUMBER, 
                        DFS_TECH.REGION, 
                        DFS_TECH.RSM, 
                        DFS_ROPART.PARTID, 
                        CONVERT(NVARCHAR(max), DFS_RODETAIL.STORY) AS STORY 
        FROM   DFS_ROHEADER 
               LEFT JOIN DFS_CUSTOMER 
                      ON DFS_ROHEADER.CUSTOMERNUMBER = DFS_CUSTOMER.CUST_NO 
               LEFT JOIN DFS_TECH 
                      ON DFS_ROHEADER.TECHID = DFS_TECH.TECHID 
               INNER JOIN DFS_RODETAIL 
                       ON DFS_ROHEADER.RONUMBER = DFS_RODETAIL.RONUMBER 
               INNER JOIN DFS_ROPART 
                       ON DFS_RODETAIL.RONUMBER = DFS_ROPART.RONUMBER 
                          AND DFS_RODETAIL.LINENUMBER = DFS_ROPART.LINENUMBER 
                          AND DFS_ROHEADER.RONUMBER LIKE '%$FF_RONumber%' 
                          AND DFS_ROHEADER.UNITNUMBER LIKE '%$FF_UnitNumber%' 
                          AND DFS_ROHEADER.PONUMBER LIKE '%$FF_PONumber%' 
                          AND ( DFS_CUSTOMER.BNAME LIKE '%$FF_Customer%' 
                                 OR DFS_CUSTOMER.BNAME IS NULL ) 
                          AND DFS_ROHEADER.TECHID LIKE '%$FF_TechID%' 
                          AND DFS_ROHEADER.CLOSEDDATE BETWEEN 
                              FF_ClosedBegin AND FF_ClosedEnd 
                          AND ( DFS_TECH.REGION LIKE '%$FilterRegion%' 
                                 OR DFS_TECH.REGION IS NULL ) 
                          AND ( DFS_TECH.RSM LIKE '%$FF_RSM%' 
                                 OR DFS_TECH.RSM IS NULL ) 
                          AND DFS_RODETAIL.STORY LIKE '%$FF_Story%' 
                          AND DFS_ROPART.PARTID LIKE '%$FF_PartID%' 
        WHERE  DFS_ROHEADER.DELETED_BY < 0 
               AND DFS_RODETAIL.DELETED_BY < 0 
               AND DFS_ROPART.DELETED_BY < 0) T 
ORDER  BY T.RONUMBER 

此查询有效;但是,它可能需要永远运行,并可以超时。我还有其他查询也在环境中运行,我会根据建议采取任何你可以给我的,并将其应用于那些。我正在使用SQLServer 2000,感谢您的帮助。

编辑:

执行计划:

https://dl.dropboxusercontent.com/u/99733863/ExecutionPlan.sqlplan

更新:

我得出的结论是,我所处理的环境是问题的原因。我的查询按预期工作,根本不慢(1秒,18,000行)。正如评论中所述,我必须以有限的灵活性填充网格,并且我相信这些网格通过首先使用SQL语句填充临时网格然后逐行复制到所需网格来填充。这很可能是我的问题的原因。谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

我得出的结论是,我所处理的环境是问题的原因。我的查询按预期工作,根本不慢(1秒,18,000行)。正如评论中所述,我必须以有限的灵活性填充网格,并且我相信这些网格通过首先使用SQL语句填充临时网格然后逐行复制到所需网格来填充。这很可能是我的问题的原因。感谢大家的帮助。

答案 1 :(得分:0)

我在这里2美分..一般情况下,LIKE的优化程度不高。在您的情况下,您似乎也使用LIKE和'%value%'。在这种情况下,查询优化器必须扫描整个索引。我至少会看到是否有办法避免使用它。