【问题标题】:How to optimize join如何优化加入
【发布时间】:2021-04-07 22:37:28
【问题描述】:

我正在编写如下 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

【问题讨论】:

  • 样本数据和预期结果将帮助我们为您提供帮助,但您似乎想要一个数据透视/条件聚合?
  • 然而,那些ON 子句也不起作用。例如,SUB1 没有定义列 SK
  • 请发布完整的 DDL,包括索引
  • @Larnu 如果TBLB非常大并且索引在(rec, SK)上,OP使用的方法可能会更好,我们需要先查看DDL
  • SQL Server 还是 Teradata?在这些连接中实际上是同一张表TBLB

标签: sql query-optimization teradata


【解决方案1】:

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

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 中。

【讨论】:

  • 由于 OP 现在澄清这不是 SQL Server,因此此答案不适用。
  • 不幸的是,y 无效的答案也受到社区的强烈反对,@Fred。
【解决方案2】:

如果这或多或少是您的文字查询,那么您几乎肯定会获得产品连接。您没有在两个联接中指定正确的别名:

LEFT  JOIN
(SELECT COLX FROM TBLB WHERE rec='456' )  SUB2
ON TBLA.SK=SUB1.SK

另外,我没有理由加入 tblb 3 次。

Sel *
FROM    
TBLA 
LEFT  JOIN
(SELECT * FROM TBLB WHERE rec in ('123', '456', '789' )  SUB1
ON TBLA.SK=SUB1.SK

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-06
    • 2023-03-03
    • 2022-10-24
    • 1970-01-01
    • 2017-10-10
    • 2016-09-18
    • 1970-01-01
    • 2012-04-15
    相关资源
    最近更新 更多