再现理想 发表于 2015-1-16 22:36:08

MSSQL教程之SQL语句的优化办法

MyISAMMysql的默认数据库,最为常用。拥有较高的插入,查询速度,但不支持事务优化|语句在SQL语句优化过程当中,我们常常会用到hint,现总结一下在SQL优化过程当中罕见OracleHINT的用法:

1./*+ALL_ROWS*/
标明对语句块选择基于开支的优化办法,并取得最好吞吐量,使资本损耗最小化.
比方:
SELECT/*+ALL+_ROWS*/EMP_NO,EMP_NAM,DAT_INFROMBSEMPMSWHEREEMP_NO=SCOTT;
2./*+FIRST_ROWS*/
标明对语句块选择基于开支的优化办法,并取得最好呼应工夫,使资本损耗最小化.
比方:
SELECT/*+FIRST_ROWS*/EMP_NO,EMP_NAM,DAT_INFROMBSEMPMSWHEREEMP_NO=SCOTT;

3./*+CHOOSE*/
标明假如数据字典中有会见表的统计信息,将基于开支的优化办法,并取得最好的吞吐量;
标明假如数据字典中没有会见表的统计信息,将基于划定规矩开支的优化办法;
比方:
SELECT/*+CHOOSE*/EMP_NO,EMP_NAM,DAT_INFROMBSEMPMSWHEREEMP_NO=SCOTT;

4./*+RULE*/
标明对语句块选择基于划定规矩的优化办法.
比方:
SELECT/*+RULE*/EMP_NO,EMP_NAM,DAT_INFROMBSEMPMSWHEREEMP_NO=SCOTT;

5./*+FULL(TABLE)*/
标明对表选择全局扫描的办法.
比方:
SELECT/*+FULL(A)*/EMP_NO,EMP_NAMFROMBSEMPMSAWHEREEMP_NO=SCOTT;

6./*+ROWID(TABLE)*/
提醒明白标明对指定表依据ROWID举行会见.
比方:
SELECT/*+ROWID(BSEMPMS)*/*FROMBSEMPMSWHEREROWID>=AAAAAAAAAAAAAA
ANDEMP_NO=SCOTT;

7./*+CLUSTER(TABLE)*/
提醒明白标明对指定表选择簇扫描的会见办法,它只对簇工具无效.
比方:
SELECT/*+CLUSTER*/BSEMPMS.EMP_NO,DPT_NOFROMBSEMPMS,BSDPTMS
WHEREDPT_NO=TEC304ANDBSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

8./*+INDEX(TABLEINDEX_NAME)*/
标明对表选择索引的扫描办法.
比方:
SELECT/*+INDEX(BSEMPMSSEX_INDEX)USESEX_INDEXBECAUSETHEREAREFEWMALEBSEMPMS*/FROMBSEMPMSWHERESEX=M;

9./*+INDEX_ASC(TABLEINDEX_NAME)*/
标明对表选择索引升序的扫描办法.
比方:
SELECT/*+INDEX_ASC(BSEMPMSPK_BSEMPMS)*/FROMBSEMPMSWHEREDPT_NO=SCOTT;

10./*+INDEX_COMBINE*/
为指定表选择位图会见路经,假如INDEX_COMBINE中没有供应作为参数的索引,将选择出位图索引的布尔组合体例.
比方:
SELECT/*+INDEX_COMBINE(BSEMPMSSAL_BMIHIREDATE_BMI)*/*FROMBSEMPMS
WHERESAL<5000000ANDHIREDATE<SYSDATE;

11./*+INDEX_JOIN(TABLEINDEX_NAME)*/
提醒明白命令优化器利用索引作为会见路径.
比方:
SELECT/*+INDEX_JOIN(BSEMPMSSAL_HMIHIREDATE_BMI)*/SAL,HIREDATE
FROMBSEMPMSWHERESAL<60000;

12./*+INDEX_DESC(TABLEINDEX_NAME)*/
标明对表选择索引降序的扫描办法.
比方:
SELECT/*+INDEX_DESC(BSEMPMSPK_BSEMPMS)*/FROMBSEMPMSWHEREDPT_NO=SCOTT;

13./*+INDEX_FFS(TABLEINDEX_NAME)*/
对指定的表实行疾速全索引扫描,而不是全表扫描的举措.
比方:
SELECT/*+INDEX_FFS(BSEMPMSIN_EMPNAM)*/*FROMBSEMPMSWHEREDPT_NO=TEC305;

14./*+ADD_EQUALTABLEINDEX_NAM1,INDEX_NAM2,...*/
提醒明白举行实行计划的选择,将几个单列索引的扫描合起来.
比方:
SELECT/*+INDEX_FFS(BSEMPMSIN_DPTNO,IN_EMPNO,IN_SEX)*/*FROMBSEMPMSWHEREEMP_NO=SCOTTANDDPT_NO=TDC306;

