SQL最佳化案例-單表分頁語句的最佳化(八)
分頁語句分為單表分頁與多表關聯分頁。分頁語句的最佳化首先要選對分頁框架,錯誤的分頁框架會導致掃描表中全部的資料,正確的分頁框架會利用到rownum的count stopkey特性較少資料訪問。
如下錯誤的分頁框架:
SELECT * FROM (SELECT T.*, ROWNUM RN FROM (SELECT * FROM S_DEPART ORDER BY DEPARTID) T) WHERE RN >= 1 AND RN <= 10;
邏輯讀22558
建立索引:
create index idx_did on S_Depart (departId,0);
因為沒有過濾條件,走index full scan,效能反而不如table access full。大量回表邏輯讀翻倍,執行計劃中有index full scan就不是最優的。
| 下面代入正確的分頁框架
SELECT * FROM (SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM S_DEPART ORDER BY DEPARTID) A) WHERE ROWNUM < 10) WHERE RN >= 1;
可以看到時間消耗的sort order by上,那麼我們在order by上建立索引消除排序操作。
SELECT * FROM (SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM S_DEPART ORDER BY DEPARTID) A) WHERE ROWNUM < 10) WHERE RN >= 1;
到這裡,我們知道了分頁語句的最佳化首先要建立在正確的分頁框架上,那麼當需要分頁的語句中有where條件的時候怎麼建立索引呢?
SELECT * FROM (SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM S_DEPART WHERE DEPARTNAME = 'SALES' ORDER BY DEPARTID) A) WHERE ROWNUM < 10) WHERE RN >= 1;
create index idx_name_idon S_DEPART(DEPARTNAME,departId,0);
建立索引的最佳化法則中我們知道,要在索引中儘量的包含所需要的資料,減少回表的次數,同時利用索引排序的特性,消除order by,因此就需要建立組合索引。組合索引的建立方式where列做引導列,order by部分放在索引後,反之則要邊掃描索引邊過濾資料,產生的邏輯讀是要高於前者,當order by部分有多列資料時候,索引也都需要包含order by的列,並且注意acs和desc。
另外還有其他一些情形,當where條件中既有等值連線又有非等值連線,建立索引的規則如下,為什麼非等值連線要放在order by後呢?
因為當非等值條件在前時,按照索引查詢出的資料,order by的列要重新排序。
create index idx_name on table_name(=,order by,<>,0);
當where條件中沒有等值連線,需要按照如下規則建立索引:
create index idx_name on table_name(order by,<>,0);
當分頁語句中沒有排序條件時,只需要在where列上建立相關索引即可。
後續我們將會分析多表關聯分頁語句的最佳化方法。
| 作者簡介
姚崇·沃趣科技高階資料庫技術專家
熟悉Oracle、MySQL資料庫內部機制,豐富的Oracle、MySQL故障診斷、效能調優、資料庫備份恢復、複製、高可用方案及遷移經驗。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28218939/viewspace-2220893/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL優化案例-單表分頁語句的優化(八)SQL優化
- Oracle優化案例-單表分頁語句的優化(八)Oracle優化
- Oracle最佳化之單表分頁最佳化Oracle
- sql語句的最佳化SQL
- 最佳化sql語句SQL
- SQL語句最佳化SQL
- sql最佳化:使用sql profile最佳化sql語句SQL
- 效能最佳化之SQL語句最佳化SQL
- SQL分頁語句SQL
- SQL Profiles與語句最佳化SQL
- SQL語句運算子最佳化SQL
- 資料庫最佳化技巧 - SQL語句最佳化資料庫SQL
- 對sql語句的最佳化問題SQL
- SQL語句最佳化技術分析SQL
- ORACLE常用SQL最佳化hint語句OracleSQL
- MySQL的SQL語句最佳化一例MySql
- Oracle SQL語句最佳化技術分析OracleSQL
- straight_join最佳化sql語句AISQL
- Effective MySQL之SQL語句最佳化 小結MySql
- Sql Server系列:查詢分頁語句SQLServer
- mysql 語句如何最佳化MySql
- 【MySQL】MySQL語句最佳化MySql
- OceanBase金融SQL、億萬級別據量最佳化案例(Row_number 開窗 + 分頁SQL)SQL
- SQL最佳化案例-使用with as最佳化Subquery Unnesting(七)SQL
- spark sql語句效能最佳化及執行計劃SparkSQL
- 透過分析SQL語句的執行計劃最佳化SQL(總結)SQL
- 第45期:一條 SQL 語句最佳化的基本思路SQL
- SQL 不知道咋最佳化?吹一手 join 語句的最佳化準沒錯SQL
- SQL最佳化案例-union代替or(九)SQL
- ORACLE SQL效能最佳化系列 (八) (轉)OracleSQL
- 使用SQL Profile進行SQL最佳化案例SQL
- MySQL、Oracle和SQL Server的分頁查詢語句MySqlOracleServer
- [轉]透過分析SQL語句的執行計劃最佳化SQL(總結)SQL
- SQL單表查詢語句總結SQL
- 查詢語句(SELECT)的最佳化
- SQLT 最佳化SQL 用複合索引代替單列索引的案例SQL索引
- mysql分頁時offset過大的Sql最佳化經驗分享MySql
- Sql最佳化之回表SQL