提高查询效率


2019/7/26 sql

注意点

  1. 本例用的是Join,如果是Left Join和Right Join需要根据具体情况再判断
  2. 有些数据库不支持With as的用法

修改前

在使用SQL的时候,我们经常会用到这样的语句:

Select
tableA.field1
,tableA.field2
,tableA.field3
,tableB.field1
,tableB.field2
,tableB.field3
From 
tableA 
Join tableB on tableA.foreign_key = tableB.keyB
Where
    tableA.field1 = 'value1'
And tableB.field2 = 'value2'
1
2
3
4
5
6
7
8
9
10
11
12
13

在数据量小的时候,这样写没有问题, 当数据量大到出现timeout报错的时候可以尝试这样修改

修改后

With a as (
Select
field1
,field2
,field3
,foreign_key   
From 
tableA 
Where
    field1 = 'value1'
)
, b as (
Select
 field1
,field2
,field3
,keyB
From 
tableB
where
    field2 = 'value2'
)

Select
a.field1
,a.field2
,a.field3
,b.field1
,b.field2
,b.field3
From
a
Join b on a.foreign_key = b.keyB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

和上面的区别是在做 Join 之前先做了筛选, 因为做Join的时候资源消耗比较多, 直观的理解,将数据表筛选变小后再做 Join 效率会高很多。 本例只是提供一个思路,真实情况往往会复杂很多, 需要考虑全面。

Last Updated: 7/26/2019, 3:06:02 PM