IS NULL 的性能优化有关问题
IS NULL 的性能优化问题
select distinct A.id from A left outer join B on B.A_id = A.id
where B.A_id is null
如题,以上sql在大数据量的时候(A表7万多条,B表4万多条,inner join匹配条数为3万余条)在DB2中执行的非常缓慢,平均时间会在上1000S以上...
网上查了一下,似乎原因在于DB2的查询优化器在null值的行数很大时会自动选择全表扫描而不是索引扫描?
如此一来如何优化?
PS:问题说白了就是在于取A与B差集的方法中性能最强的是哪种,当前我做过一下改动:
select distinct A.id from A left outer join B on B.A_id = A.id
where A.id not in (select A.id from org inner join B on B.A_id = A.id)
即用NOT IN 代替 IS NULL...
是否会有更优化的方案? 在线等大神解答
------解决思路----------------------
建立1个冗余字段保存COALESCE(A_id,0),在此字段上建立索引试试
------解决思路----------------------
(B.A_id IS NULL OR (NOT (B.some_attribue <> 0 OR B.colOther IS NULL)
AND D.first_column IS NOT NULL AND NOT (D.second_column <> 0 OR D.second_column IS NULL) AND (D.third_colum <> 0 OR D.third_colum IS NULL)))
1 B.A_id IS NULL
2 B.some_attribue <> 0
3 B.colOther IS NULL
4 D.first_column IS NOT NULL
5 D.second_column <> 0
6 D.second_column IS NULL
7 D.third_colum <> 0
8 D.third_colum IS NULL
(1 OR (NOT (2 OR 3)AND 4 AND NOT (5 OR 6) AND (7 OR 8)))
(1 OR (NOT 2 AND NOT 3 AND 4 AND NOT 5 AND NOT 6 AND (7 OR 8)))
1
UNION
NOT 2 AND NOT 3 AND 4 AND NOT 5 AND NOT 6 AND 7
UNION
NOT 2 AND NOT 3 AND 4 AND NOT 5 AND NOT 6 AND 8
B.A_id IS NULL
UNION
B.some_attribue = 0 AND B.colOther IS NOT NULL AND D.first_column IS NOT NULL AND D.second_column = 0 AND D.second_column IS NOT NULL AND D.third_colum <> 0
UNINO
B.some_attribue = 0 AND B.colOther IS NOT NULL AND D.first_column IS NOT NULL AND D.second_column = 0 AND D.second_column IS NOT NULL AND D.third_colum IS NULL
先简化 where条件 不要按照 业务逻辑 写sql
拆分三句 每句单独优化 where顺序 或是 left 改 inner
试试吧
------解决思路----------------------
不应该用VARCHAR做主健, 记录越多, 速度越慢, VARCHAR是给大量文字记录备注等使用的, 设计表时应该想想。
select distinct A.id from A left outer join B on B.A_id = A.id
where B.A_id is null
如题,以上sql在大数据量的时候(A表7万多条,B表4万多条,inner join匹配条数为3万余条)在DB2中执行的非常缓慢,平均时间会在上1000S以上...
网上查了一下,似乎原因在于DB2的查询优化器在null值的行数很大时会自动选择全表扫描而不是索引扫描?
如此一来如何优化?
PS:问题说白了就是在于取A与B差集的方法中性能最强的是哪种,当前我做过一下改动:
select distinct A.id from A left outer join B on B.A_id = A.id
where A.id not in (select A.id from org inner join B on B.A_id = A.id)
即用NOT IN 代替 IS NULL...
是否会有更优化的方案? 在线等大神解答
------解决思路----------------------
建立1个冗余字段保存COALESCE(A_id,0),在此字段上建立索引试试
------解决思路----------------------
(B.A_id IS NULL OR (NOT (B.some_attribue <> 0 OR B.colOther IS NULL)
AND D.first_column IS NOT NULL AND NOT (D.second_column <> 0 OR D.second_column IS NULL) AND (D.third_colum <> 0 OR D.third_colum IS NULL)))
1 B.A_id IS NULL
2 B.some_attribue <> 0
3 B.colOther IS NULL
4 D.first_column IS NOT NULL
5 D.second_column <> 0
6 D.second_column IS NULL
7 D.third_colum <> 0
8 D.third_colum IS NULL
(1 OR (NOT (2 OR 3)AND 4 AND NOT (5 OR 6) AND (7 OR 8)))
(1 OR (NOT 2 AND NOT 3 AND 4 AND NOT 5 AND NOT 6 AND (7 OR 8)))
1
UNION
NOT 2 AND NOT 3 AND 4 AND NOT 5 AND NOT 6 AND 7
UNION
NOT 2 AND NOT 3 AND 4 AND NOT 5 AND NOT 6 AND 8
B.A_id IS NULL
UNION
B.some_attribue = 0 AND B.colOther IS NOT NULL AND D.first_column IS NOT NULL AND D.second_column = 0 AND D.second_column IS NOT NULL AND D.third_colum <> 0
UNINO
B.some_attribue = 0 AND B.colOther IS NOT NULL AND D.first_column IS NOT NULL AND D.second_column = 0 AND D.second_column IS NOT NULL AND D.third_colum IS NULL
先简化 where条件 不要按照 业务逻辑 写sql
拆分三句 每句单独优化 where顺序 或是 left 改 inner
试试吧
------解决思路----------------------
不应该用VARCHAR做主健, 记录越多, 速度越慢, VARCHAR是给大量文字记录备注等使用的, 设计表时应该想想。