Sql 如何优化连接
我正在编写SQL,如下所示。它会导致每次扫描一个大的表TBLA。由于表的设计,我没有任何使用索引的选项。我如何优化下面的一个,使我不必一次又一次地扫描表格。我还需要保留TBLB的条件,即每个连接中TBLB的条件不同。谢谢你的帮助 提前感谢:Sql 如何优化连接,sql,query-optimization,teradata,Sql,Query Optimization,Teradata,我正在编写SQL,如下所示。它会导致每次扫描一个大的表TBLA。由于表的设计,我没有任何使用索引的选项。我如何优化下面的一个,使我不必一次又一次地扫描表格。我还需要保留TBLB的条件,即每个连接中TBLB的条件不同。谢谢你的帮助 提前感谢: Sel SUB1.COLX, SUB1.COLY, SUB1.COLZ, SUB2.COLX, SUB2.COLY, SUB2.COLZ, SUB3.COLX, SUB3.COLY, SUB3.
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
据猜测,这应该将查询降低到一次扫描/搜索,而不是3次。但是,t此操作假定横向联接每SK值只返回1行: 选择{表A列}, oa.Sub1, oa.Sub2, oa.Sub3 来自dbo.TableA 外部应用当“123”时选择MAXCASE B.rec,然后将COLX结束为Sub1,-如果rec实际上是一个数字数据类型,请不要将其括在单引号中' MAXCASE B.rec当'456'时,则COLX结束为Sub2,-如果rec实际上是一个数字数据类型,请不要将其括在单引号中' MAXCASE B.rec当'789'时,则COLX以Sub3结尾-如果rec实际上是一个数字数据类型,请不要将其用单引号括起来' 从dbo.TableB 其中B.SK=A.SK oa;
当然,这里仍然需要相关的索引;对于TableB,它将位于列SK和rec上,而COLX至少希望包含在INCLUDE中。如果这或多或少是您的文字查询,那么您几乎肯定会得到产品联接。您没有在两个联接中指定正确的别名:
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
示例数据和expect结果将有助于我们为您提供帮助,但看起来您需要一个数据透视/条件聚合?不过,那些关于子句的数据透视/条件聚合也不起作用。例如,SUB1没有定义列SK。请发布完整的DDL,包括indexes@Larnu如果TBLB非常大并且在rec、SK上建立索引,OP使用的方法可能会更好,我们需要查看DDL firstSQL Server或Teradata吗?实际上,这些联接中的表TBLB是相同的?因为OP现在澄清了这不是SQL Server,所以这个答案不适用;弗雷德说:“人们也非常不赞成否定答案。