Microsoft的优化SQL方法

本文是SQL Server SQL语句优化系列文章的第一篇。该系列文章描述了在Micosoft’s SQLServer2000关系数据库管理系统中优化SELECT语句的基本技巧,我们讨论的技巧可在Microsoft's SQL Enterprise Manager或 Microsoft SQL Query Analyzer(查询分析器)提供的Microsoft图形用户界面使用。

除调优方法外,我们给你展示了最佳实践,你可应用到你的SQL语句中以提高性能(所有的例子和语法都已在Microsoft SQL Server 2000中验证)。

阅读该系列文章后,你应该对Microsoft 工具包中提供的查询优化工具和技巧有一个基本的了解,我们将提供包含各种各样的以提高性能和加速数据读取操作的查询技巧。

Microsoft提供了三种调优查询的主要的方法: 

1、使用SET STATISTICS IO 检查查询所产生的读和写

2、使用SET STATISTICS TIME检查查询的运行时间

3、使用SET SHOWPLAN 分析查询的查询计划

SET STATISTICS IO

命令SET STATISTICS IO ON 强制SQL Server 报告执行事务时I/O的实际活动。它不能与SET NOEXEC ON 选项配对使用,因为它仅仅对监测实际执行命令的I/O活动有意义。一旦这个选项被打开,每个查询产生包括I/O统计信息的额外输出。为了关闭这个选项,执行SET STATISTICS IO OFF.

注:这些命令也能在 Sybase Adaptive Server中运行,虽然结果集可能看起来有点不同。

例如,下面是在Northwind 数据库中对于employees表上的一个行统计的简单查询脚本而获得的I/O统计信息。

SET STATISTICS IO ON
GO
SELECT COUNT(*) FROM employees
GO
SET STATISTICS IO OFF
GO
Results:
---------------
2977
Table ‘Employees’ . Scan count 1, logical read 53, physical reads 0, readahead reads 0.

这个扫描统计告诉我们扫描执行的数量,逻辑读显示的是从缓存中读出来的页面的数量,物理读显示的是从磁盘中读的页面的数量,Read-ahead 读显示了放置在缓存中用于将来读操作的页面数量。

此外,我们执行一个系统存储过程获得表大小的统计信息以供我们分析:

sp_spaceused employees
Results:
name rows reserved data index_size unused
-------------- -------- --------- ------- --------------
Employees 2977 2008KB 1504KB 448KB 56KB

通过看这些信息我们能得到些什么呢?

◆这个查询没有扫描整个表,在表中的数据量超过1.5M字节,而仅仅执行了53个逻辑I/O操作就得到了结果。这表明该查询发现了一个可用来计算结果的索引,并且扫描索引比扫描所有数据页花费更少的I/O操作。

◆索引页几乎全部放在数据缓存中,所以物理读的值是零。这是因为我们之前不久是在employees表上执行了其他查询,此时表和它的索引已经被缓存。你的查询开销可能有不同。

