这是从临时表中进行的简单选择,左键将现有表保留在其主键上,其中两个子选择使用前1个引用联接表。
在代码中:
SELECT
TempTable.Col1,
TempTable.Col2,
TempTable.Col3,
JoinedTable.Col1,
JoinedTable.Col2,
(
SELECT TOP 1
ThirdTable.Col1 -- Which is ThirdTable's Primary Key
FROM
ThirdTable
WHERE
ThirdTable.SomeColumn = JoinedTable.SomeColumn
) as ThirdTableColumn1,
(
SELECT TOP 1
ThirdTable.Col1 -- Which is also ThirdTable's Primary Key
FROM
ThirdTable
WHERE
ThirdTable.SomeOtherColumn = JoinedTable.SomeColumn
) as ThirdTableColumn2,
FROM
#TempTable as TempTable
LEFT JOIN
JoinedTable
ON (TempTable.PKColumn1 = JoinedTable.PKColumn1 AND
TempTable.PKColumn2 = JoinedTable.PKColumn2)
WHERE
JoinedTable.WhereColumn IN (1, 3)
这是我查询的精确副本。
如果删除两个子选择,它将运行良好且快速。通过两个子选择,我每秒获得约100条记录,这对于该查询而言非常慢,因为它应该返回近一百万条记录。
我检查了每个表是否都有主键,它们都一样。它们的重要列都具有索引和统计信息,例如那些WHERE子句中的那些和JOIN子句中的那些。唯一没有定义主键或索引的表是临时表,但这不是问题,因为它不是与慢速子选择相关的表,而且正如我提到的那样,没有子选择,它运行得很好。
没有这些,TOP 1
它将返回多个结果,并引发错误。
帮忙,有人吗?
编辑:
因此执行计划告诉我我缺少索引。我已经创建了它,并重新创建了其他一些索引。一段时间后,执行计划正在使用它们,现在查询运行很快。唯一的问题是,对于同一查询,我没有在另一台服务器上再次成功执行此操作。因此,我的解决方案将是提示SQL Server将使用哪个索引。