排序和表連線

hooca發表於2014-10-22
1. 排序

金句:能不排序就不排序!

除order by之外,一些隱含排序語句:

distinct
union(union all不排序)



2. 表連線

優化巢狀迴圈連線:可在被驅動表的連線欄位和其他約束條件欄位上建立複合索引,如


點選(此處)摺疊或開啟

  1. select e.*, d.*
  2. from emp e, dept d
  3. where e.deptno = d.deptno
  4. and e.empno = 7499
  5. and d.loc = 'DALLAS';
可在被驅動表dept表上建立(deptno, loc)複合索引。

如果沒有d.loc = 'DALLAS'這個條件,那麼在emp表上有empno這個索引就足夠,不需要其他索引了。

總結:
要優化巢狀迴圈連線,或者在被驅動表的連線欄位上建立索引,或者將連線欄位和其他主要約束條件欄位建立複合索引。
關於子查詢

建議儘量少使用子查詢,改用表連線,因為子查詢可能使優化器選擇錯誤的執行路徑。

如果一定要使用子查詢,要選擇好到底使用 in 還是 exists

1) 如果限制性強的條件在子查詢,選 in 
2) 如果限制性強的條件的主查詢,選 exists

如,以下兩個查詢分別使用了in和exists,是等效的。


點選(此處)摺疊或開啟

  1. select e.*
  2. from emp e
  3. where e.empno = 7499
  4. and deptno in (select deptno
  5.     from dept d
  6.     where d.loc = 'DALLAS')

點選(此處)摺疊或開啟

  1. select e.*
  2. from emp e
  3. where e.empno = 7499
  4.   and exists (select 1
  5.     from dept d
  6.     where e.deptno = d.deptno
  7.     and d.loc = 'DALLAS');



表連線設計不良可能導致效能災難

1)表連線欄位的欄位型別必須一致,否則索引被抑制,將使用全表掃描。
2)連線方式應該是簡單的等號連線(如a.id = b.id),如果是複雜的公式,可能會導致笛卡爾連線。如果確有複雜連線的需求,建議新增冗餘欄位,然後與冗餘欄位連線。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22621861/viewspace-1307285/,如需轉載,請註明出處,否則將追究法律責任。

相關文章