sql - 好与坏以及为什么在 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 查询的同谋成正比。
问题是:
对于带括号的原始查询,是否会先执行T2(它执行并查询大数据集),然后与T1连接。
如果是,是否无论如何将过滤器 T2.T1ID = T1.ID 传递到括号中,以便它可以在预期的小数据集而不是整个表中进行查询。
PS SQL 表被定义为普通的和初步的,在 MSSQL 服务器上没有任何索引/RDBMS 处理
解决方案
我认为您编写查询的方式不是一个好主意。特别是,优化器可能会丢失关于这两个表的统计信息和索引的信息。
我建议将代码编写为:
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;
推荐阅读
- javascript - 自定义 AsciiMath 数学分隔符
- triggers - dafny 如何应用触发器
- pandas - 在 matpplot 中增加 xy 值
- javascript - amcharts 堆积柱形图中的工具提示放置
- react-native - 错误:文本字符串必须在
组件,出现在 android 中,但在 web 上可以正常工作 - gitlab - Gitlab CI:在 Kaniko Job 中执行自己的脚本
- r - 根据年份找到加权平均值
- apache-spark - 在 spark 3.0.0 中无法触发 AQE 的倾斜连接优化
- java - BeanUtilsBeans copyProperties 不复制任何字段
- android - savedInstanceState 在第一次应用程序关闭后为空,但在第二次关闭后不为空