当前位置: 首页 > 图文教程 > 数据库 > MSSQL > SQL SERVER的优化建议与方法

MSSQL
巧用SQL链接服务器访问远程Access数据库
SQL Server如何删除群集实例
安装SQL 2005中的AdventureWorks数据库
SQL Server 2008中有关XML的新功能
SQL Server注入大全及防御
Sql Server 2000视图中小心使用*符号
Sql Server导出指定条件的数据
SQL Server 2008的在线事务处理
介绍SQL Server 2008的四项新特性
SQL Server 2008在数据仓库方面的一些优点
触发器对SQL Server数据库进行备份
设置在Access项目中检索的记录数
SQL Server关于SQL Agent使用技巧
把sql server所有表的所有者改为dbo
IIS、SQL Server和ASP.NET安全设置解决方案
SQL Server 2005日志文件损坏怎么办?
SQL Server数据库字典SQL语句
临时表在SQL Server和MySql中创建的方法
SQL Server数据库查询优化3种技巧
SQL Server数据库开发10个问题

MSSQL 中的 SQL SERVER的优化建议与方法


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 100 ::
收藏到网摘: n/a

在实际的工作中,尤其是在生产环境里边,SQL语句的优化问题十分的重要,它对数据库的性能的提升也起着显著的作用.我们总是在抱怨机器的性能问题,总是在抱怨并发访问所带来的琐问题,但是如果我们对没一条SQL语句进行优化,尽管不能说可以解决全部问题,但是至少可以解决大部分问题.
1.Top排序问题.
我们经常要对表某个字段进行排序,然后取前N名.所以我们会写如下的SQL语句:
select top 100 * from 表
order by Score desc
  如果表非常大的话,那么这样的操作是非常消耗资源的,因为SQL SERVER要对整个表进行排序,然后取前N条记录.这样的造作是在Temdb里边进行的,所以极端的时候会报Log已满这样的错误.为了避免进行全表的排序,我们要做的仅仅是在Score上建立索引,这样因为Score索引的叶级是有序的,只要在Score所以的页级取前100个,然后根据书签查找到实际的记录,这样对DB的性能就会有极大的提升.
2.同一天问题.
我们经常要查找和一个日期同一天的记录,所以我们回写如下的SQL语句;
declare @DateTime datetime
set @DateTime=getdate()
select * from 表
where convert(char(10),F_Time,120)=convert(char(10),@DateTime,120)
  但是这样写的SQL语句带来的问题就是不能使用F_Time上的索引了.为了近可能的使用F_Time上的索引,我们可以使用时间段查询的方式来代替上边的语句.
declare @start datetime
declare @end datetime
declare @datetime datetime
set @datetime=getdate()
set @start=convert(char(10),@datetime,120) -- 一天的其始时间
set @end=dateadd(ss,-1,dateadd(d,1,@start)) -- 一天的结束时间
select *from 表 where F_Time between @start and @end
这样就解决了使用不上索引的问题.
3.利用索引进行分组操作.】  我们经常要对某一字段进行分组,而对另外一些字段进行聚合操作.如果我们对分组的字段合理的使用索引,可以加快我们分组的速度.下边以Northwind的Orders表为例:
-- orders表的EmployeeID上建有索引.
select EmployeeID,count(*)
from orders
group by EmployeeID
-- 查看执行计划,此查询利用了EmployeeID上的索引.如改成如下查询:
select EmployeeID,sum(Freight)
from orders
group by EmployeeID
-- 查看执行计划,此查询则没有使用EmployeeID上的索引.而是使用了全表扫描.那么原因是什么呢?是因为Freight没有在EmployeeID的索引上,所以通过索引不能得到结果.而如果通过书签查询的成本太高,所以SQL SERVER选择了使用全表扫描.而如果我们执行在EmployeeID和Freight上建立复合索引呢?
create index idx_EmployeeID on orders(EmployeeID,Freight)
-- 再次执行第二个查询.查看执行计划.SQL SERVER使用的我们建立的索引.只需要使用索引就可以查询到结果,极大的提高了我们的查询速度.