在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的常用提示的更多相关文章

  1. 安装 SQL Server 2008 时提示需要删除 SQL Server 2005 Express 工具

    已安装 SQL Server 2005,安装 SQL Server 2008 时提示需要删除 SQL Server 2005 Express 工具 错误提示:已安装 SQL Server 2005 E ...

  2. SQL Server 2000:提示“未与信任SQL SERVER连接相关连”错误

    在使用“用户模式”登陆SQL Server 2000时提示“未与信任SQL SERVER连接相关连”错误,因为在安装SQL Server时选择“仅Windows”模式,所以所有用户都不可以登陆. 解决 ...

  3. SQL Server中常用的SQL语句(转):

    SQL Server中常用的SQL语句 转自:http://www.cnblogs.com/rainman/archive/2013/05/04/3060428.html 1.概述 名词 笛卡尔积.主 ...

  4. 安装SQL Server时,提示VS Shell 安装失败,退出代码为 1638。

    在安装SQL Server时,提示“安装 Microsoft Visual C++ 2015 Redistributable 时出错VS Shell 安装失败,退出代码为 1638”. 原因:是由于你 ...

  5. SQL Server 2008 R2提示评估期已过

    解决SQL Server 2008 r2提示评估期已过 1.注册表把 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\Co ...

  6. 处理SQL Server 异常常用步骤

    处理SQL Server 异常常用步骤 SQL Server常见的问题主要是SQL问题造成,常见的主要是CPU过高和阻塞. 一.CPU过高的问题 1.查询系统动态视图查询执行时间长的sql语句 WIT ...

  7. (4.6)sql server索引缺失提示

    SQLSERVER如何查看索引缺失 sql server索引缺失提示 当大家发现数据库查询性能很慢的时候,大家都会想到加索引来优化数据库查询性能, 但是面对一个复杂的SQL语句,找到一个优化的索引组合 ...

  8. 【随记】安装SQL Server 2008 R2 提示创建usersettings/microsoft.sqlserver.configuration.landingpage.properties.se

    在安装SQL Server 2008 R2 提示创建usersettings/microsoft.sqlserver.configuration.landingpage.properties.se.. ...

  9. SQL SERVER 中的提示

    提示是指定的强制选项或策略,由 SQL Server 查询处理器针对 SELECT.INSERT.UPDATE 或 DELETE 语句执行. 提示将覆盖查询优化器可能为查询选择的任何执行计划. 注意: ...

随机推荐

  1. Linux的DNS实现负载均衡及泛域名部署

    DNS负载均衡技术的实现原理是在DNS服务器中为同一个主机名配置多个IP地址,在应答DNS查询时,DNS服务器对每个查询将以DNS文件中主机记录的IP地址按顺序返回不同的解析结果,将客户端的访问引导到 ...

  2. HDU1754 && HDU1166 线段树模板题

    HDU1754 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 题目分析:对于给出的一个很长的区间,对其进行单点更新值和区间求最大值的操作,由于 ...

  3. bert模型参数简化

    我们下载下来的预训练的bert模型的大小大概是400M左右,但是我们自己预训练的bert模型,或者是我们在开源的bert模型上fine-tuning之后的模型的大小大约是1.1G,我们来看看到底是什么 ...

  4. Wpf DataGrid动态添加列,行数据(二)

    这是第二中方法,可直接绑定,我这里只是做出了一种思路,并不是最完美. 这里注意一下,因为我里面引用了MVVMLight,所以可能代码不是复制过去就能用了的. 样式也是,所以复制过去看不是我贴出来的界面 ...

  5. NOIP 2008 传球游戏

    洛谷 P1057 传球游戏 洛谷传送门 JDOJ 1536: [NOIP2008]传球游戏 T3 JDOJ传送门 Description ​ 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次, ...

  6. 【C#】身份证号正确性验证及正则表达式格式验证

    身份证前两位各省对应的编号是: 1.华北地区:北京市|11,天津市|12,河北省|13,山西省|14,内蒙古自治区|15: 2.东北地区: 辽宁省|21,吉林省|22,黑龙江省|23: 3.华东地区: ...

  7. Windows server 2003 粘滞键后门+提权

    Windows server 2003中可以建立粘滞键与cmd的连接来绕过已经设置好的安全机制做一些事情,比如新建用户.提权 粘滞键介绍 网上查了一些资料,也没怎么说明白,不如自己试一下,大概意思就是 ...

  8. PEPE规范 和 垃圾回收

    目录 1.python解释器的种类及特点 2.PEP8规范 3.解释型语言和编译型语言 4.bit.B.KB.MB.GB的关系 5.列举你所了解到python2和python3的区别 6.is和==的 ...

  9. 洛谷 P2023 [AHOI2009]维护序列 题解

    P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...

  10. 第02组 Alpha冲刺(2/4)

    队名:十一个憨批 组长博客 作业博客 组长黄智 过去两天完成的任务:写博客,复习C语言 GitHub签入记录 接下来的计划:构思游戏实现 还剩下哪些任务:敲代码 燃尽图 遇到的困难:Alpha冲刺时间 ...