我正在开发搜索功能,其中数据库的设计如图所示。
我必须返回前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)
答案 0 :(得分:0)
我担心如果不构建复杂的自定义索引机制,就无法避免全文搜索...但是您可以减少查询中连接行的数量:
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