首页 > 解决方案 > 如何优化加入

问题描述

我正在编写如下 SQL。它每次都会导致扫描表“TBLA”,这是一个大表。由于表格设计,我没有任何使用索引的选项。我怎样才能优化下面的,这样我就不必一次又一次地扫描表。我还需要保留 TBLB 的条件,即每个连接中的 TBLB 有不同的条件。感谢任何帮助

提前致谢 :)

Sel SUB1.COLX,
    SUB1.COLY,
    SUB1.COLZ,
    SUB2.COLX,
    SUB2.COLY,
    SUB2.COLZ,
    SUB3.COLX,
    SUB3.COLY,
    SUB3.COLZ
FROM    
TBLA 
LEFT  JOIN
(SELECT COLX , COLY, COLZ FROM TBLB WHERE rec='123' )  SUB1
ON TBLA.SK=SUB1.SK
LEFT  JOIN
(SELECT COLX , COLY, COLZ FROM TBLB WHERE rec='456' )  SUB2
ON TBLA.SK=SUB2.SK
LEFT  JOIN
(SELECT COLX , COLY, COLZ FROM TBLB WHERE rec='789' )  SUB3
ON TBLA.SK=SUB3.SK

标签: sqlquery-optimizationteradata

解决方案


猜测一下,这应该将查询降低到单次扫描/搜索而不是 3。但是,Tbhi 确实假设您的横向连接每个值仅返回 1 行SK

SELECT {Table A Columns},
       oa.Sub1,
       oa.Sub2,
       oa.Sub3
FROM dbo.TableA A
     OUTER APPLY (SELECT MAX(CASE B.rec WHEN '123' THEN COLX END) AS Sub1, --If rec is actually a numerical datatype, don't wrap it in single quotes (')
                         MAX(CASE B.rec WHEN '456' THEN COLX END) AS Sub2, --If rec is actually a numerical datatype, don't wrap it in single quotes (')
                         MAX(CASE B.rec WHEN '789' THEN COLX END) AS Sub3  --If rec is actually a numerical datatype, don't wrap it in single quotes (')
                  FROM dbo.TableB B
                  WHERE B.SK = A.SK) oa;

当然,这里仍然需要相关的索引;因为TableB,那将在列上SKrec并且COLX至少希望在INCLUDE.


推荐阅读