MSSQL2012中SQL调优(SQL TUNING)时CBO支持和常用的hints

虽然当前各关系库CBO都已经非常先进和智能,但因为关系库理论和实现上的限制,CBO在特殊场景下也会给出次优甚至存在严重性能问题的执行计划,而这些场景中,有一部分只能或适合通过关系库提供的hints来进行干涉和解决。目前,所有三个商业数据库都提供了一定数目的hints,虽然具体使用语法或形式有所差别,但本质都是一样的,那就是指示数据库CBO给出更合理、更高效的执行计划选择。MSSQL作为商业库之一,hints功能当然不会少,下面,对MSSQL中支持和常用的hints做简单介绍。

1.{HASH | ORDER} GROUP

1)语法:select ... from ... option({HASH | ORDER} GROUP);

2)用途:对行源数据进行group by或distinct操作时,指示CBO选择HASH或ORDER物理操作。这些物理操作分别和Oracle中的集合操作hash group by和hash unique或sort group by和sort unqiue相对应。

2.{MERGE | HAHASH | CONCATAT} UNION

1)语法:select ... from ... option({MERGE | HAHASH | CONCATAT} UNION);

2)用途:对行源数据进行union操作时,指示CBO选择MERGE、HASH或CONCAT三种物理操作之一来实现。这些物理操作分别和Oracle中的集合合并操作union all或concatenation相对应。

3.FORCE ORDER

1)语法:select .... from ... option(FORCE ORDER);

2)用途:对多个表进行连接操作时,指示CBO选择表间连接的顺序。该hint与Oracle中的leading或ordered等hints相对应。

4.{LOOP | MERGE | HASH} JOIN

1)语法:select ... from ... option({LOOP | MERGE | HASH} JOIN);

2)用途:对多个表进行连接操作时,指示CBO选择表间连接的连接方法。该hint与Oracle中的use_nl,use_hash和use_merge等hints相对应。

5.INDEX=<indexname> | <indexid>

1)语法:select ... from ... option(INDEX=<indexname> | <indexid>);

2)用途:对数据进行访问时,指示CBO选择特定索引对数据进行访问。该hint与Oracle中的use_index hint相对应。

6.FORCESEEK

1)语法:select ... from ... option(FORCESEEK);

2)用途:通过索引对数据进行访问时,指示CBO选择通过SEEK方式访问索引,而不是SCAN。

7.FAST <number_rows>

1)语法:select ... from ... option(FAST <number_rows>);

2)用途:CBO编译SQL语句时,指示CBO选择适合返回指定行数的最优执行计划。该hint与Oracle中的firstrows(n) hint相对应。

8.MAXDOP <N>

1)语法:select ... from ... option(MAXDOP <N>);

2)用途:CBO编译SQL语句时,指示CBO生成执行计划的并行度。该hint与Oracle中的parallel hint相对应。

9.OPTIMIZE FOR

1)语法:select ... from ... option(OPTIMIZE FOR);

2)用途:CBO编译SQL语句时,向CBO传入SQL语句中相应变量的值,以便CBO根据该传入的具体值为SQL语句生成最优的执行计划。

10.PARAMETEETERIZATATION {SIMPLE | FORCED}

1)语法:select ... from ... option(PARAMETEETERIZATATION {SIMPLE | FORCED});

2)用途:CBO编译SQL语句时,该hint将相关SQL文本中相关值替换为变量,以减少系统中SQL硬解析的次数,这有点类似Oracle中的绑定变量及cursor_sharing参数的作用。

11.NOEXPAND

1)语法:select ... from ... option(NOEXPAND);

2)用途:CBO编译SQL语句时,指示CBO不展开视图并使用已有索引视图。

12.USE PLAN

1)语法:select ... from ... option(USE PLAN);

2)用途:CBO编译SQL语句时,指示CBO为SQL语句生成该hint中指定的执行计划。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

sql注入

反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o