问题标签 [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 投票
1 回答
40653 浏览

sql - 如何在 SQL Server 2005/2008 中清除查询执行统计信息

基于使用从这篇文章最执行的存储过程中获得的这条非常有用的 SQL 获取查询执行统计信息 - 代码日志

我如何完全清除这些执行统计数据并从头开始?

这将特别有用,因为开发错误和测试导致例程通常被调用很多次,从而使真正的使用级别无效。

0 投票
1 回答
139 浏览

performance - 由于 SP 性能不足导致的 SQL 存储过程问题

主要问题是在我的 sp 中有不同的对象和逻辑可能导致性能不足。

我在我的 SP 上看到的东西以及 SP 1-Temp 表中正在使用的表,如下所示;(2个临时表)

创建表#TEMP_TABLE(AB INT NOT NULL,AC INT NOT NULL,AD INT NOT NULL,AF INT NULL,AG INT NULL,REFERENCE_NUMBER INT NULL)在#TEMP_TABLE(AB,AC,AD)上创建非聚集索引 IX_1

2- 将进程插入到创建临时表中作为 SP 中的 TEMP1

3- DROP TABLE #TEMP_TABLE DROP TABLE #TEMP_TABLE2 在 SP 的末尾

4-有两个表用于连接自己,但不是所有使用 JOIN 运算符的“on”情况的字段。例如; 在第一个表上声明了聚集索引字段,加上不在第一个表的聚集索引组中的日期列..

简称;聚集和非聚集索引很重要,但我应该按什么顺序声明它们。我需要哪种索引类型,告诉我创建索引的顺序,以便进一步使用 JOIN 过程等。

5-我应该使用表变量而不是临时表。好的,它会更好,但是有很多问号不允许我使用表变量..

*插入到表变量中不会利用并行性。 参考->

6-我听说过逻辑阅读。我真的应该关心这些数字吗?示例数据结果的详细信息如下所示 (*)

7-执行计划...

执行计划

*输出:

表“频道”。扫描计数 0,逻辑读取 2,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。表 'XYZ_DATE'。扫描计数 1,逻辑读取 2,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。表 'XYZ01'。扫描计数 3171,逻辑读取 13135,物理读取 153,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。表 'XYZ02'。扫描计数 5,逻辑读取 51256,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。表 '#TEMP_TABLE______________________________________________________________________________________________000000000840'。扫描计数 0,逻辑读取 97,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。表“工作表”。扫描计数 0,逻辑读取 0,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。

(受影响的 32 行)表“#TEMP_TABLE2________________________________________________________________________________________________________000000000841”。扫描计数 0,逻辑读取 64,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。表 ''XYZ03'。扫描计数 0,逻辑读取 107,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。表“XYZ04”。扫描计数 32,逻辑读取 129,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。表 '#TEMP_TABLE________________________________________________________________________________________________________000000000840'。扫描计数 1,逻辑读取 1,

(21 行受影响)

(受影响的 21 行)表 'XYZ05'。扫描计数 0,逻辑读取 87,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。表 'XYZ01A'。扫描计数 21,逻辑读取 147,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。表 'XYZ04'。扫描计数 0,逻辑读取 84,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。表 '#TEMP_TABLE2_____________________________________________________________________________________________000000000841'。扫描计数 1,逻辑读取 1,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。

(*)

0 投票
4 回答
1054 浏览

sql - 我们在查询中使用连接的顺序会影响它的执行时间吗?

我们在查询中使用连接的顺序会影响它的执行时间吗?

0 投票
2 回答
6378 浏览

postgresql - 在阅读 PostgreSQL 查询计划时如何“思考得更好”?

今天我花了一个多小时对一个我无法理解的查询计划感到困惑。该查询是一个UPDATE,它根本不会运行。完全陷入僵局:pg_locks表明它也没有等待任何东西。现在,我不认为自己是最好或最差的查询计划阅读器,但我发现这一点异常困难。我想知道如何阅读这些内容?是否有 Pg ace 遵循的方法来查明错误?

我打算就如何解决这个问题提出另一个问题,但现在我要专门讨论如何阅读这些类型的计划

这个查询计划的问题 - 我相信我理解 - 最好的说法可能是RhodiumToad(他肯定更擅长这一点,所以我敢打赌他的解释会更好)irc://irc.freenode.net/#postgresql

哦,该计划可能是灾难性的,该计划的问题是它为每一行运行一个非常昂贵的 hashjoin 问题是来自另一个连接的 rows=1 估计,并且计划者认为可以在内部放置一个非常昂贵的查询估计外部路径仅返回一行的嵌套循环的路径。因为,显然,根据规划者的估计,昂贵的部分只会运行一次,但这在实践中很明显会搞砸,问题是规划者理想地相信自己的估计,规划者需要知道“估计”之间的区别返回 1 行”和“不可能返回超过 1 行”,但目前尚不清楚如何将其合并到现有代码中

他接着说:

它可以影响任何连接,但通常针对子查询的连接是最有可能的

现在,当我阅读这个计划时,我注意到的第一件事是Nested Loop Anti Join,这有一个成本169,413(我会坚持上限)。此反连接分解Nested Loop为成本为的结果和成本为31,738的结果。现在,,比我知道问题出在 Hash Join 的要大得多。Hash Join137,424137,42431,738

然后我继续EXPLAIN ANALYZE查询之外的 Hash Join 段。它在 7 秒内执行。我确保 (lot_id, vin) 和 (co.code, and v.code) 上有索引——有。我单独禁用seq_scanhashjoin注意到速度增加不到 2 秒。还不足以解释为什么一个小时后它没有进展。

但是,毕竟我完全错了!是的,这是查询中较慢的部分,但因为rows="1"位(我认为它在Nested Loop Anti Join)。这是计划程序错误估计行数的错误(缺乏能力)?我应该如何阅读这个来得出相同的结论RhodiumToad

仅仅rows="1"是这应该触发我弄清楚这一点吗?

我确实VACUUM FULL ANALYZE在所有涉及的表上运行,这是 Postgresql 8.4。

0 投票
4 回答
592 浏览

sql - 缓存 SQL 执行计划

我知道 SQL Server 2005 会缓存一些执行计划,但这是否足以在同一查询运行两次之间产生小时差异?第一次需要3小时下次需要1分钟?这甚至可能吗?

0 投票
1 回答
12056 浏览

sql - 查询执行计划:缺少索引

替代文字 http://img502.imageshack.us/img502/7245/75088152.jpg

我将两张表连接在一起,其中一张是临时表,我在创建表后创建了一个索引。但在上面的查询执行计划中说。

我应该考虑将所有扫描操作转换为查找操作吗?有些部分是连接和条件......

问候 bk

0 投票
3 回答
458 浏览

sql-server-2005 - SQL Server 2005 执行计划

我正在尝试对 SQL Server 2005 中运行缓慢的存储过程进行故障排除。我正在分析执行计划并看到 45% 的 SORT,但我没有使用 ORDER 子句。这是什么原因造成的。

替代文字

UPDATE SP(清理并在 OR 上进行了更改)

vwStuRaceRptng 视图

老SP

谢谢你的帮助。仅供参考,tfnParseStringIntoTable 函数基于逗号分隔的值列表返回一个表。

0 投票
2 回答
2091 浏览

sql - SQL Server 2005 中没有过程的查询计划

我们有一个带有 150-200 个存储过程的 SQL Server DB,除了一个之外,所有这些都在 sys.dm_exec_query_plan 中生成一个可查看的查询计划。根据http://msdn.microsoft.com/en-us/library/ms189747.aspx

在以下情况下,sys.dm_exec_query_plan 的返回表的 query_plan 列中没有返回 Showplan 输出:

  • 如果使用plan_handle 指定的查询计划已从计划缓存中逐出,则返回表的query_plan 列为空。例如,如果在捕获计划句柄和将其与 sys.dm_exec_query_plan 一起使用之间存在时间延迟,则可能会出现这种情况。
  • 某些 Transact-SQL 语句未缓存,例如批量操作语句或包含大小超过 8 KB 的字符串文字的语句。无法使用 sys.dm_exec_query_plan 检索此类语句的 XML 显示计划,除非批处理当前正在执行,因为它们不存在于缓存中。
  • 如果 Transact-SQL 批处理或存储过程包含对用户定义函数的调用或对动态 SQL 的调用,例如使用 EXEC(字符串),则为用户定义函数编译的 XML Showplan 不包含在返回的表中通过 sys.dm_exec_query_plan 用于批处理或存储过程。相反,您必须为与用户定义函数对应的计划句柄单独调用 sys.dm_exec_query_plan。

然后..

由于 xml 数据类型中允许的嵌套级别数的限制,sys.dm_exec_query_plan 无法返回满足或超过 128 级嵌套元素的查询计划。

我相信这些都不适用于这个程序。结果永远不会有查询计划,无论时间如何,因此 1 不适用。没有长字符串文字或批量操作,因此 2 不适用。没有用户定义的函数或动态 SQL,因此 3 不适用。而且几乎没有嵌套,所以最后一个不适用。事实上,这是一个非常简单的过程,我将其全部包含在内(更改了一些表名以保护无辜者)。请注意,参数嗅探的恶作剧是在问题发生后出现的。即使我直接在查询中使用参数,它仍然会发生。关于为什么我没有此过程的可见查询计划的任何想法?

0 投票
4 回答
355 浏览

sql-server - SQL Server 中执行计划的用途是什么?

SQL Server 中执行计划的用途是什么?这些计划什么时候可以帮助我?

0 投票
1 回答
976 浏览

oracle - 为什么 Max() 会在解释计划中创建 order by?

当我尝试做类似的事情时

我在解释计划中看到这是通过排序来执行的。现在,排序(我猜这需要一些复杂的东西O(nlogn))必须比仅扫描每一行并记住最大值(可以在 中完成O(n))要昂贵得多。

我在这里错过了什么吗?oracle 真的在执行排序还是解释计划只是使用描述“排序”来描述对 ObjectId 列中所有值的简单扫描?如果 oracle 确实执行了“真正的排序”,那么我是否有充分的理由这样做?

提前致谢!