了解任何给定查询的 SQL Server 性能的关键是深入了解查询计划。具体了解所使用的连接类型、获取步骤的类型(扫描与搜索)以及计划可以告诉您的限制。例如,查询计划几乎总是搞砸 SELECT 列表中的成本用户定义函数。但是,如果您了解查询计划的工作原理,您将了解 SQL Server 如何工作、中断以及如何修复它。
了解 SQL Server 服务器稳定性的关键是了解如何快速读取错误日志。不是 Windows 事件日志,而是实际的、诚实的 ERRORLOG 文本文件。
聘请优秀的 SQL Server 查询编写器的关键是要求他们以正确的语法为您编写如何在 T-SQL 中使用游标。如果他们得到正确的答案,不要雇用他们,他们使用游标太多,游标几乎总是错误的方法。
它不是无证的,但一个鲜为人知的“隐藏”功能是默认跟踪。除非有人明确禁用它,否则 SQL Server 2005 和 2008 有一个系统跟踪,默认情况下从服务器启动开始。
这对于回答“发生了什么?”非常有用。在性能问题后键入问题。同样好,它对于在发生安全事件后确定在特定时间谁在您的 SQL Server 上是非常宝贵的。
我在 Jack Corbett 的文章中了解到这一点:[1]。Jonathan M Kehayias 上周也为 PASS DBA SIG 举办了现场会议(参见此处:[2])。
以下脚本(也来自 Jack Corbett)显示了如何查看默认跟踪是否在您的 SQL Server 上运行,以及跟踪文件是什么:
Select
CAT.name as event_category,
E.name as event_name,
C.name as column_name,
Case
When FI.logical_operator = '0' Then 'AND'
Else 'OR'
End as logical_operator,
Case
When FI.comparison_operator = 0 Then '='
When FI.comparison_operator = 1 Then '<>'
When FI.comparison_operator = 2 Then '>'
When FI.comparison_operator = 3 Then '<'
When FI.comparison_operator = 4 Then '>='
When FI.comparison_operator = 5 Then '<='
When FI.comparison_operator = 6 Then 'Like'
When FI.comparison_operator = 7 Then 'Not Like'
End as comparison_operator,
FI.value as filter_value
From
sys.traces T Cross Apply
-- this function provides the details about the trace
::fn_trace_geteventinfo(T.id) EI Join
sys.trace_events E On
EI.eventid = E.trace_event_id Join
sys.trace_columns C On
EI.columnid = C.trace_column_id Join
sys.trace_categories CAT On
E.category_id = CAT.category_id Outer Apply
--outer apply is like a left join as there may not be filters
::fn_trace_getfilterinfo(T.id) FI
--Optional
Where
T.id = 1
为了回答有关调优的实际问题,而不是查看内部结构,这可以帮助您理解 SQL 为何以某些方式运行,我只能想到 1 个未记录的选项。
您需要确保您的事务日志文件中没有太多的 VLF,否则日志操作会变慢。要查看 VLF 的数量,您必须使用未记录的 DBCC LOGINFO 命令,然后采取纠正措施。Kimberly 在http://sqlskills.com/blogs/Kimberly/post/8-Steps-to-better-Transaction-Log-throughput.aspx上有一篇很棒的博客文章
除此之外,进行调音并没有真正的魔力。这一切都是为了拥有正确的设计、正确的索引策略、正确的数据库维护,并一遍又一遍地重新评估它,以确保您的要求仍然满足上述所有要求。SQL Server 没有 /faster 开关。
希望这可以帮助
有一大堆未记录的DBCC 命令,例如:
DBCC PAGE和DBCC IND 让您窥视存储引擎内部。 Paul Randal 曾在博客中介绍过他们!
SQL server internals viewer 是一个比 dbcc 更强大的工具,用于查看数据在 SQL server 中的存储方式。特别是对于管理分区,分配查看器可以让您一目了然地了解哪些数据在哪个分区上。
您可以从这里获取它:[ url 已删除... google "Internals Viewer for SQL Server" site:codeplex.com ]
我会附和 Paul Randal 的观点,即没有太多没有记录的内容。挑战在于阅读大量的文档。我在我的 SQL Server 设置清单中重述了最重要的(但不那么明显的):
http://www.brentozar.com/archive/2008/03/sql-server-2005-setup-checklist-part-1-before-the-install/
一些例子包括:
了解任何给定查询的 SQL Server 性能的关键是深入了解查询计划。具体了解所使用的连接类型、获取步骤的类型(扫描与搜索)以及计划可以告诉您的限制。例如,查询计划几乎总是搞砸 SELECT 列表中的成本用户定义函数。但是,如果您了解查询计划的工作原理,您将了解 SQL Server 如何工作、中断以及如何修复它。
了解 SQL Server 服务器稳定性的关键是了解如何快速读取错误日志。不是 Windows 事件日志,而是实际的、诚实的 ERRORLOG 文本文件。
聘请优秀的 SQL Server 查询编写器的关键是要求他们以正确的语法为您编写如何在 T-SQL 中使用游标。如果他们得到正确的答案,不要雇用他们,他们使用游标太多,游标几乎总是错误的方法。
它不是无证的,但一个鲜为人知的“隐藏”功能是默认跟踪。除非有人明确禁用它,否则 SQL Server 2005 和 2008 有一个系统跟踪,默认情况下从服务器启动开始。
这对于回答“发生了什么?”非常有用。在性能问题后键入问题。同样好,它对于在发生安全事件后确定在特定时间谁在您的 SQL Server 上是非常宝贵的。
我在 Jack Corbett 的文章中了解到这一点:[1]。Jonathan M Kehayias 上周也为 PASS DBA SIG 举办了现场会议(参见此处:[2])。
以下脚本(也来自 Jack Corbett)显示了如何查看默认跟踪是否在您的 SQL Server 上运行,以及跟踪文件是什么:
——巴里杨
(注意:我不信任超链接,所以这就是我得到的)
1:www.sqlservercentral.com/scripts/Auditing/64335/
2:sqlblog.com/blogs/jonathan_kehayias/archive/2009/05/27/pass-dba-sig-default-trace-presentation-files.aspx