[英]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.