Pab*_*ruz 0 monitoring sql-server audit
有没有办法记录在某个服务器上执行的所有 Microsoft SQL Server 查询及其各自的持续时间?
我希望能够像PGBADGER为 PostgreSQL所做的那样,分析所有查询。当我们在做的时候:你知道任何这样的工具吗?
小智 6
你的实际目标是什么?您是想追踪一个麻烦的查询,调整整个环境的性能,还是只是出于好奇?
最终,我不建议尝试跟踪和记录所有查询。我怀疑您只真正关心性能不佳的查询,这些查询会对实际业务产生影响。
在大多数生产服务器上,您将拥有更多的查询,这些查询要么运行得足够快,即使 10-20% 的性能提升也几乎无法察觉,要么已经优化得足够好,以至于任何性能调优都浪费了您的时间。
因此,我建议您将性能调优定位到实际需要的查询上。
无论如何,您有几个选择:
如果您运行的是 SQL 2016 或更高版本,查询存储是我的首选方法。它的开销非常低,并提供了一些巧妙的方法来跟踪查询性能随时间的推移。联机丛书对使用它的好文章在这里。请注意,它需要为每个数据库启用,并且只有在启用后才会捕获信息。
sys.dm_exec_query_stats存储有关查询执行的聚合(按查询计划)统计信息。这对于了解哪些查询消耗了服务器上最多资源的高级视图非常有用。您不会获得单独的执行统计信息(除非它只运行一次),因此它并不真正适合识别具有正常行为的查询的“一次性”性能问题。
它不包括语句文本,但您可以使用 sys.dm_exec_sql_text DMF 获得它。举个例子:
select top 100
qt.text
, qs.execution_count
, qs.total_worker_time
, qs.total_physical_reads
, qs.total_logical_reads
, qs.total_physical_writes
, qs.total_logical_writes
, qs.creation_time
, qs.last_execution_time
from
sys.dm_exec_query_stats as qs
cross apply
sys.dm_exec_sql_text(qs.sql_handle) as qt
order by
total_worker_time desc
Run Code Online (Sandbox Code Playgroud)
如果您真的准备捕获每个查询,那么最好的选择是使用 XE。了解如果您沿着这条路线走下去将会有显着的性能开销(特别是如果您正在捕获诸如调用堆栈之类的东西,或者做一些疯狂的事情,例如通过带有谓词的 sql 文本进行过滤),这不是我建议做的事情以任何方式。
如果你设置了这样的东西,我建议你要非常小心,不要让它在没有监控其影响的情况下运行。
| 归档时间: |
|
| 查看次数: |
1169 次 |
| 最近记录: |