繁体   English   中英

SQL Server中的查询性能

[英]Query performance in Sql Server

我数据库中有一些表。 具有对象ObjectTbl的表和具有类型TypesTbl的表。

那看起来像:

ObjectTbl                          TypesTbl

objId    | TypeId | objName |      typeId    | typeName |
--------------------------------   ----------------------
intObjId | typeId | objName |      intTypeId | typeName |

表ObjectTbl中的TypeId列是TypesTbl中的外键。 TypesTbl包含〜200条记录,ObjectTbl〜1000000

当我执行查询时:

SELECT * FROM ObjectTbl obj
join TypesTbl t ON t.typeName='Type_Name'
WHERE obj.TypeId=t.typeId and (obj.objName like '%expression%' or obj.objName like   '%expression2%' or obj.objName like '%expression3%')

它的工作时间超过10秒。 但是当我使用时:

declare @typeId int

set @typeId=(select typeId from TypesTbl where typeName='Type_Name')

SELECT * FROM ObjectTbl obj
WHERE obj.TypeId=@typeId and (obj.objName like '%expression%' or obj.objName like   '%expression2%' or obj.objName like '%expression3%')

多数民众赞成在不到1秒的时间。 有人可以解释一下为什么吗?

在此处输入图片说明

SELECT  *
FROM    ObjectTbl obj
        INNER   JOIN TypesTbl t ON obj.TypeId = t.typeId
                           AND t.typeName = 'Type_Name'
WHERE   ( obj.objName LIKE '%expression%'
          OR obj.objName LIKE '%expression2%'
          OR obj.objName LIKE '%expression3%'
        )

问题是这是一个很大的连接

SELECT * 
  FROM ObjectTbl obj
  join TypesTbl t 
    ON t.typeName = 'Type_Name'

将条件上移到联接中,以便查询优化器可以更快地进行过滤

SELECT * 
  FROM ObjectTbl obj
  join TypesTbl t 
    on obj.TypeId = t.typeId
   and t.typeName = 'Type_Name'
   and (    obj.objName like '%expression%' 
        or  obj.objName like '%expression2%' 
        or  obj.objName like '%expression3%' )
--try this
--a) variant with CTE

;
WITH    t AS ( SELECT   *
               FROM     TypesTbl
               WHERE    typeName = 'Type_Name'
             )
    SELECT  *
    FROM    ObjectTbl obj
            INNER   JOIN t ON obj.TypeId = t.typeId
    WHERE   ( obj.objName LIKE '%expression%'
              OR obj.objName LIKE '%expression2%'
              OR obj.objName LIKE '%expression3%'
            )

--b) variant with #temp table

IF OBJECT_ID('Tempdb..#t') IS NOT NULL
BEGIN   
    DROP TABLE #t
END 

SELECT  *
INTO    #t
FROM    TypesTbl
WHERE   typeName = 'Type_Name'

SELECT  *
FROM    ObjectTbl obj
        INNER   JOIN #t AS t ON obj.TypeId = t.typeId
WHERE   ( obj.objName LIKE '%expression%'
          OR obj.objName LIKE '%expression2%'
          OR obj.objName LIKE '%expression3%'
        )

-也可以尝试内部哈希连接https://ask.sqlservercentral.com/questions/17400/inner-join-vs-inner-hash-join.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM