Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2008:单个SQL语句的性能成本_Sql Server_Performance_Sql Server 2008_Sql Execution Plan - Fatal编程技术网

Sql server SQL Server 2008:单个SQL语句的性能成本

Sql server SQL Server 2008:单个SQL语句的性能成本,sql-server,performance,sql-server-2008,sql-execution-plan,Sql Server,Performance,Sql Server 2008,Sql Execution Plan,我有两个存储过程,我想比较并确定其中哪一个需要更少的资源,性能更好。第二个过程是对第一个过程的修改,它包含对第一个过程稍加修改的sql语句。我的目标是了解更改对查询成本的影响 为了做到这一点,我分别执行每个过程,并选择包括实际执行计划和分析两个执行计划。我的问题是,我不能简单地说哪个sql查询执行得更好 例如,考虑以下第一个存储过程查询的执行计划: 该计划显示查询成本相对于批处理为0%,而聚集索引查找运算符相对于查询为100%。对于第二个过程的相应查询,我有相同的编号。不幸的是,这不足以理解哪个

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

为了做到这一点,我分别执行每个过程,并选择包括实际执行计划和分析两个执行计划。我的问题是,我不能简单地说哪个sql查询执行得更好

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

该计划显示查询成本相对于批处理为0%,而聚集索引查找运算符相对于查询为100%。对于第二个过程的相应查询,我有相同的编号。不幸的是,这不足以理解哪个查询的成本最小


因此,我的问题是:是否有一种方法可以确定整个查询的成本。最好是包含查询及其特定成本的表,例如CPU成本或I/O成本。

您可以在IO上使用SET STATISTICShttp://msdn.microsoft.com/en-us/library/ms184361.aspx 并设置统计时间http://msdn.microsoft.com/en-us/library/ms190287.aspx 在运行这两个过程之前。它将显示有关时间和输入/输出的其他信息。记住,过程的结果可以被缓存,计划可以被缓存,所以在做出任何结论之前,你必须仔细地做。第一次跑步总是比下一次慢。在进行任何测试之前,应该使用DBCC DROPCLEANBUFFERS和DBCC FREEPROCCACHE清理缓存。您还应该了解聚集索引和非聚集索引、查找和扫描以及计划中显示的其他操作之间的区别。

您可以在SQL profiler中跟踪查询。在这里,您可以获得运行每个查询的CPU、IO、总时间等。

@LukLed:谢谢您的回答,我发现这些提示很有用。但是,问题仍然存在:是否有一些系统表允许您查看查询的准确成本值。@LukLed:您认为为什么使用清理的缓存计划分析查询成本是值得的?SQL Server在大多数情况下都会重复使用执行计划,不是吗?@Tim-确切的成本是可变的,因此将其放在表中是没有意义的,因此我认为最好的办法是使用此建议,或者运行数百次查询,并统计每个查询和合计所用的时间,为了比较。@Tim-此信息可通过sys.dm_exec_query_stats聚合,但我更愿意使用探查器或设置统计信息。。。在中打开或显示客户端统计信息选项SSMS@Tim-如果您的数据变化很大,则使用清理过的缓存进行分析是有意义的。这取决于哪个更可能是正常的用例,因为,如果您假设它将被缓存,而实际上不会,那么您的数字将是错误的。假设没有缓存,则情况最坏。非常好的建议+1。您知道如何在SQL事件探查器中获取有关物理读取的统计信息吗?有一个读取计数器,不幸的是它只显示逻辑读取。