加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 电商 > 正文

SQL SERVER中一些常识趣能题目的总结

发布时间:2018-09-01 17:38:36 所属栏目:电商 来源:站长网
导读:1.对查询举办优化,应只管停止全表扫描,起首应思量在 where 及 order by 涉及的列上成立索引。 2.应只管停止在 where 子句中对字段举办 null 值判定,不然将导致引擎放弃行使索引而举办全表扫描,如: select id from t where num is null 可以在num上设

1.对查询举办优化,应只管停止全表扫描,起首应思量在 where 及 order by 涉及的列上成立索引。

2.应只管停止在 where 子句中对字段举办 null 值判定,不然将导致引擎放弃行使索引而举办全表扫描,如:
select id from t where num is null
可以在num上配置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0

3.应只管停止在 where 子句中行使!=或<>操纵符,不然将引擎放弃行使索引而举办全表扫描。

4.应只管停止在 where 子句中行使 or 来毗连前提,不然将导致引擎放弃行使索引而举办全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20

5.in 和 not in 也要慎用,不然会导致全表扫描,如:
select id from t where num in(1,2,3)
对付持续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3

6.下面的查询也将导致全表扫描:
select id from t where name like '%abc%'
若要进步服从,可以思量全文检索。

7.假如在 where 子句中行使参数,也会导致全表扫描。由于SQL只有在运行时才会理会局部变量,但优化措施不能将会见打算的选择推迟到运行时;它必需在编译时举办选择。然而,假如在编译时成立会见打算,变量的置魅照旧未知的,因而无法作为索引选择的输入项。如下面语句将举办全表扫描:
select id from t where num=@num
可以改为逼迫查询行使索引:
select id from t with(index(索引名)) where num=@num

8.应只管停止在 where 子句中对字段举办表达式操纵,这将导致引擎放弃行使索引而举办全表扫描。如:
select id from t where num/2=100
应改为:
select id from t where num=100*2

9.应只管停止在where子句中对字段举办函数操纵,这将导致引擎放弃行使索引而举办全表扫描。如:
select id from t where substring(name,1,3)='abc'--name以abc开头的id
select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’天生的id
应改为:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'

10.不要在 where 子句中的“=”左边举办函数、算术运算或其他表达式运算,不然体系将也许无法正确行使索引。

11.在行使索引字段作为前提时,假如该索引是复合索引,那么必需行使到该索引中的第一个字段作为前提时才气担保体系行使该索引,不然该索引将不会被行使,而且应尽也许的让字段次序与索引次序相同等。

12.不要写一些没故意义的查询,如必要天生一个空表布局:
select col1,col2 into #t from t where 1=0
这类代码不会返回任何功效集,可是会耗损体系资源的,应改成这样:
create table #t(...)

13.许多时辰用 exists 取代 in 是一个好的选择:
select num from a where num in(select num from b)
用下面的语句替代:
select num from a where exists(select 1 from b where num=a.num)

14.并不是全部索引对查询都有用,SQL是按照表中数据来举办查询优化的,当索引列有大量数据一再时,SQL查询也许不会去操作索引,如一表中有字段sex,male、female险些各一半,那么纵然在sex上建了索引也对查询服从起不了浸染。

15.索引并不是越多越好,索引当然可以进步响应的 select 的服从,但同时也低落了 insert 及 update 的服从,由于 insert 或 update 时有也许会重建索引,以是奈何建索引必要稳重思量,视详细环境而定。一个表的索引数最好不要高出6个,若太多则应思量一些不常行使到的列上建的索引是否有须要。

16.应尽也许的停止更新 clustered 索引数据列,由于 clustered 索引数据列的次序就是表记录的物理存储次序,一旦该列值改变将导致整个表记录的次序的调解,会淹灭相等大的资源。若应用体系必要频仍更新 clustered 索引数据列,那么必要思量是否应将该索引建为 clustered 索引。

17.只管行使数字型字段,若只含数值信息的字段只管不要计划为字符型,这会低落查询和毗连的机能,并会增进存储开销。这是由于引擎在处理赏罚查询和毗连时会逐个较量字符串中每一个字符,而对付数字型而言只必要较量一次就够了。

18.尽也许的行使 varchar/nvarchar 取代 char/nchar ,由于起首变长字段存储空间小,可以节减存储空间,其次对付查询来说,在一个相对较小的字段内搜刮服从显然要高些。

19.任那里所都不要行使 select * from t ,用详细的字段列表取代“*”,不要返回用不到的任何字段。

20.只管行使表变量来取代姑且表。假如表变量包括大量数据,请留意索引很是有限(只有主键索引)。

21.停止频仍建设和删除姑且表,以镌汰体系表资源的耗损。

22.姑且表并不是不行行使,适内地行使它们可以使某些例程更有用,譬喻,当必要一再引用大型表或常用表中的某个数据集时。可是,对付一次性变乱,最好行使导出表。

23.在新建姑且表时,假如一次性插入数据量很大,那么可以行使 select into 取代 create table,停止造成大量 log ,以进步速率;假如数据量不大,为了和缓体系表的资源,应先create table,然后insert。

24.假如行使到了姑且表,在存储进程的最后务必将全部的姑且表显式删除,先 truncate table ,然后 drop table ,这样可以停止体系表的较长时刻锁定。

25.只管停止行使游标,由于游标的服从较差,假如游标操纵的数据高出1万行,那么就应该思量改写。

26.行使基于游标的要领或姑且表要领之前,应先探求基于集的办理方案来办理题目,基于集的要领凡是更有用。

27.与姑且表一样,游标并不是不行行使。对小型数据集行使 FAST_FORWARD 游标凡是要优于其他逐行处理赏罚要领,尤其是在必需引用几个表才气得到所需的数据时。在功效齐集包罗“合计”的例程凡是要比行使游标执行的速率快。假如开拓时刻应承,基于游标的要领和基于集的要领都可以实行一下,看哪一种要领的结果更好。

28.在全部的存储进程和触发器的开始处配置 SET NOCOUNT ON ,在竣事时配置 SET NOCOUNT OFF 。无需在执行存储进程和触发器的每个语句后向客户端发送 DONE_IN_PROC 动静。

29.只管停止大事宜操纵,进步体系并发手段。

30.只管停止向客户端返回大数据量,若数据量过大,应该思量响应需求是否公道。

详细的SQL语句在许多环境下必要团结现实的应用环境来写,这里不作论述。

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读