SQL子查询性能问题

时间:2012-10-22 14:24:18

标签: sql-server

我的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数据类型相同,并且两个表都被编入索引。

有关如何提高此查询性能的任何想法?

非常感谢。

3 个答案:

答案 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建议相结合,几乎可以立即返回完整的数据集。

虽然我无法遵循增强的权限/链接服务器选项有点令人沮丧,但至少此查询运行良好。

非常感谢大家的帮助!