◆Microsoft报告没有read-ahead(预读)活动。在这种情况下,数据和索引页已经被缓存起来了。当对一个很大的表作表扫描时,read-ahead可能会半路插入进来,并且在你的查询用到它们之前缓存起所需的页。当SQL Server确定你的事务是顺序读取数据库页并且认为它能预测到你下一步将用到的页面时,Real-ahead会自动打开。实际上一个独立的SQL Server连接在你的进程之前已开始运行并为它缓存数据页。(配置和优化read-ahead 参数已超出这篇文章的讨论范围。

在这个例子中,该查询已经尽可能有效率地执行了,不必进一步优化。

时间: 2024-10-31 22:54:53

Microsoft的优化SQL方法的相关文章

MySQL中优化sql语句查询常用的30种方法

本篇文章是对MySQL中优化sql语句查询常用的30种方法进行了详细的分析介绍,需要的朋友参考下   1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以

解决SQL查询安全性及性能优化实现方法

SQL注入的原理 什么SQL注入 将SQL代码插入到应用程序的输入参数中,之后,SQL代码被传递到数据库执行.从而达到对应用程序的攻击目的. 注入原理 常见攻击方法 检测是否可以注入[检测注入点] 示例:http://192.168.0.1/temp.aspx?id=a or 1=1-- 如果上面语句可以执行说明可以实现注入,则可以   利用系统过程.系统表注入数据库 示例[给系统添加一个用户,黑客可以实现远程登录控制服务器]:http://192.168.0.1/temp.aspx?id=1;

存取被拒(Microsoft SQL-DMO ODBC SQL状态: 42000)解决方法

错误22002:RegCreateKeyEx()传回错误5,存取被拒(http://www.aliyun.com/zixun/aggregation/11208.html">Microsoft SQL-DMO ODBC SQL状态: 42000)SQL Server 2000 为了符合最低权限要求,通常会将SQL Server与SQL Agent启动账户都改为Local Windows User account,后来再去Enterprise Manager config一些组态设定却出现此

ASP.NET几种进行性能优化的方法及注意问题

asp.net|问题|性能|优化 网站的性能对于ASP.NET程序开发人员来说非常重要.一个优秀的网站虽然有美观的页面设计,完善的服务功能,但是打开网页时有长时间的延迟,用户最终将会无法忍受.尤其对于大型的电子商务网站而言,每秒钟有数万用户同时访问,没有良好的网站性能,根本无法满足庞大的需求. ASP.NET作为全新一代的动态网页生成系统,它在平台性能方面与原有的ASP相比已有了一个本质的提高.但要在此基础上开发出专业水准的.符合生产标准的.受用户欢迎的web应用程序,还需要开发人员从编程的角度

应用事件探查器优化SQL Server系统

概述 当你的SQL Server数据库系统运行缓慢的时候,你或许多多少少知道可以使用SQL Server Profiler(中文叫SQL事件探查器)工具来进行跟踪和分析.是的,Profiler可以用来捕获发送到SQL Server的所有语句以及语句的执行性能相关数据(如语句的read/writes页面数目,CPU的使用量,以及语句的duration等)以供以后分析.但本文并不介绍如何使用Profiler 工具,而是将介绍如何使用read80trace(有关该工具见后面介绍)工具结合自定义的存储过

优化SQL Server索引的小技巧

server|技巧|索引|优化  SQL Server中有几个可以让你检测.调整和优化SQL Server性能的工具.在本文中,我将说明如何用SQL Server的工具来优化数据库索引的使用,本文还涉及到有关索引的一般性知识.关于索引的常识  影响到数据库性能的最大因素就是索引.由于该问题的复杂性,我只可能简单的谈谈这个问题,不过关于这方面的问题,目前有好几本不错的书籍可供你参阅.我在这里只讨论两种SQL Server索引,即clustered索引和nonclustered索引.当考察建立什么类

应用Profiler优化SQL Server数据库系统

当你的SQL Server数据库系统运行缓慢的时候,你或许多多少少知道可以使用SQL Server Profiler(中文叫SQL事件探查器)工具来进行跟踪和分析.是的,Profiler可以用来捕获发送到SQL Server的所有语句以及语句的执行性能相关数据(如语句的read/writes页面数目,CPU的使用量,以及语句的duration等)以供以后分析.但本文并不介绍如何使用Profiler 工具,而是将介绍如何使用read80trace(有关该工具见后面介绍)工具结合自定义的存储过程来提

优化SQL Server索引

SQL Server中有几个可以让你检测.调整和优化SQL Server性能的工具.在本文中,将说明如何用SQL Server的工具来优化数据库索引的使用,本文还涉及到有关索引的一般性知识.关于索引的常识 影响到数据库性能的最大因素就是索引.由于该问题的复杂性,我只可能简单的谈谈这个问题,不过关于这方面的问题,目前有好几本不错的书籍可供你参阅.我在这里只讨论两种SQL Server索引,即clustered索引和nonclustered索引.当考察建立什么类型的索引时,你应当考虑数据类型和保存这

sql优化-求大神怎么优化sql 和存储过程呢?

问题描述 求大神怎么优化sql 和存储过程呢? 需求是这样的: 每个人学习分3个阶段,查询出来每个人这3个阶段学习的开始时间和结束时间,放到一个表里t_stage_info. 第1阶段的结束时间做为第二阶段的开始时间,第2阶段学习结束时间作为第3阶段学习开始时间. 这个表结构: t_stage_info(idbigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',person_plan_idbigint(20) NOT NULL COMMENT 'pe