SQL Server的常用提示
在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提示的时候,要根据实际情况而定,不可以胡乱使用。
SQL Server的常用提示的更多相关文章
- 安装 SQL Server 2008 时提示需要删除 SQL Server 2005 Express 工具
已安装 SQL Server 2005,安装 SQL Server 2008 时提示需要删除 SQL Server 2005 Express 工具 错误提示:已安装 SQL Server 2005 E ...
- SQL Server 2000:提示“未与信任SQL SERVER连接相关连”错误
在使用“用户模式”登陆SQL Server 2000时提示“未与信任SQL SERVER连接相关连”错误,因为在安装SQL Server时选择“仅Windows”模式,所以所有用户都不可以登陆. 解决 ...
- SQL Server中常用的SQL语句(转):
SQL Server中常用的SQL语句 转自:http://www.cnblogs.com/rainman/archive/2013/05/04/3060428.html 1.概述 名词 笛卡尔积.主 ...
- 安装SQL Server时,提示VS Shell 安装失败,退出代码为 1638。
在安装SQL Server时,提示“安装 Microsoft Visual C++ 2015 Redistributable 时出错VS Shell 安装失败,退出代码为 1638”. 原因:是由于你 ...
- SQL Server 2008 R2提示评估期已过
解决SQL Server 2008 r2提示评估期已过 1.注册表把 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\Co ...
- 处理SQL Server 异常常用步骤
处理SQL Server 异常常用步骤 SQL Server常见的问题主要是SQL问题造成,常见的主要是CPU过高和阻塞. 一.CPU过高的问题 1.查询系统动态视图查询执行时间长的sql语句 WIT ...
- (4.6)sql server索引缺失提示
SQLSERVER如何查看索引缺失 sql server索引缺失提示 当大家发现数据库查询性能很慢的时候,大家都会想到加索引来优化数据库查询性能, 但是面对一个复杂的SQL语句,找到一个优化的索引组合 ...
- 【随记】安装SQL Server 2008 R2 提示创建usersettings/microsoft.sqlserver.configuration.landingpage.properties.se
在安装SQL Server 2008 R2 提示创建usersettings/microsoft.sqlserver.configuration.landingpage.properties.se.. ...
- SQL SERVER 中的提示
提示是指定的强制选项或策略,由 SQL Server 查询处理器针对 SELECT.INSERT.UPDATE 或 DELETE 语句执行. 提示将覆盖查询优化器可能为查询选择的任何执行计划. 注意: ...
随机推荐
- 小程序和Vue利用swiper实现icons分页显示--动态计算
这里发现小程序实现步骤,Vue与之类似 先上效果图: <view class="icons"> <swiper indicator-dots="true ...
- centos 用户名密码忘记了怎么办?
进入互动式命令行 打开虚拟机,进入模式选择界面,即有两个模式的主界面,然后在时间结束前按e, 进入编辑选项菜单 按↓键定位到类似 linux16 /vmlinuz-3.10.0-123.el7.x86 ...
- matlab-画地形图
1.画三维图 之前画曲面的三维图,运用z=x2+y2 算出z和Z,如果是给出数据的地形则没办法用公式算,为此,引入插值自动造出地形的坐标. 拟合和插值的区别:插值是必须要过点,曲线可以不光滑:拟合则是 ...
- Mybatis「MySQL-Oracle」 中主键自动生成 <selectKey> 序列化
有时候我们不仅仅是通过返回 int 影响行数来确定数据是否插入成功就行了,因为我们总是会用到这个刚刚插入的自增主键,比如主子表入库,子表需要主表的 id,那这个时候我们再去数据库查就显得有点 low ...
- 云服务器使用: 为域名申请SSl证书
注:咱们平时访问网站 有的是http 有的是 https https就是说使用了SSL访问 然后就是等着..... 假设可以了 然后就会有各个软件使用的证书,然后根据自己安装的软件下载证书
- Vim Python3环境打造
Vim Python3环境打造 tags: Vim Python3 参考网址:Vim与Python真乃天作之合:打造强大的Python开发环境 分割布局 sv 纵向分割 vs 横向分割 ctrl+W ...
- 对最长公共子序列(LCS)等一系列DP问题的研究
LIS问题: 设\(f[i]\)为以\(a[i]\)结尾的最长上升子序列长度,有: \[f[i]=f[j]+1(j<i&&a[j]<a[i])\] 可以用树状数组优化至\( ...
- OpenStack总体架构概览&OpenStack核心组件介绍
下面个是51CTO上一位朋友发布的O版OpenStack核心组件说明,总结的非常到位,所以我就不再造轮子了.~,~ https://down.51cto.com/data/2448945 私有云 公有 ...
- vue-echarts在vue中的使用
安装依赖: [win]npm install echarts vue-echarts [mac]sudo npm install echarts vue-echarts Vue-ECharts 默认在 ...
- Java高级开发_性能优化的细节
一.核心部分总结: 尽量在合适的场合使用单例[减负提高效率] 尽量避免随意使用静态变量[GC] 尽量重用对象,避免过多过常地创建Java对象[最大限度地重用对象] 尽量使用final修饰符[内联(in ...