我正在进行大规模的工作连接,在添加索引等方面的资源非常有限,而且由于环境的原因,我可以在查询本身中做些什么(也就是说,我只能选择数据,不允许变量或表创建)。我在某个地方读到子查询会自动索引结果,这是真的吗?另外,对于我的主要联接表(3),每个表都有~140 K行。我必须加入两个额外的桌子,以确保过滤是正确的。我有下面列出的查询,我现在有关于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语句填充临时网格,然后逐行复制到所需的网格中。这很有可能是我问题的原因。谢谢你的帮助。
发布于 2013-12-13 19:27:36
我得出的结论是,我所工作的环境是问题的根源。我的查询按预期工作,一点也不慢(1秒)。18 000行)。正如注释中所述,我必须以有限的灵活性填充网格,我认为这些网格首先使用SQL语句填充临时网格,然后逐行复制到所需的网格中。这很有可能是我问题的原因。谢谢大家的帮助。
发布于 2013-12-14 03:18:10
我的两分钱..。一般来说,喜欢不是很好的优化。在您的示例中,您似乎使用的是“%值%”。在这种情况下,查询优化器必须扫描整个索引。至少,我想看看是否有办法避免使用这种方法。
https://stackoverflow.com/questions/20571864
复制相似问题