您的位置:首页 > 数据库

MS SQL Server查询优化方法(2)

2016-10-25 17:41 573 查看
21、用
select
top
100   /   10   Percent   来限制用户返回的行数或者
SET
ROWCOUNT来限制操作的行
22、在SQL2000以前,一般不要用如下的字句:
"IS   NULL"
,
" <> "
,
"!="
,
"!> "
,
"! <"
,
"NOT"
,
"NOT   EXISTS"
,
"NOT   IN"
,
"NOT   LIKE"
,
and
"LIKE   '%500'"
,因为他们不走索引全是表扫描。也不要在
WHere
字句中的列名加函数,如
Convert
substring
等,如果必须用函数的时候,创建计算列再创建索引来替代.还可以变通写法:
WHERE
SUBSTRING
(firstname,1,1)=
'm'
改为
WHERE
firstname
like
'm%'
(索引扫描),一定要将函数和列名分开。并且索引不能建得太多和太大。
NOT
IN
会多次扫描表,使用EXISTS、
NOT
EXISTS   ,
IN
,
LEFT
OUTER
JOIN
来替代,特别是左连接,而Exists比
IN
更快,最慢的是
NOT
操作.如果列的值含有空,以前它的索引不起作用,现在2000的优化器能够处理了。相同的是
IS
NULL
,“
NOT
","
NOT
EXISTS
","
NOT
IN
"能优化她,而” <> ”等还是不能优化,用不到索引。
23、使用Query   Analyzer,查看SQL语句的查询计划和评估分析是否是优化的SQL。一般的20%的代码占据了80%的资源,我们优化的重点是这些慢的地方。
24、如果使用了
IN
或者
OR
等时发现查询没有走索引,使用显示申明指定索引:
SELECT
*
FROM
PersonMember   (
INDEX
=   IX_Title)
WHERE
processid
IN
(‘男’,‘女’)
  
25、将需要查询的结果预先计算好放在表中,查询的时候再
SELECT
。这在SQL7.0以前是最重要的手段。例如医院的住院费计算。
26、
MIN
()和
MAX
()能使用到合适的索引
27、数据库有一个原则是代码离数据越近越好,所以优先选择
Default
,依次为Rules,Triggers,
Constraint
(约束如外健主健CheckUNIQUE……,数据类型的最大长度等等都是约束),
Procedure
.这样不仅维护工作小,编写程序质量高,并且执行的速度快。
28、如果要插入大的二进制值到Image列,使用存储过程,千万不要用内嵌
INsert
来插入(不知JAVA是否)。因为这样应用程序首先将二进制值转换成字符串(尺寸是它的两倍),服务器受到字符后又将他转换成二进制值.存储过程就没有这些动作:   方法:
Create
procedure
p_insert
as
insert
into
table
(Fimage)
values
(@image),在前台调用这个存储过程传入二进制参数,这样处理速度明显改善。  
    
29、
Between
在某些时候比
IN
速度更快,
Between
能够更快地根据索引找到范围。用查询优化器可见到差别。
select
*
from
chineseresume
where
title
in
(
'男'
,
'女'
)
Select
*
from
chineseresume
where
between
'男'
and
'女'
是一样的。由于
in
会在比较多次,所以有时会慢些。
  
30、在必要是对全局或者局部临时表创建索引,有时能够提高速度,但不是一定会这样,因为索引也耗费大量的资源。他的创建同是实际表一样。
31、不要建没有作用的事物例如产生报表时,浪费资源。只有在必要使用事物时使用它。
 
32、用
OR
的字句可以分解成多个查询,并且通过
UNION
连接多个查询。他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用
UNION
all
执行的效率更高.多个
OR
的字句没有用到索引,改写成
UNION
的形式再试图与索引匹配。一个关键的问题是否用到索引。
33、尽量少用视图,它的效率低。对视图操作比直接对表操作慢,可以用stored
procedure
来代替她。特别的是不要用视图嵌套,嵌套视图增加了寻找原始资料的难度。我们看视图的本质:它是存放在服务器上的被优化好了的已经产生了查询规划的SQL。对单个表检索数据时,不要使用指向多个表的视图,直接从表检索或者仅仅包含这个表的视图上读,否则增加了不必要的开销,查询受到干扰.为了加快视图的查询,MsSQL增加了视图索引的功能。
34、没有必要时不要用
DISTINCT
ORDER
BY
,这些动作可以改在客户端执行。它们增加了额外的开销。这同
UNION
UNION
ALL
一样的道理。
SELECT
top
20   ad.companyname,comid,position,ad.referenceid,worklocation,
convert
(
varchar
(10),ad.postDate,120)
as
postDate1,workyear,degreedescription
FROM
jobcn_query.dbo.COMPANYAD_query   ad
where
referenceID
in
(
'JCNAD00329667'
,
'JCNAD132168'
,
'JCNAD00337748'
,
'JCNAD00338345'
,
'JCNAD00333138'
,
'JCNAD00303570'
,
'JCNAD00303569'
,
'JCNAD00303568'
,
'JCNAD00306698'
,
'JCNAD00231935'
,
'JCNAD00231933'
,
'JCNAD00254567'
,
'JCNAD00254585'
,
'JCNAD00254608'
,
'JCNAD00254607'
,
'JCNAD00258524'
,
'JCNAD00332133'
,
'JCNAD00268618'
,
'JCNAD00279196'
,
'JCNAD00268613'
)
order
by
postdate
desc

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: