问题标签 [sql-execution-plan]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
11 回答
56460 浏览

sql - 你如何解释查询的解释计划?

当试图了解 SQL 语句是如何执行的时,有时建议查看解释计划。在解释(理解)解释计划时应该经历什么过程?什么应该突出,“哦,这工作很棒?” 与“哦,不,那不对。”

0 投票
8 回答
8863 浏览

sql - 如果不使用所有列,是否会使用我的索引?

我在表 T 的 A、B、C、D 列上有一个索引

我有一个查询,它从 WHERE 子句中的 A、B、C 中提取。

将使用该索引还是需要一个仅包含 A、B、C 的单独索引?

0 投票
2 回答
1493 浏览

database - 成本与一致的获取

在解释计划中看到具有低成本但在自动跟踪中获得高一致性的查询意味着什么?在这种情况下,成本是 100 美元,而 CR 是数百万美元。

0 投票
5 回答
8790 浏览

sql-server - SQL Server 查询执行计划在使用的索引上显示错误的“实际行数”并且性能非常缓慢

今天,我偶然发现了一个有趣的性能问题,即在 Sql Server 2005 SP2 上运行的存储过程在兼容级别为 80 (SQL2000) 的数据库中运行。

proc 运行大约 8 分钟,执行计划显示使用了一个实际行数为 1.339.241.423 的索引,这比表本身的“真实”实际行数 1.144.640 高大约 1000 倍,如正确显示通过估计的行数。所以查询计划优化器给出的实际行数肯定是错误的!

替代文字

有趣的是,当我将 proc 中的 procs 参数值复制到局部变量并在实际查询中使用局部变量时,一切正常 - proc 运行 18 秒,执行计划显示正确的实际行数。

编辑:正如 TrickyNixon 所建议的,这似乎是参数嗅探问题的标志。但实际上,我在这两种情况下都得到了完全相同的执行计划。相同的索引以相同的顺序使用。我看到的唯一区别是直接使用参数值时,PK_ED_Transitions 索引上的实际行数较高。

我已经完成了 dbcc dbreindex 和 UPDATE STATISTICS 没有任何成功。dbcc show_statistics 也显示了良好的索引数据。

proc 是用 RECOMPILE 创建的,因此每次运行时都会编译一个新的执行计划。

更具体地说 - 这个运行速度很快:

这个版本运行速度非常慢,但产生完全相同的执行计划(除了已用索引上的实际行数过高):

有任何想法吗?有谁知道 Sql Server 在计算查询计划时从哪里获得实际的行计数值?

更新:我在另一台服务器上尝试了查询,将 copat 模式设置为 90(Sql2005)。它的行为相同。我想我会打开一个 ms 支持电话,因为这在我看来就像一个错误。

0 投票
1 回答
2771 浏览

sql - SQL Server - 条件语句的查询执行计划

条件语句(如IF ... ELSE)如何影响 SQL Server(2005 及更高版本)中的查询执行计划?

条件语句是否会导致执行计划不佳,在考虑性能时是否需要注意任何形式的条件?

**编辑添加**:

我特指缓存的查询执行计划。例如,在下面的实例中缓存查询执行计划时,是否为条件的每个结果缓存了两个执行计划?

0 投票
3 回答
2853 浏览

mysql - 如何使用常量优化 MySQL 的查询?

注意:原始问题没有实际意义,但请扫描到底部以查找相关内容。

我有一个要优化的查询,看起来像这样:

我想知道正在使用什么键,但无论我通过什么来解释,它都能够将 where 子句优化为无(“不可能 WHERE 注意到......”),因为我给它提供了一个常数。

  • 有没有办法告诉mysql不要在解释中进行持续优化?
  • 我错过了什么吗?
  • 有没有更好的方法来获取我需要的信息?

编辑:EXPLAIN似乎给了我由常量值产生的查询计划。由于查询是存储过程的一部分(并且 spocs 中的 IIRC 查询计划是在调用它们之前生成的),这对我没有好处,因为值不是恒定的。我想要的是找出优化器在不知道实际值是什么时会生成什么查询计划。

我错过了什么吗?

Edit2:在别处询问,似乎 MySQL 总是重新生成查询计划,除非你不遗余力地让它重新使用它们。即使在存储过程中。由此看来,我的问题似乎没有实际意义。

但是,这并没有使我真正想知道的事情变得毫无意义: 您如何优化包含在任何特定查询中恒定的值的查询,但是我,程序员,事先不知道将使用什么值?-- 例如,假设我的客户端代码正在生成一个在其where子句中带有数字的查询。有时该数字会导致不可能的 where 子句,有时则不会。我如何使用解释来检查查询的优化程度?

我立即看到的最佳方法是EXPLAIN针对存在/不存在案例的完整矩阵运行它。确实,这不是一个很好的解决方案,因为手工操作既困难又容易出错。

0 投票
1 回答
1737 浏览

sql - 有关学习如何在 SQL Server 2005 中解释 SQL 查询的执行计划的任何指南?

是否有任何关于解释 SQL Server 2005 中查询的执行计划的好文章、教程或类似参考资料?

0 投票
1 回答
27073 浏览

optimization - postgres中的Seq Scan和Bitmap堆扫描有什么区别?

在解释命令的输出中,我发现了两个术语“序列扫描”和“位图堆扫描”。有人能告诉我这两种扫描有什么区别吗?(我正在使用 PostgreSql)

0 投票
2 回答
6273 浏览

sql - 直接执行语句和从存储过程执行语句时的执行计划不同

在工作中开发一个新查询时,我编写了它并在 SQL 查询分析器中对其进行了分析。该查询在没有任何表扫描的情况下执行得非常好,但是当我将它封装在存储过程中时,性能非常糟糕。当我查看执行计划时,我可以看到 SQL Server 选择了一个不同的计划,该计划使用表扫描而不是 TableB 上的索引搜索(我被迫稍微混淆表和列名,但没有任何查询逻辑已经改变)。

这是查询

当我运行查询“原始”时,我得到以下跟踪统计信息

当我使用以下命令将查询作为存储过程运行时

我得到以下跟踪统计信息

如果我将查询存储在 nvarchar 中并像这样使用 sp_executesql 执行它(它的执行类似于 sproc),我也会得到相同的结果

除了上面的 select 语句,存储过程不包含任何内容。什么会导致 sql server 仅仅因为语句作为存储过程执行而选择较差的执行计划?

我们目前在SQL Server 2000上运行

0 投票
9 回答
12231 浏览

sql - SQL“EXISTS”使用变体的性能

下面三个 SQL 语句的性能有什么区别吗?

它们都应该工作并返回相同的结果集。但是,如果内部 SELECT 选择 tableB 的所有字段、一个字段或只是一个常量,这有关系吗?

当所有语句表现相同时,是否有任何最佳实践?