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