zoukankan      html  css  js  c++  java
  • 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提示的时候,要根据实际情况而定,不可以胡乱使用。

  • 相关阅读:
    面试官:反射都不会,还敢说自己会Java?
    nginx 开启x-forward
    不写代码,从0到1教你制作炫酷可视化大屏
    5G 专网部署方案
    Mac运行pygame一直显示空白屏幕
    数据库大咖解读“新基建”,墨天轮四重好礼相送!
    Oracle 20c 新特性:自动的区域图
    4000多人全靠报表自动化,效率提高60%,这套数据平台方法论真强
    EBS开发性能优化之查找需要优化的程序
    EBS开发性能优化之SQL语句优化
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/11532504.html
Copyright © 2011-2022 走看看