简体   繁体   中英

Query performance in Sql Server

I have some tables in database. Table with objects named ObjectTbl and table with types named TypesTbl.

Thats looks like:

ObjectTbl                          TypesTbl

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

TypeId column in table ObjectTbl is a Foreign Key from TypesTbl. TypesTbl contains ~200 records, ObjectTbl ~1000000

When I execute query:

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%')

It's works more than 10 seconds. But when I use:

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%')

Thats works less than 1 second. Can anybody explain me why so?

在此处输入图片说明

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%'
        )

The problem is that this is a really big join

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

move conditions up into the join so the query optimizer can filter sooner

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%'
        )

--also you can try inner hash join https://ask.sqlservercentral.com/questions/17400/inner-join-vs-inner-hash-join.html

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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