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