我的SQL子查询存在性能问题。
作为硬编码查询,运行大约需要1秒钟:
SELECT ColumnA
,ColumnB
,ColumnC
FROM [LinkedServer].[Database].[Schema].[View]
WHERE ColumnA IN
(
'ABC',
'DEF',
'HIJ',
'KLM'
)
但是,以下代码需要一分钟才能运行:
SELECT ColumnA
,ColumnB
,ColumnC
FROM [LinkedServer].[Database].[Schema].[View]
WHERE ColumnA IN
(
SELECT ColumnA FROM #TempTable
)
临时表包含与硬编码示例相同的4行。链接服务器上的视图包含大约。 700,000行(不幸的是,不受我的控制)。 ColumnA数据类型相同,并且两个表都被编入索引。
有关如何提高此查询性能的任何想法?
非常感谢。
答案 0 :(得分:1)
尝试使用JOIN
:
SELECT V.ColumnA
,V.ColumnB
,V.ColumnC
FROM [LinkedServer].[Database].[Schema].[View] V
INNER JOIN #TempTable T ON V.ColumnA = T.ColumnA
答案 1 :(得分:0)
它可能与查询计划的创建方式有关。在一种情况下,SQL服务器知道它将在比较中使用的值,在它估计的第二个中。 单击“包含实际执行计划”后,在单独的Management Studio窗口中运行每个查询。您可能会看到不同的计划。 我要检查的第一件事是将鼠标悬停在链接动作的箭头上(从胖动作开始),并将估计的行数与实际行数进行比较。这些值中的大差异(因子为10?)可能导致SQL服务器做出错误的决定(表扫描与索引等)如果您看到这一点,您可能会考虑提示让SQL更改其计划 - 如果您需要使用慢查询!提示的一个大问题是,随着数据量的变化,提示很容易成为障碍而不是利益,因此它们被认为是最后的手段。
答案 2 :(得分:0)
链接服务器供应商为我提供了不同的来源。我现在连接到一个表,而不是连接到一个视图(它本身分布在多个服务器上)。这与Brian的INNER REMOTE JOIN建议相结合,几乎可以立即返回完整的数据集。
虽然我无法遵循增强的权限/链接服务器选项有点令人沮丧,但至少此查询运行良好。
非常感谢大家的帮助!