2013年3月8日星期五
Tune sql performance
1. table join 時, 先將各自 table 內的資料先過濾再 join
2. IN 與 EXISTS
■IN: 與 EXISTS 原理剛好相反
SELECT * FROM tableA a WHERE EXISTS ( SELECT 1 FROM tableB b WHERE a.col1 = b.col2 )
相當於:
FOR pointB IN ( SELECT * FROM tableB )
LOOP
IF ( EXISTS ( SELECT 1 FROM tableA a WHERE a.col1 = pointB.col2 )
THEN
/*OUTPUT THE RECORD*/
END IF;
END LOOP;
■EXISTS:
SELECT * FROM tableA a WHERE EXISTS ( SELECT 1 FROM tableB b WHERE a.col1 = b.col2 )
相當於:
FOR pointA IN ( SELECT * FROM tableA )
LOOP
IF ( EXISTS ( SELECT 1 FROM tableB b WHERE pointA.col1 = b.col2 )
THEN
/*OUTPUT THE RECORD*/
END IF;
END LOOP;
■選擇時機: 外大內小 = IN,外小內大 = EXISTS, 同時應盡可能使用 NOT EXISTS 來代替 NOT IN,儘管二者都使用了NOT(都不能使用索引而降低速度),NOT EXISTS要比NOT IN查詢效率更高。
3. 在 where condition 中, 不要使用負向條件, 盡量用正向條件, 因為負向條件不行使用 Index 增加查詢效率
負向條件效率差:
Ex: 1. WHERE column1 <> 1 AND column1 <> 2
2. WHERE column1 NOT IN (1, 2)
若一定要使用 NOT IN, 那麼使用 NOT EXISTS 取代 NOT IN 可增加查詢效率, 因為負向表列不行使用 Index
正向條件效率較好:
Ex: 1. WHERE column1 < 1 AND column1 > 2
2. WHERE column1 IN (3, 4, 5…)
參考:
http://www.dotblogs.com.tw/brian/archive/2013/03/06/95525.aspx
http://eeluck.pixnet.net/blog/post/27559378-in%E5%92%8Cexists%E7%9A%84%E5%B7%AE%E7%95%B0
http://www.nowamagic.net/database/db_DifferenceBetweenInAndExist.php
訂閱:
文章 (Atom)