[英]Left Outer Join (or) Union which is more efficient
我正在研究数据库中设计为如图所示的搜索功能。
我必须返回前20行
这是一个庞大的数据库,在每个表中都有几百万条记录。 在该数据库上已创建带有几个全文本索引的全文本目录。
搜索查询如下...
SELECT DISTINCT
A.ID,
A.Column1,
A.Column2,
A.Column3,
L.Description
FROM TableA A
LEFT OUTER JOIN Lookup L ON A.Code = L.Code
WHERE CONTAINS(A.Column3, @SearchText)
UNION
SELECT DISTINCT
A.ID,
A.Column1,
A.Column2,
A.Column3,
L.Description
FROM TableA A
LEFT OUTER JOIN Lookup L ON A.Code = L.Code
LEFT OUTER JOIN TableB B ON A.Id = B.FK_ID
WHERE CONTAINS(B.ColumnX, @SearchText)
UNION
SELECT DISTINCT
A.ID,
A.Column1,
A.Column2,
A.Column3,
L.Description
FROM TableA A
LEFT OUTER JOIN Lookup L ON A.Code = L.Code
LEFT OUTER JOIN TableC C ON A.Id = C.FK_ID
WHERE CONTAINS(C.ColumnB, @SearchText)
问题
1)此查询的性能会更好-非常简洁。
SELECT DISTINCT
A.ID,
A.Column1,
A.Column2,
A.Column3,
L.Description
FROM TableA A
LEFT OUTER JOIN Lookup L ON A.Code = L.Code
LEFT OUTER JOIN TableB B ON A.Id = B.FK_ID
LEFT OUTER JOIN TableC C ON A.Id = C.FK_ID
WHERE CONTAINS((A.Column3, B.ColumnX, C.ColumnB), @SearchText)
2)将创建一个视图MyView,使查找表与TableA左外连接,从而提高性能,如...
SELECT DISTINCT
V.ID,
V.Column1,
V.Column2,
V.Column3,
V.Description
FROM MyView V
LEFT OUTER JOIN TableB B ON V.Id = B.FK_ID
LEFT OUTER JOIN TableC C ON V.Id = C.FK_ID
WHERE CONTAINS((V.Column3, B.ColumnX, C.ColumnB), @SearchText)
我深信如果不构建复杂的自定义索引机制就无法避免全文搜索...但是您可以减少查询中的联接行数:
SELECT DISTINCT
A.ID,
A.Column1,
A.Column2,
A.Column3,
L.Description
FROM TableA A
LEFT OUTER JOIN Lookup L ON A.Code = L.Code
LEFT OUTER JOIN (SELECT FK_ID FROM TableB WHERE CONTAINS(ColumnX,@SearchText))B ON A.Id = B.FK_ID
LEFT OUTER JOIN (SELECT FK_ID FROM TableC WHERE CONTAINS(ColumnB,@SearchText))C ON A.Id = C.FK_ID
WHERE
CONTAINS(A.Column3, @SearchText)
OR B.FK_ID IS NOT NULL
OR C.FK_ID IS NOT NULL
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.