【丹臣】優化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優化
- 另類SQL拼接方法SQL
- [丹臣]ORACLE中Like與Instr效能大比拼Oracle
- [ 丹臣]利用innodb_table_monitor來trace innodb內部資訊
- [ 丹臣]INNODB與ORACLE單行儲存長度對比Oracle
- JS中if(a ==1 && a== 2 && a==3)判定為true的另類思考JS
- SQL Server中巧用另類寫法代替Like語句SQLServer
- 【SQL優化】SQL優化的10點注意事項SQL優化
- 【SQL優化】SQL優化工具SQL優化
- QPM 準備優化前的思考優化
- LAMP的思考:效能優化總結LAMP優化
- mysql的sql優化MySql優化
- 優化SQL中的or優化SQL
- SQL Server優化之SQL語句優化SQLServer優化
- [原創]介面、類、抽象類、物件的另類解釋抽象物件
- SQL優化SQL優化
- with as優化sql優化SQL
- 效能優化案例-SQL優化優化SQL
- 解決 "Script Error" 的另類思路Error
- iOS另類的記憶體管理iOS記憶體
- ORACLE FLASHBACK的另類應用薦Oracle
- FLV 的另類實現方法
- 修改flashget的另類方法(已修正)
- 關於類的初始化以及類的例項化一些思考
- SQL優化的方法論SQL優化
- SQL語句的優化SQL優化
- 優化sql的利器SQLT優化SQL
- 一個sql的優化SQL優化
- 資料庫優化 - SQL優化資料庫優化SQL
- sql優化之邏輯優化SQL優化
- SQL優化:limit分頁優化SQL優化MIT
- MySQL 效能優化之SQL優化MySql優化
- 另類 RobotFramework 使用法Framework
- ThinkPHP之另類RBAC效果PHP
- SQL優化--用各種hints優化一條SQLSQL優化
- SQL SERVER中SQL優化SQLServer優化
- SQL優化指南SQL優化
- SQL SERVER優化SQLServer優化