首页 > 解决方案 > 好与坏以及为什么在 SQL 查询连接中应用复杂查询?

问题描述

2020-09-14 更新

我正在写一个查询

SELECT T1.*,T2.* 
FROM T1 
LEFT OUTER JOIN 
    (A complex query which traverse entire table & returning a very big dataset) T2 ON T2.T1ID = T1.ID

T2.T1ID = T1.ID 后,返回一个小数据集

这个问题的主要原因是当括号被删除并将查询合并为一个时,它可以被优化。

但这需要付出努力,并且与 T2 查询的同谋成正比。

问题是:

  1. 对于带括号的原始查询,是否会先执行T2(它执行并查询大数据集),然后与T1连接。

  2. 如果是,是否无论如何将过滤器 T2.T1ID = T1.ID 传递到括号中,以便它可以在预期的小数据集而不是整个表中进行查询。

PS SQL 表被定义为普通的和初步的,在 MSSQL 服务器上没有任何索引/RDBMS 处理

标签: sql

解决方案


我认为您编写查询的方式不是一个好主意。特别是,优化器可能会丢失关于这两个表的统计信息和索引的信息。

我建议将代码编写为:

SELECT T1.*, COALESCE(TA.VAL, TB.Val) as val
FROM T1 LEFT JOIN 
     TA 
     ON TA.T1ID = T1.ID AND @A = 1 LEFT JOIN
     TB 
     ON TB.T1ID = T1.ID AND @A = 0; 

推荐阅读