我正在开展大规模的工作连接,并且在能够添加索引方面拥有非常有限的资源,以及由于环境而在查询中可以做的事情(即我只能选择数据,不允许变量或表创建)。我在某处读过子查询会自动索引结果,这是真的吗?同样对于我的主要连接表(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语句填充临时网格然后逐行复制到所需网格来填充。这很可能是我的问题的原因。谢谢你的帮助。
答案 0 :(得分:0)
我得出的结论是,我所处理的环境是问题的原因。我的查询按预期工作,根本不慢(1秒,18,000行)。正如评论中所述,我必须以有限的灵活性填充网格,并且我相信这些网格通过首先使用SQL语句填充临时网格然后逐行复制到所需网格来填充。这很可能是我的问题的原因。感谢大家的帮助。
答案 1 :(得分:0)
我在这里2美分..一般情况下,LIKE的优化程度不高。在您的情况下,您似乎也使用LIKE和'%value%'。在这种情况下,查询优化器必须扫描整个索引。我至少会看到是否有办法避免使用它。