s*****n 发帖数: 2174 | 1 看到不同人写的sql语句用不用的join方法, 比如下面这两种写法:
SELECT
table1.id
FROM
table1
INNER JOIN table2 ON table1.id = table2.id
INNER JOIN table3 ON table1.id = table3.id
INNER JOIN table4 ON table1.id = table4.id
WHERE
table1.value > 0
AND table2.value > 0
AND table3.value > 0
AND table4.value > 0;
SELECT
table1.id
FROM
table1
INNER JOIN table2 ON table1.id = table2.id
AND table2.value > 0
INNER JOIN table3 ON table1.id = table3.id
AND table3.value > 0
INNER JOIN table4 ON table | a9 发帖数: 21638 | 2 如果value、id有索引的话,影响还是不少的吧?
【在 s*****n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 看到不同人写的sql语句用不用的join方法, 比如下面这两种写法: : SELECT : table1.id : FROM : table1 : INNER JOIN table2 ON table1.id = table2.id : INNER JOIN table3 ON table1.id = table3.id : INNER JOIN table4 ON table1.id = table4.id : WHERE : table1.value > 0
| s*****n 发帖数: 2174 | 3 也就是说把条件写在join的语句里面,
能够只join满足条件的那些行, 执行效率会高?
【在 a9 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 如果value、id有索引的话,影响还是不少的吧?
| i****a 发帖数: 36252 | 4 I believe sql server query optimizer will make the same execution plan
from either. would be interesting to try and see
【在 s*****n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 看到不同人写的sql语句用不用的join方法, 比如下面这两种写法: : SELECT : table1.id : FROM : table1 : INNER JOIN table2 ON table1.id = table2.id : INNER JOIN table3 ON table1.id = table3.id : INNER JOIN table4 ON table1.id = table4.id : WHERE : table1.value > 0
| g***l 发帖数: 18555 | | s*****n 发帖数: 2174 | 6 那也就是说不管怎么写, query optimzer都是先filter掉不相关的rows, 然后才开始
join了?
现在的问题是我要join的几个table都很大,
我希望在真正join之前, 能先根据一些确定的条件进行pre-filter,
考虑先给每个table做一个select ... where 生成temp table,
然后再join这四个temp tables.
如果query optimizer都是先filter的话, 那这样做就没必要了. | c*******e 发帖数: 8624 | 7 same
不过实际用起来总觉得写道where里面快
另外我是喜欢用第一种写法
【在 s*****n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 看到不同人写的sql语句用不用的join方法, 比如下面这两种写法: : SELECT : table1.id : FROM : table1 : INNER JOIN table2 ON table1.id = table2.id : INNER JOIN table3 ON table1.id = table3.id : INNER JOIN table4 ON table1.id = table4.id : WHERE : table1.value > 0
| u**d 发帖数: 211 | 8 如果 query 里有 selection,
push selection down 是标准的优化,所有 optimizer 都会做
如果你的 temp table 每次都 query 生成一遍,确实没有必要
但是如果你是做一个 temp table,然后每次 query 都用它
还是能快一些 ...
【在 s*****n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 那也就是说不管怎么写, query optimzer都是先filter掉不相关的rows, 然后才开始 : join了? : 现在的问题是我要join的几个table都很大, : 我希望在真正join之前, 能先根据一些确定的条件进行pre-filter, : 考虑先给每个table做一个select ... where 生成temp table, : 然后再join这四个temp tables. : 如果query optimizer都是先filter的话, 那这样做就没必要了.
| s*****n 发帖数: 2174 | 9 我生成temp table的确只是生成一次, 用一次, 等于是人为
optimizer而已.
不过我昨天试了一下, 好像还是有作用的, 我把四个table一起
join, 系统直接就canceling request..., 分别预filter, 然后用
temp table再join, 就可以通过.
我的四个table里面, 一个150k行, 一个大约20m行, 另外两个
都是20b行. 其实预处理也只是把两个大table稍微reduce一点
而已, 一个从20b行减少到5b行, 另外一个减少到19b行.
【在 u**d 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 如果 query 里有 selection, : push selection down 是标准的优化,所有 optimizer 都会做 : 如果你的 temp table 每次都 query 生成一遍,确实没有必要 : 但是如果你是做一个 temp table,然后每次 query 都用它 : 还是能快一些 ...
|
|