【问题标题】:Left Outer Join (or) Union which is more efficient更有效的左外连接(或)联合
【发布时间】:2015-06-23 00:17:38
【问题描述】:

我正在开发一种搜索功能,其中数据库的设计如图所示。

我必须返回前 20 行

  • TableA.[Column 3] OR TableC.[Column B] OR TableB.[Column 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)

【问题讨论】:

  • 你检查过执行计划吗?

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


【解决方案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 (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

【讨论】:

    猜你喜欢
    • 2014-02-06
    • 1970-01-01
    • 2019-04-21
    • 2010-10-14
    • 2016-12-13
    • 2023-03-04
    • 2014-09-23
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多