我现在正在使用 Postgres 8.4。性能已开始成为一个问题,因为我们的表的规模和我们在复杂的查询已经长大,所以我开始寻找到一些性能调优,但我不是一个专家在所有的这些东西。
我注意到手册多次提到提高性能的好方法是为查询计划器使用更好的成本常量,但它也说没有简单的方法来确定要使用的成本常量。
我认为常量现在可能有问题,因为估计成本似乎不是实际执行时间的稳定倍数 - 即使在最近运行 VACUUM ANALYZE 之后,它也会从 30 倍到大约 600 倍变化。(我不知道这是否是检查常量是否设置良好的有效方法,如果我错了,请纠正我)
所以,我想为查询规划器设置更好的常量。我该怎么做?我应该随机上下调整直到看起来更快,还是我应该做一些更正式的事情?是否有任何基于硬件或其他方面的指导方针?
顺便说一句,如果答案是“别担心,首先要改进其他事情会更重要”,那很好 - 对于我的实际案例,我会处理其他事情。但对于其他人的缘故,它仍然是好知道怎么一会提高常量,如果一切已经得到了改善。
我正在尝试(以图形方式)查看计划缓存中的大型查询计划,但遇到了 XML 在查询结果中被截断的问题。这是我正在使用的查询:
SELECT TOP 1
size_in_bytes,
query_plan
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp
ORDER BY size_in_bytes DESC
Run Code Online (Sandbox Code Playgroud)
我已经在 SSMS 中尝试过,当我点击结果网格中的 XML 时,我得到Unable to show XML. Unexpected end of file when parsing Name has occurred. Line 1, position 2097154.如果我复制并粘贴 XML,它确实被截断了。
我试过手动使用SET TEXTSIZE 2147483647只是因为,并没有做任何事情。(我知道这是 SQL Native Client 提供程序的默认值,只是试图强制解决这个问题)。
我试过SQLCMD从 .sql 文件运行语句并输出到文本文件,但这给我的更少。
我尝试以SQLCMD交互方式使用,:XML ON并收到此错误:
<?MSSQLError HResult="0x80004005" Source="Microsoft XML Extensions to SQL Server" Description="No description provided"?>
Run Code Online (Sandbox Code Playgroud)
该计划是 157 MB。
有什么办法可以把完整的计划拿出来让我看到吗?
我有一个大约需要 3-5 秒的存储过程,我试图理解它,所以我想要一个执行计划。当我在启用了执行计划的 SQL Server Management Studio 中运行它时,它需要超过 15 分钟,然后,我得到一个显示“执行计划”的选项卡,但该选项卡是空的。任何进一步尝试运行任何 SQL(甚至select * from foo)都不再有效。我有一个损坏的 SQL 服务器管理工作室应用程序,我必须将其关闭并重试。我已经做了 3 次,浪费了 45 分钟,现在我准备学习一些替代方案。
首先,是否有一种可靠的命令行方式可以SQLPLAN为特定的 sql 脚本生成文件,可能是从命令行,然后我可以使用 SSMS 以外的其他工具进行调查来生成我的计划。
其次,如果没有内置可靠的命令行方式来生成 SQL 执行计划并将其存储为文本或 XML,那么我想知道是否存在其他一些可以做得很好的第三方工具在非常大的 SQLPlans 上,特别是当它的 GUI 绘图部分不堪重负时不会窒息和死亡。
当 SSMS 不会生成并向您显示执行计划时,您会怎么做?我使用的是 SQL 2008 R2 Standard 及其包含的 SSMS 版本,我没有任何额外的插件。
更新我正在调用一个存储过程,它创建一个游标,它执行子查询,并在循环中做大坏事,生成超过 10K 个单独的子查询语句。看起来我真的需要重构它以减少输出风暴。
Update2它确实看起来像服务器端跟踪(将问题区域归零),然后返回到分析,然后可能需要返回到查询计划。我在大图中放大得太深了,我需要把它放大一点。
我想知道关于stackoverflow的问题的答案中提供的解决方案的相对性能,我决定运行一些测试。
在给定一组优先级递减的条件的情况下,OP 希望获得第一个匹配行。两种解决方案都涉及一个伪列,但一个(我的)涉及将多个SELECT语句UNION ALL组合在一起,而另一个则构造了一个CASE表达式。
我分享我的结果,希望有人会发现这很有用。
postgresql performance index execution-plan query-performance
请让我解释一下我的问题和情况:
我有一个 Web 应用程序 - MVC3、MSSQL Server 2005、LinqToSQL。它一直运行良好,直到一个晴朗的早晨,我将很多行推送到一个经常使用的表中,从那时起我就遇到了查询超时。为了解决这个问题,我运行了 Database Tuning Advisor 并添加了一些索引和统计信息。我还创建了一个维护计划来每天重建索引。这些添加后,应用程序一直表现不稳定;它会快速工作几个小时,然后它会再次开始超时。接下来,生活迫使我清理表格,现在其中的行数比以前更少,但超时仍在发生。所以,我删除了我创建的所有索引,现在网站更加稳定,但有时我仍然会看到一些超时。
我一直在试图弄清楚如何修复这些查询,当我对其进行分析并将查询直接粘贴到 SQL Management Studio 时,它会在 1 秒内返回结果,但是当我从我的应用程序运行此查询时,大约需要 25 秒. 然后在它第一次运行后,下次它会像在服务器上一样快!
我开始做一些研究,看起来当我使用所有这些索引时,我的查询计划搞砸了,现在它们正在产生问题。
我的问题是:
是否可以使用 T-SQL 判断查询上次访问统计信息的时间?我试图确定查询中涉及哪些统计信息,我知道我可以检查可视化查询计划,但我想知道是否有一个表(或多个表)包含这些信息。
有一个通宵工作运行很长时间。我已经使用探查器来获取跟踪并确定了一个占用大部分执行时间的语句(在存储过程中)。现在我需要查看语句的执行计划,这样我才能知道我能做什么。但是我无法重新运行查询,因为它使用了在 proc 中创建的临时表。并且proc的逻辑相当复杂并且很难重现(涉及从文件系统获取数据以及通过链接服务器与Oracle数据库交换数据)。我并不是说复制是不可能的,而是相当耗时。那么有没有办法可以查看 proc 或语句的执行计划?
计划输出,例如
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR( '' ,NULL,'ALLSTATS LAST'));
Run Code Online (Sandbox Code Playgroud)
有列 OMem 和 1Mem。它们的含义是什么?我找不到任何关于它们的参考或文档,只有这个网页,声称(或询问):
OMem:- 估计的最佳内存 (PGA) 大小,以在内存中执行操作。
1Mem:- 单次传递到磁盘时执行操作的估计大小?
我有一个 PostgreSQL 表,其中有两列名为col1and col2,都是整数类型(表中有大约 10M 行)。我想执行 SQL 查询,例如:
SELECT * FROM table WHERE col1 >= val1 AND col2 <= val2;
Run Code Online (Sandbox Code Playgroud)
(对某些val1和val2我知道的查询时间)。
如果我将 btree 索引放在上面col1并且col2PostgreSQL 尝试执行查询,在两列之一上执行索引扫描,然后在另一列上进行过滤。这意味着在大多数情况下,它必须扫过大约一半的表,即使匹配的行数很少。添加多列索引是没有用的,因为只有当两列中的至少一列经过相等性测试时,PostgreSQL 才能有效地使用它。
不过,我可以对这些值做出的一个重要假设是,这两列相对于另一列是单调的。这意味着如果在一行col1中大于或等于col1另一行中的两个,则两个对应col2条目之间的相同关系是有效的。
这意味着原则上可以通过对两列之一执行索引扫描、过滤另一列并在第二列上发现不匹配的值时立即停止执行来加快查询执行速度。在这种情况下,查询将准确读取要返回的行。
有什么方法可以在 PostgreSQL 中设置索引或任何其他不变量,以便查询规划器能够检测到这一点?
(当然,问题可以通过执行两个查询轻松解决,第一个将不等式col2转换为不等式 on col1;我问是否有办法避免这种解决方法并让 PostgreSQL 自己管理混乱)
微软关于Trace Flag 4199的知识库文章有点混乱:
...任何可能影响查询执行计划的修补程序都必须由跟踪标志控制。除了对可能导致错误结果或损坏的错误的修复外,这些修补程序默认情况下处于关闭状态,并且需要跟踪标志才能启用修复。
注意:我假设“修补程序”是累积更新(又名“CU”)。如果我错了,请发表评论。
所以...让我们假设我正在运行最新的 Service Pack。SP 包括以前 CU 中的所有修复。是否为 SP(甚至RTM)打开了修补程序?还是仍需要跟踪标志 4199?
execution-plan ×10
sql-server ×4
performance ×3
postgresql ×3
index ×2
linq ×1
optimization ×1
oracle ×1
ssms ×1
statistics ×1