sql - 使用 TOP 和 ORDER BY 的查询非常慢
问题描述
我在 SQL Server 2014 中有一个查询,当我执行它时需要很长时间才能得到结果。
当我删除TOP
orORDER BY
指令时,它执行得更快,但是如果我同时编写它们,则需要很多时间。
SELECT TOP (10) A.ColumnValue AS ValueA
FROM TableA AS A
INNER JOIN TableB AS B
ON A.ID = B.ID
WHERE A.DateValue > '1982-05-02'
ORDER BY ValueA
我怎样才能让它更快?
解决方案
你说
当我删除 TOP或ORDER BY ... 它执行得更快
这表明 SQL Server 按所需顺序生成整个结果集没有问题。它只是梨形,限制为TOP 10
. 这是rowgoals的常见问题。当 SQL Server 知道您只需要前几个结果时,它可以选择一个不同的计划来尝试针对这种可能适得其反的情况进行优化。
更新的版本包括在DISABLE_OPTIMIZER_ROWGOAL
每个查询的基础上禁用此功能的提示。在旧版本上,您可以使用QUERYTRACEON 4138
如下。
SELECT TOP (10) A.ColumnValue AS ValueA
FROM TableA AS A
INNER JOIN TableB AS B
ON A.ID = B.ID
WHERE A.DateValue > '1982-05-02'
ORDER BY ValueA
OPTION (QUERYTRACEON 4138)
您可以使用它来验证原因,但可能会发现运行权限QUERYTRACEON
是一个问题。
在那种情况下,您可以将TOP
值隐藏在变量中,如下所示
DECLARE @Top INT = 10
SELECT TOP (@Top) A.ColumnValue AS ValueA
FROM TableA AS A
INNER JOIN TableB AS B
ON A.ID = B.ID
WHERE A.DateValue > '1982-05-02'
ORDER BY ValueA
option (optimize for (@Top = 1000000))
推荐阅读
- python - 使用正则表达式过滤数据框,使用列表
- python - 类型错误:索引()缺少 1 个必需的位置参数:'subject_slug'
- javascript - 如何为 firebase 功能选择不同的数据库?
- reactjs - 如何纠正打字稿错误?(道具类型库)
- python - 使用 html 编译 jinja 2 时出错
- algorithm - 多个依赖的自动完成
- java - 服务器和客户端之间的套接字对象不同
- angular - 来自错误验证的 Angular 11 反应性不起作用
- c++ - 没有 void_t 的 SFINAE(可能是模板专业化问题)
- python - BeautifulSoup 不采用完整的 HTML 代码