簡體   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