提高应用程序性能之数据库篇

1、什么是查询优化器


有如下两个查询:
select * from employees where ID<1000 and FirstName ='Robert' 
select * from employees where FirstName='Robert' and  ID<1000

在上面的查询中如果ID是主键,并且是自增长列,那么谁的速度快


答案:效率是一样的,为什么?SQL SERVER中有一个“查询分析优化器”,它可以计算出where子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自动优化。
     通过执行计划可以跟踪SQL的资源消耗与执行过程,可以按快捷键:Ctrl+L。


2、索引

 
索引分为聚集索引和非聚集索引
按照一定规则排列的目录称为“聚集索引”,如字典中按“拼音进行”查,主键默认为索引
目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”,如字典中的按“偏旁部首”查询
SELECT * FROM dbo.辐证_单位基本信息WHERE 单位名称='中国纺织科学研究院


3、参数化查询

 
优点
防止SQL注入,使数据操作更安全
处理二进制或大文 本数据
充分利用执行缓存,减少SQL编译过程,提高执行效率
注:以后在开发过程中必须使用参数化查询

执行缓存



示例:

查看当前执行缓存内容:
SELECT  usecounts, objtype, p.size_in_bytes, [sql].[text] FROM sys.dm_exec_cached_plans p OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql
ORDER BY usecounts
清空执行缓存
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

4、索引视图


在具有唯一的聚集索引的视图即为索引视图
视图上创建唯一的聚集索引及非聚集索引,来提高最复杂的查询的数据访问性能
预先联接各个表并保存最终获得的数据集
可预先计算聚合并将其保存在索引中,从而在查询执行时,最小化高成本的计算
 
利用索引视图提高性能对比:

创建索引视图:
使用WITH SCHEMABINDING子句来创建一个视图
创建聚焦索引
CREATE UNIQUE CLUSTERED INDEX VDiscountInd ON 视图名称(ProductID)
视图索引限制:
1,视图必须使用With Schemabinding选项来创建;
2,在这个视图中不能使用其他视图、导出表、行集函数或自查询,也就是说只能使用表,视图所用到的基本表必须和视图属于同一个所有者;
3,视图只能链接同一个数据库中的表;
4,视图不能包含一个外部链接或自链接,也就是说在链接表时只能使用INNER JOIN并且INNER JOIN前后不能使同一个表,不能使用LEFT(RIGHT) JOIN 或者 LEFT (RIGHT) 
 5,视图不能包含UNION子句、TOP子句、ORDER BY子句、Having子句、Rollup子句、Cube子句、compute子句、Compute By子句或Distinct关键字;
6,视图不允许使用某些集合函数,如:Count(*)可以使用count_big(*)代替、avg()、max()、min()、stdev()、stdevp()、var()或varp()等;
7,视图不能使用Select * 这样的语句,也就是说视图的所有字段都必须显示指定;
8,视图不能包含Text、ntext、image类型的列;
9,如果视图包含一个Group By子句,那么他必须在Select列中包含count_big(*);
10,视图中的所有标和用户自定义的函数都必须使用两段式名来引用,即所有者.表或函数名称;
11,所有的基本表和视图都必须使用 Set Ansi_Nulls On 创建;


注:索引视图只能用于SQL  SERVER企业片或开发版中

5、表分区

 
SQL Server 2005支持在数据表和索引上进行分区。也就是说,可以将数据的逻辑管理和物理管理区分开来,数据物理上存储在不同的硬盘上。同一个表(索引)的数据按照某种机制存储在不同的物理硬盘上,划分的数据单位称为分区,多个物理硬盘上的分区成为一个逻辑上的总体。分区技术特别适合于构建大型数据表


执行计划的对比:
 

6、SQL语句优化

 
  1. 把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要
  2. 纵向、横向分割表,减少表的尺寸
  3. 根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段
  4. 如果是使用like进行查询的话,简单的使用index是不行的,但是全文索引,耗空间。 like 'a%' 使用索引 like '%a' 不使用索引用 like '%a%' 查询时,查询耗时和字段值总长度成正比,所以不能用CHAR类型,而是VARCHAR。对于字段的值很长的建全文索引
  5. 在查询Select语句中用Where字句限制返回的行数,避免表扫描,如果返回不必要的数据,浪费了服务器的I/O资源,加重了网络的负担降低性能。如果表很大,在表扫描的期间将表锁住,禁止其他的联接访问表,后果严重
  6. SQL的注释申明对执行没有任何影响
  7. 注意UNion和UNion all 的区别。UNION all好
  8. 注意使用DISTINCT,在没有必要时不要用,它同UNION一样会使查询变慢。重复的记录在查询里是没有问题的
  9. 查询时不要返回不需要的行、列;禁止使有Select * 
  10. 用select top 100 / 10 Percent 来限制用户返回的行数或者SET ROWCOUNT来限制操作的行
  11. 如果使用了IN或者OR等时发现查询没有走索引,使用显示申明指定索引: SELECT * FROM PersonMember (INDEX = IX_Title) WHERE processid IN ('男','女')
  12. 减少使用子查询及函数的嵌套
 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

china程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值