0

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

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

非常感谢。

4

3 回答 3

1

JOIN改为尝试:

SELECT   V.ColumnA
        ,V.ColumnB
        ,V.ColumnC
FROM    [LinkedServer].[Database].[Schema].[View] V
INNER JOIN #TempTable T ON V.ColumnA = T.ColumnA
于 2012-10-22T14:27:43.150 回答
0

它可能与查询计划的创建方式有关。在一种情况下,SQL 服务器知道它将在比较中使用什么值,而在第二种情况下,它正在估计。单击“包括实际执行计划”后,在单独的 Management Studio 窗口中运行每个查询。您可能会看到不同的计划。我要检查的第一件事是将鼠标悬停在链接动作的箭头上(从胖的开始)并将估计的行数与实际的行数进行比较。这些值中的较大差异(10 倍?)可能导致 SQL 服务器做出错误的决定(表扫描与索引等)如果您看到这一点,您可能会考虑让 SQL 更改其计划的提示 - 如果您需要使用慢查询!提示的最大问题是,随着数据量的变化,提示很容易成为障碍而不是好处,

于 2012-10-22T16:12:26.013 回答
0

链接服务器供应商为我提供了不同的来源。我现在不是连接到一个视图(它本身分布在多个服务器上),而是连接到一个表。这与 Brian 的 INNER REMOTE JOIN 建议相结合,几乎可以立即返回完整的数据集。

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

非常感谢大家的帮助!

于 2012-10-23T15:48:12.130 回答