排序和表連線
1. 排序
金句:能不排序就不排序!
除order by之外,一些隱含排序語句:
distinct
union(union all不排序)
2. 表連線
優化巢狀迴圈連線:可在被驅動表的連線欄位和其他約束條件欄位上建立複合索引,如
可在被驅動表dept表上建立(deptno, loc)複合索引。
如果沒有d.loc = 'DALLAS'這個條件,那麼在emp表上有empno這個索引就足夠,不需要其他索引了。
總結:
要優化巢狀迴圈連線,或者在被驅動表的連線欄位上建立索引,或者將連線欄位和其他主要約束條件欄位建立複合索引。
關於子查詢
建議儘量少使用子查詢,改用表連線,因為子查詢可能使優化器選擇錯誤的執行路徑。
如果一定要使用子查詢,要選擇好到底使用 in 還是 exists
1) 如果限制性強的條件在子查詢,選 in
2) 如果限制性強的條件的主查詢,選 exists
如,以下兩個查詢分別使用了in和exists,是等效的。
表連線設計不良可能導致效能災難
1)表連線欄位的欄位型別必須一致,否則索引被抑制,將使用全表掃描。
2)連線方式應該是簡單的等號連線(如a.id = b.id),如果是複雜的公式,可能會導致笛卡爾連線。如果確有複雜連線的需求,建議新增冗餘欄位,然後與冗餘欄位連線。
金句:能不排序就不排序!
除order by之外,一些隱含排序語句:
distinct
union(union all不排序)
2. 表連線
優化巢狀迴圈連線:可在被驅動表的連線欄位和其他約束條件欄位上建立複合索引,如
點選(此處)摺疊或開啟
-
select e.*, d.*
-
from emp e, dept d
-
where e.deptno = d.deptno
-
and e.empno = 7499
- and d.loc = 'DALLAS';
如果沒有d.loc = 'DALLAS'這個條件,那麼在emp表上有empno這個索引就足夠,不需要其他索引了。
總結:
要優化巢狀迴圈連線,或者在被驅動表的連線欄位上建立索引,或者將連線欄位和其他主要約束條件欄位建立複合索引。
關於子查詢
建議儘量少使用子查詢,改用表連線,因為子查詢可能使優化器選擇錯誤的執行路徑。
如果一定要使用子查詢,要選擇好到底使用 in 還是 exists
1) 如果限制性強的條件在子查詢,選 in
2) 如果限制性強的條件的主查詢,選 exists
如,以下兩個查詢分別使用了in和exists,是等效的。
點選(此處)摺疊或開啟
-
select e.*
-
from emp e
-
where e.empno = 7499
-
and deptno in (select deptno
-
from dept d
- where d.loc = 'DALLAS')
點選(此處)摺疊或開啟
-
select e.*
-
from emp e
-
where e.empno = 7499
-
and exists (select 1
-
from dept d
-
where e.deptno = d.deptno
- and d.loc = 'DALLAS');
表連線設計不良可能導致效能災難
1)表連線欄位的欄位型別必須一致,否則索引被抑制,將使用全表掃描。
2)連線方式應該是簡單的等號連線(如a.id = b.id),如果是複雜的公式,可能會導致笛卡爾連線。如果確有複雜連線的需求,建議新增冗餘欄位,然後與冗餘欄位連線。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22621861/viewspace-1307285/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle的表連線方法(一)排序合併連線Oracle排序
- Oracle表連線操作——Merge Sort Join(合併排序連線)Oracle排序
- 表連線 join和(+)、union和uion allUI
- 【SQL】表連線 --半連線SQL
- mysql三表連線查詢以及百分數排序MySql排序
- SQL訪問路徑和表連線SQL
- 表連線cost
- Oracle 表連線Oracle
- 表連線方法
- 表連線概念
- 微課sql最佳化(16)、表的連線方法(5)-關於Merge Join(排序合連線)SQL排序
- 連線和半連線
- 兩表連線三:合併連線
- 2.2連線和路由表的維護路由
- hive表連線和oracle測試對比HiveOracle
- Oracle 表連線方式詳解(外連結、內連線、自連線)Oracle
- Socket連線和Http連線HTTP
- 長連線和短連線
- 左連線和右連線
- 表連線型別型別
- ORACLE 表連線方式Oracle
- SQL 三表連線SQL
- 表連線概念(轉)
- oracle表連線方式Oracle
- Oracle的表連線方法(三)雜湊連線Oracle
- 兩表連線一:巢狀迴圈連線巢狀
- sql 內連線和外連線SQL
- sql server連線排序衝突處理SQLServer排序
- Oracle表連線操作——Hash Join(雜湊連線)下Oracle
- Oracle表連線操作——Hash Join(雜湊連線)上Oracle
- 使用表連線替代exists
- 【SQL 學習】表連線SQL
- 長連線和短連線的使用
- 連線池和連線數詳解
- http的長連線和短連線HTTP
- LINUX 硬連線和軟連線Linux
- Oracle的左連線和右連線Oracle
- 兩種連線的表達 :left(right) join 和 (+)