在SQL Server中,有许多SQL语句的提示,本文总结一些比较常用的提示。

OPTION LOOP/MERGE/HASH JOIN提示


该提示可以改变整个SQL语句中所有JOIN的关联算法,所以请慎用!

下面语句中,我们使用OPTION(MERGE JOIN)提示,将SQL语句的两个JOIN都改为了MERGE JOIN:

SELECT *
FROM
[dbo].[Student]
INNER JOIN
[dbo].[City]
ON [City].StudentID=[Student].ID
INNER JOIN
[dbo].[Car]
ON [Car].StudentID=[Student].ID
OPTION(MERGE JOIN)
/*
三种JOIN的提示用法如下:
OPTION(LOOP JOIN) 将SQL语句中的所有JOIN改为LOOP JOIN
OPTION(MERGE JOIN) 将SQL语句中的所有JOIN改为MERGE JOIN
OPTION(HASH JOIN) 将SQL语句中的所有JOIN改为HASH JOIN
*/

查看执行计划,我们可以发现SQL语句中的两个JOIN的确都变为MERGE JOIN了:

关联JOIN提示


上面我们看到了用OPTION提示,是改变整个SQL语句所有JOIN的关联算法,比较危险,其实我们还可以对SQL语句中的单个JOIN声明关联算法。

声明[Student]表和[City]表之间,采用LOOP JOIN:

SELECT *
FROM
[dbo].[Student]
INNER LOOP JOIN
[dbo].[City]
ON [City].StudentID=[Student].ID
INNER JOIN
[dbo].[Car]
ON [Car].StudentID=[Student].ID

执行计划如下,我们可以看到,[Student]表和[City]表之间是使用的LOOP JOIN:

声明[Student]表和[City]表之间,采用MERGE JOIN:

SELECT *
FROM
[dbo].[Student]
INNER MERGE JOIN
[dbo].[City]
ON [City].StudentID=[Student].ID
INNER JOIN
[dbo].[Car]
ON [Car].StudentID=[Student].ID

执行计划如下,我们可以看到,[Student]表和[City]表之间是使用的MERGE JOIN:

声明[Student]表和[City]表之间,采用HASH JOIN:

SELECT *
FROM
[dbo].[Student]
INNER HASH JOIN
[dbo].[City]
ON [City].StudentID=[Student].ID
INNER JOIN
[dbo].[Car]
ON [Car].StudentID=[Student].ID

执行计划如下,我们可以看到,[Student]表和[City]表之间是使用的HASH JOIN:

可以看到采用单个JOIN的提示要比使用OPTION提示灵活很多。

锁定提示


在SQL语句中,我们还可以在表名后声明锁的类型和锁定级别,下面查询语句中,我们就声明了在表[Student]上使用排它锁WITH(XLOCK)

SELECT *
FROM
[dbo].[Student] WITH(XLOCK)

关于锁定提示,可以查看这篇文章,这里就不做过多的介绍了。

索引提示


在SQL语句中,我们还可以在表名后声明要使用表上的哪些索引,语法是

WITH(INDEX([索引名]))

如果要使用表上的多个索引,就用逗号分隔开即可:

WITH(INDEX([索引名1]),INDEX([索引名2]),INDEX([索引名3]))

如下SQL语句就声明了,我们要使用表[Student]的索引[IX_Index]和[IX_Student_Index_Code]:

SELECT *
FROM
[dbo].[Student] WITH(INDEX([IX_Index]),INDEX([IX_Student_Index_Code]))

执行计划如下,我们可以看到,该SQL语句,现在的确是使用了索引[IX_Index]和[IX_Student_Index_Code]:

我们还可以将锁定提示和索引提示结合在一起使用,如下所示:

SELECT Stu.*
FROM
[dbo].[Student] AS Stu WITH(XLOCK,TABLOCK,INDEX([IX_Index]))

我们声明了该SQL语句对表[Student]添加排它锁(XLOCK),并且排它锁的锁定级别为表锁(TABLOCK),并且我们要使用表[Student]的[IX_Index]索引(INDEX([IX_Index]))。这几个提示结合在一起使用,之间用逗号分隔开即可。

最后提醒下,SQL Server的提示并不是什么情况下都可以使用的,有时候使用提示会带来负面效果甚至报错,查看这里了解,所以在具体选择使用SQL Server提示的时候,要根据实际情况而定,不可以胡乱使用。

最新文章

  1. [UML]UML系列——包图Package
  2. struts2配置文件的加载顺序以及 struts.xml package 的配置说明
  3. java 读取excel poi 和cell 方法
  4. 异常处理:Sys.WebForms.PageRequestManagerParserErrorException:The message……
  5. FZU 1686(重复覆盖)
  6. 带项目的一些体会以及合格的 Leader 应该具备什么特质?(转)
  7. VS2015 密钥key
  8. pycharm 远程调试代码
  9. io系列之字符流
  10. 获取CPU ID--查看CPU数量/核数
  11. prototype、proto和constructor的三角关系
  12. 设计模式-简单工厂Coding+jdk源码解析
  13. Vue.js 2.0生命周期
  14. python print 美化
  15. [转] Fragment——startActivityForResult后onActivityResult无反应之问题总结
  16. New Concept English Two 6 13
  17. Flask 通过扩展来实现登录验证
  18. JProgressBar与Timer的配套使用
  19. POJ:3273-Monthly Expense
  20. Unity3d修炼之路:游戏开发中,3d数学知识的练习【1】(不断更新.......)

热门文章

  1. idea 2019 集成activiti, idea activiti 新建bpmn文件, 解决idea activiti中文乱码
  2. pyecharts的使用
  3. 大数据技术原理与应用:【第二讲】大数据处理架构Hadoop
  4. 51nod 1594 Gcd and Phi(莫比乌斯反演)
  5. Celery详解(1)
  6. Linux操作中应该注意的问题
  7. IIS 登录失败 该登陆名来自不受信任的域,不能与windows身份认证一起使用
  8. ESA2GJK1DH1K升级篇: 升级STM32 预热: 单片机每隔一定时间 使用 http 获取天气
  9. Ajax运用与分页
  10. Java集合详解8:Java集合类细节精讲,细节决定成败