【问题标题】:SQL Server 2008: performance cost for a single sql statementSQL Server 2008:单个 sql 语句的性能成本
【发布时间】:2011-02-14 16:46:24
【问题描述】:

我有 2 个存储过程,我想对它们进行比较并确定其中哪些需要更少的资源并且性能更好。第二个过程是对第一个过程的修改,它包含对第一个过程稍有改动的 sql 语句。我的目标是了解更改对查询成本的影响。

为此,我使用“包括实际执行计划”选项分别执行每个过程,并分析两个执行计划。我的问题是我不能简单地说哪个 sql 查询性能更好。

例如考虑以下第一个存储过程的查询的执行计划:

计划显示查询成本相对于批次为 0%Clustered Index Seek 运算符相对于查询为 100%。我对第二个过程的相应查询有相同的数字不幸的是,这不足以理解哪个查询的成本最低。

因此,我的问题是:有没有办法确定整个查询的成本。最好的是带有查询及其特定成本的表,例如CPU 成本或 I/O 成本。

【问题讨论】:

    标签: sql-server performance sql-server-2008 sql-execution-plan


    【解决方案1】:

    您可以使用SET STATISTICS IO ON (http://msdn.microsoft.com/en-us/library/ms184361.aspx) 和SET STATISTICS TIME ON (http://msdn.microsoft.com/en-us/library /ms190287.aspx) 在运行这两个程序之前。它将显示有关时间和输入/输出的附加信息。请记住,程序的结果可以被缓存,计划可以被缓存,因此在做出任何结论之前,您必须谨慎行事。第一次运行总是比下一次慢。在进行任何测试之前,您应该使用DBCC DROPCLEANBUFFERSDBCC FREEPROCCACHE 清理缓存。您还应该了解聚集索引和非聚集索引之间的区别、查找和扫描以及计划中提出的其他操作。

    【讨论】:

    • @LukLed:感谢您的回答,我发现这些提示很有用。但是,问题仍然悬而未决:是否有一些系统表可以让人们看到查询的确切成本值。
    • @LukLed:在您看来,为什么值得用清理过的缓存计划来分析查询成本?执行计划大部分时间都被 SQL Server 重用,不是吗?
    • @Tim - 确切的成本是可变的,所以把它放在一个表中没有意义,所以我认为你最好的选择是使用这个建议或运行你的查询数百次并获取统计信息每次查询和汇总所需的时间,以便进行比较。
    • @Tim - 此信息可通过sys.dm_exec_query_stats 获得(汇总),但我更愿意只使用分析器或SET STATISTICS ... ON 或在SSMS 中显示客户端统计选项
    • @Tim - 如果您的数据发生了很大变化,那么使用清理过的缓存进行分析是有意义的。这取决于哪个更可能是正常用例,因为如果您假设它会被缓存,但实际上不会,那么您的数字将是错误的。通过假设没有缓存,你有一个最坏的情况。
    【解决方案2】:

    您可以在 SQL 分析器中跟踪查询。您可以在此处获得您运行的每个查询的 CPU、IO、总时间等。

    【讨论】:

    • 非常好的建议 +1。知道如何在 SQL Profiler 中获取有关物理读取的统计信息吗?有一个 READS 计数器,不幸的是它只显示逻辑读取。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多