【丹臣】優化SQL的另類思考
今天給大家介紹一個SQL優化案例,這是statpack中邏輯讀排名第一的SQL.當前建立的索引建在(username,ends,approve_status,promoted_status)上。
Buffer Gets Executions Gets per Exec %Total Time (s) Time (s) Hash Value
------------- ------------ -------------- ------ -------- --------- ----------
116,608,373 164,083 710.7 40.6 7027.07 11922.30 3701069644
Module: java@test.cm2 (TNS V1-V3)
select count(*) from test
where username = :1 --這是一個高勢列,
and ends>sysdate
and approve_status in (0,1,-9)
and id <> :2 --這是主鍵
and promoted_status = 1
------------- ------------ -------------- ------ -------- --------- ----------
116,608,373 164,083 710.7 40.6 7027.07 11922.30 3701069644
Module: java@test.cm2 (TNS V1-V3)
select count(*) from test
where username = :1 --這是一個高勢列,
and ends>sysdate
and approve_status in (0,1,-9)
and id <> :2 --這是主鍵
and promoted_status = 1
如果大家見到這樣的SQL語句會怎麼樣優化?通常的做法,是在當前索引中冗餘id欄位,以避免回表。但這樣要去調整這張大表的索引.
在看到上面的SQL後,詢問開發能否明確的知道id=:2並且滿足其它條件的這樣的記錄是否一定存在。開發經過查證後,最後的答覆是無法肯定.既然在應用層無法確定,那也要想個辦法來解決大量回表的問題。在經過仔細觀察後,我將上面這條SQL語句轉換成下面兩條SQL以及最後一步應用邏輯來實現:
第一條SQL:
Select/*+ index(a, PK_test_ID) */ count(*) from test a
where id=:1 and ends>sysdate and approve_status in (0,1,-9) and promoted_status = 1 and username=:2
where id=:1 and ends>sysdate and approve_status in (0,1,-9) and promoted_status = 1 and username=:2
第二條SQL:
select count(*) from test
where username = :1 and ends>sysdate and approve_status in (0,1,-9) and and promoted_status = 1
where username = :1 and ends>sysdate and approve_status in (0,1,-9) and and promoted_status = 1
第三步,將兩個結果相減即可實現業務
我們在做SQL優化時,如何把一條SQL根據需要等價轉化成多條,需要考慮當前的應用邏輯,以及當前資料庫中索引的情況,優化便會事半功倍。如何跳出ORACLE去思考問題,希望這個優化案例能對大家有所啟示。
<!----EOF--
作者:丹臣 | 【轉載時請務必以超連結形式標明文章原始出處和作者資訊及本宣告】
地址:http://rdc.taobao.com/blog/dba/html/140_sql_performance_tuning_dc.html
地址:http://rdc.taobao.com/blog/dba/html/140_sql_performance_tuning_dc.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1384/viewspace-261575/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL優化的方法論SQL優化
- QPM 準備優化前的思考優化
- sql優化之邏輯優化SQL優化
- 資料庫優化 - SQL優化資料庫優化SQL
- SQL SERVER優化SQLServer優化
- SQL優化指南SQL優化
- 解決 "Script Error" 的另類思路Error
- AppBoxFuture(八): 另類的ORM實現APPORM
- AndroidAPP效能優化的一些思考AndroidAPP優化
- Oracle效能優化-SQL優化(案例一)Oracle優化SQL
- Oracle效能優化-SQL優化(案例二)Oracle優化SQL
- Oracle效能優化-SQL優化(案例三)Oracle優化SQL
- Oracle效能優化-SQL優化(案例四)Oracle優化SQL
- 另類 RobotFramework 使用法Framework
- 關於類的初始化以及類的例項化一些思考
- SQL優化參考SQL優化
- sql優化專題SQL優化
- SQL語句優化SQL優化
- SQL效能優化技巧SQL優化
- MySQL-SQL優化MySql優化
- 慢Sql優化思路SQL優化
- [20180627]truncate table的另類恢復.txt
- Oracle SQL優化之sql tuning advisorOracleSQL優化
- SQL優化案例-使用with as優化Subquery Unnesting(七)SQL優化
- MySQL的SQL效能優化總結MySql優化
- 關於SQL優化的闢謠SQL優化
- 優化 SQL 語句的步驟優化SQL
- 對含distinct操作的SQL的優化SQL優化
- SQL優化案例-單表分頁語句的優化(八)SQL優化
- 神奇的 SQL 之效能優化 → 讓 SQL 飛起來SQL優化
- [20181212]truncate的另類恢復5.txt
- win電腦快速關機的另類方法
- 《有殺氣童話2》:另類童話世界開啟的另類MMO | 遊戲產品觀察遊戲
- 資料庫優化SQL資料庫優化SQL
- MYSQL SQL語句優化MySql優化
- SQL優化之limit 1SQL優化MIT
- 優化sql查詢速度優化SQL
- (轉)SQL 優化原則SQL優化
- 史上最全SQL優化方案SQL優化