左外连接(或)联盟更有效率

时间:2015-04-16 14:10:29

标签: sql sql-server stored-procedures sql-server-2005 full-text-search

我正在开发搜索功能,其中数据库的设计如图所示。 enter image description here

我必须返回前20行

  • 表A. [第3栏] OR 表C。[B栏] OR 表B. [第X栏] 包含 @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
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)

1 个答案:

答案 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