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.