繁体   English   中英

左外联接(或)联合,效率更高

[英]Left Outer Join (or) Union which is more efficient

我正在研究数据库中设计为如图所示的搜索功能。 在此处输入图片说明

我必须返回前20行

  • 表A。[柱3] 表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)

我深信如果不构建复杂的自定义索引机制就无法避免全文搜索...但是您可以减少查询中的联接行数:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM