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