15./*+USE_CONCAT*/
对查询中的WHERE前面的OR前提举行转换为UNIONALL的组合查询.
比方:
SELECT/*+USE_CONCAT*/*FROMBSEMPMSWHEREDPT_NO=TDC506ANDSEX=M;

16./*+NO_EXPAND*/
关于WHERE前面的OR大概IN-LIST的查询语句,NO_EXPAND将制止其基于优化器对其举行扩大.
比方:
SELECT/*+NO_EXPAND*/*FROMBSEMPMSWHEREDPT_NO=TDC506ANDSEX=M;

17./*+NOWRITE*/
克制对查询块的查询重写操纵.

18./*+REWRITE*/
能够将视图作为参数.

19./*+MERGE(TABLE)*/
可以对视图的各个查询举行响应的兼并.
比方:
SELECT/*+MERGE(V)*/A.EMP_NO,A.EMP_NAM,B.DPT_NOFROMBSEMPMSA(SELETDPT_NO
,AVG(SAL)ASAVG_SALFROMBSEMPMSBGROUPBYDPT_NO)VWHEREA.DPT_NO=V.DPT_NO
ANDA.SAL>V.AVG_SAL;

20./*+NO_MERGE(TABLE)*/
关于有可兼并的视图不再兼并.
比方:
SELECT/*+NO_MERGE(V)*/A.EMP_NO,A.EMP_NAM,B.DPT_NOFROMBSEMPMSA(SELECTDPT_NO,AVG(SAL)ASAVG_SALFROMBSEMPMSBGROUPBYDPT_NO)VWHEREA.DPT_NO=V.DPT_NOANDA.SAL>V.AVG_SAL;

21./*+ORDERED*/
依据表呈现在FROM中的按次,ORDERED使ORACLE依此按次对其毗连.
比方:
SELECT/*+ORDERED*/A.COL1,B.COL2,C.COL3FROMTABLE1A,TABLE2B,TABLE3CWHEREA.COL1=B.COL1ANDB.COL1=C.COL1;

22./*+USE_NL(TABLE)*/
将指定表与嵌套的毗连的行源举行毗连,并把指定表作为外部表.
比方:
SELECT/*+ORDEREDUSE_NL(BSEMPMS)*/BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAMFROMBSEMPMS,BSDPTMSWHEREBSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

23./*+USE_MERGE(TABLE)*/
将指定的表与其他行源经由过程兼并排序毗连体例毗连起来.
比方:
SELECT/*+USE_MERGE(BSEMPMS,BSDPTMS)*/*FROMBSEMPMS,BSDPTMSWHEREBSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

24./*+USE_HASH(TABLE)*/
将指定的表与其他行源经由过程哈希毗连体例毗连起来.
比方:
SELECT/*+USE_HASH(BSEMPMS,BSDPTMS)*/*FROMBSEMPMS,BSDPTMSWHEREBSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

25./*+DRIVING_SITE(TABLE)*/
强迫与ORACLE所选择的地位分歧的表举行查询实行.
比方:
SELECT/*+DRIVING_SITE(DEPT)*/*FROMBSEMPMS,DEPT@BSDPTMSWHEREBSEMPMS.DPT_NO=DEPT.DPT_NO;

26./*+LEADING(TABLE)*/
将指定的表作为毗连序次中的首表.

27./*+CACHE(TABLE)*/
当举行全表扫描时,CACHE提醒可以将表的检索块安排在缓冲区缓存中比来起码列表LRU的比来利用端
比方:
SELECT/*+FULL(BSEMPMS)CAHE(BSEMPMS)*/EMP_NAMFROMBSEMPMS;

28./*+NOCACHE(TABLE)*/
当举行全表扫描时,CACHE提醒可以将表的检索块安排在缓冲区缓存中比来起码列表LRU的比来利用端
比方:
SELECT/*+FULL(BSEMPMS)NOCAHE(BSEMPMS)*/EMP_NAMFROMBSEMPMS;

29./*+APPEND*/
间接拔出到表的最初,能够进步速率.
insert/*+append*/intotest1select*fromtest4;

30./*+NOAPPEND*/
经由过程在拔出语句保存期内中断并行形式来启动惯例拔出.
insert/*+noappend*/intotest1select*fromtest4;
提供多语言支持,常见的编码如中文的GB2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名。

若天明 发表于 2015-1-25 17:10:08

是要和操作系统进行Socket通讯的场景。否则建议慎重!

小女巫 发表于 2015-2-3 11:58:08

原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!

活着的死人 发表于 2015-2-8 20:42:33

groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。

谁可相欹 发表于 2015-2-26 08:56:01

多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油

第二个灵魂 发表于 2015-3-8 13:08:43

SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。)

深爱那片海 发表于 2015-3-15 23:09:54

记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。

若相依 发表于 2015-3-22 18:08:19

语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!
页: [1]
查看完整版本: MSSQL教程之SQL语句的优化办法