首页 > 解决方案 > TOP 如何影响 SQL 性能

问题描述

我在这里有点茫然。我有两个几乎相同的查询:

select
    top 301
    *
from
    view
where
    columnA like '%val%'
    and
    columnB > '12/12/2019 00:00:00'
order by
    columnC

select
    *
from
    view
where
    columnA like '%val%'
    and
    columnB > '12/12/2019 00:00:00'
order by
    columnC

当我运行这两个查询时,它们可以正常使用提供的日期。如果我回顾一下历史,第一个查询将有效地使我的应用程序超时,但第二个查询工作正常。

我做了一些故障排除,看来以下情况必须为真,才能使应用程序超时。

  1. top # 必须包括在内
  2. order by 必须开启columnC
  3. columnB必须足够远在过去。

由于我的应用程序的设置方式,查询设置将始终包含这三个元素,并且我无法将这些元素中的任何一个移动到视图本身,因此它们将始终是全表扫描。

我正在尝试优化我的视图,但我根本不明白在查询中添加 top # 是如何导致应用程序超时的。任何了解 top 如何影响 SQL 性能的帮助将不胜感激。

补充说明:

我注意到添加 TOP 确实会稍微改变执行计划。我在两者中看到的最大区别是,如果没有 top,执行计划几乎在每个连接上都运行并行,而对于包含 top 的查询则不是这种情况。

标签: sqlsql-servertsql

解决方案


您在执行计划中看到的内容是正常的。如果您查看文档,您会看到有几种抑制并行性的结构:

  • 标量 UDF
  • 远程查询
  • 动态游标
  • 递归查询
  • 多语句表值函数
  • TOP关键词

因此,添加 aTOP可能看起来不像big,但在某些情况下会完全改变执行计划。

有时,优化视图执行的一种技术是实现它。索引视图中可以存在的内容也有很多限制,但是如果您的视图可以物化,您应该尝试一下。


推荐阅读