优化SQL SERVER系统性能

原文 http://blog.csdn.net/guoxuepeng123/article/details/7849681

1、子查询的用法
子查询是一个 select 查询,它嵌套在 SELECT、INSERT、UPDATE、DELETE
语句或其它子查询中。任何允许使用表达式的地方都可以使用子查询。子查询可以使我们的编程灵活多样,可以用来实现一些特殊的功能。但是在性能上,往往一个
不合适的子查询用法会形成一个性能瓶颈。
A、NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法。比如:
select pub_name
from publishers
where pub_id not in
(select pub_id
from titles
where type = 'business')
--可以改写成:
select a.pub_name
from publishers a left join titles b
on b.type = 'business' and
a.pub_id=b. pub_id
where b.pub_id is null

select title
from titles
where not exists
(select title_id
from sales
where title_id = titles.title_id)
--可以改写成:
select title
from titles left join sales
on sales.title_id = titles.title_id
where sales.title_id is null

B、 如果保证子查询没有重复 ,IN、EXISTS的相关子查询可以用INNER JOIN 代替。比如:
select pub_name
from publishers
where pub_id in
(select pub_id
from titles
where type = 'business')
--可以改写成:
select distinct a.pub_name
from publishers a inner join titles b
on b.type = 'business' and
a.pub_id=b. pub_id

C、IN的相关子查询用EXISTS代替,比如
select pub_name
from publishers
where pub_id in
(select pub_id
from titles
where type = 'business')
--可以用下面语句代替:
select pub_name
from publishers
where exists
(select 1
from titles
where type = 'business' and
pub_id= publishers.pub_id)

D、不要用COUNT(*)的子查询判断是否存在记录,最好用LEFT JOIN或者EXISTS,比如有人写这样的语句:

select job_desc from jobs
where (select count(*) from employee where job_id=jobs.job_id)=0
--应该改成:
select jobs.job_desc from jobs left join employee 
on employee.job_id=jobs.job_id
where employee.emp_id is null

select job_desc from jobs
where (select count(*) from employee where job_id=jobs.job_id)<>0
--应该改成:
select job_desc from jobs
where exists (select 1 from employee where job_id=jobs.job_id) 

作为程序员还应该注意:
1、注意、关心各表的数据量。
2、编码过程和单元测试过程尽量用数据量较大的数据库测试,最好能用实际数据测试。
3、每个SQL语句尽量简单
4、不要频繁更新有触发器的表的数据
5、注意数据库函数的限制以及其性能

1、子查询的用法
子查询是一个 select 查询,它嵌套在 SELECT、INSERT、UPDATE、DELETE
语句或其它子查询中。任何允许使用表达式的地方都可以使用子查询。子查询可以使我们的编程灵活多样,可以用来实现一些特殊的功能。但是在性能上,往往一个
不合适的子查询用法会形成一个性能瓶颈。
A、NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法。比如:
select pub_name
from publishers
where pub_id not in
(select pub_id
from titles
where type = 'business')
--可以改写成:
select a.pub_name
from publishers a left join titles b
on b.type = 'business' and
a.pub_id=b. pub_id
where b.pub_id is null

select title
from titles
where not exists
(select title_id
from sales
where title_id = titles.title_id)
--可以改写成:
select title
from titles left join sales
on sales.title_id = titles.title_id
where sales.title_id is null

B、 如果保证子查询没有重复 ,IN、EXISTS的相关子查询可以用INNER JOIN 代替。比如:
select pub_name
from publishers
where pub_id in
(select pub_id
from titles
where type = 'business')
--可以改写成:
select distinct a.pub_name
from publishers a inner join titles b
on b.type = 'business' and
a.pub_id=b. pub_id

C、IN的相关子查询用EXISTS代替,比如
select pub_name
from publishers
where pub_id in
(select pub_id
from titles
where type = 'business')
--可以用下面语句代替:
select pub_name
from publishers
where exists
(select 1
from titles
where type = 'business' and
pub_id= publishers.pub_id)

D、不要用COUNT(*)的子查询判断是否存在记录,最好用LEFT JOIN或者EXISTS,比如有人写这样的语句:

select job_desc from jobs
where (select count(*) from employee where job_id=jobs.job_id)=0
--应该改成:
select jobs.job_desc from jobs left join employee 
on employee.job_id=jobs.job_id
where employee.emp_id is null

select job_desc from jobs
where (select count(*) from employee where job_id=jobs.job_id)<>0
--应该改成:
select job_desc from jobs
where exists (select 1 from employee where job_id=jobs.job_id) 

作为程序员还应该注意:
1、注意、关心各表的数据量。
2、编码过程和单元测试过程尽量用数据量较大的数据库测试,最好能用实际数据测试。
3、每个SQL语句尽量简单
4、不要频繁更新有触发器的表的数据
5、注意数据库函数的限制以及其性能

时间: 2024-09-19 09:07:22

优化SQL SERVER系统性能的相关文章

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

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

应用Profiler优化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索引.当考察建立什么类

优化SQL Server索引

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

优化SQL Server数据库的经验总结

优化数据库的注意事项: 1.关键字段建立索引. 2.使用存储过程,它使SQL变得更加灵活和高效. 3.备份数据库和清除垃圾数据. 4.SQL语句语法的优化.(可以用Sybase的SQL Expert,可惜我没找到unexpired的序列号) 5.清理删除日志. SQL语句优化的基本原则: 1.使用索引来更快地遍历表. 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的.在非群集索引下,数据在物理上随机存放在数据页上.合理的索引设计要建立在对各种查询的分析和预测上.一般来说:①.有大量重复值.

优化SQL Server数据库查询方法

SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用户查看,原因是读写竞争资源. 9.返回了不必要的行和列 10.查询语句不好,没有优

优化SQL Server服务器内存配置的策略

引言 农业银行总行1998年以来正式推广了新版网络版综合业务统计信息系统,该系统是基于WindowsNT4.0平台,采用客户/服务器模式,以Microsoft SQL Server为基础建立起来的大型数据库应用程序,系统界面友好.操作简便,计算.分析.检索功能非常强大,为保证农业银行系统及时进行纵向和横向业务数据采集.按照不同要求生成统计报表,进行全面业务活动分析提供了强有力的保障.但在这套程序的推广.维护中笔者发现系统有时运行速度较慢,特别是在Win95客户端操作时尤为严重,经过排除网线连接等

详细介绍优化SQL Server 2000的设置

SQL Server已经为了优化自己的性能而进行了良好的配置,比今天市场其他的关系型数据库都要好得多.然而,你仍然有几项设置需要进行修改,以便你的数据库每分钟可以处理更多的事务(TPM).本篇文章的目的就是讨论这些设置.我们忽略那些可以通过硬件配置或者表或者索引设计提高的性能,因为这些内容在本篇文章范围之外. 破碎页面检测 在我们开始讨论服务器配置开关之前,让我们快速浏览一下你的模型数据库--或者说用作构建新的数据库的基础的模板.默认情况下,你可以在数据库中创建存储过程.函数等类似的东西,随后他

优化 SQL Server 索引的小技巧_MsSql

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