一次隱藏較隱蔽的SQL最佳化問題----不要輕易的忽視count(列)
原創 qq: 123614791
1. 場景說明:
stockpile ----IC卡的供求資訊
xh-- 型號-----字元型
xh 列是 可為null的
index SP_XH, 是函式index, 定義如下create index SP_XH on stockpile (upper(xh));
注意:
( xh 列是 可為null的,會多讀一次表
如果xh上帶not null 的約束,只讀index 不讀表 )
高頻度查詢SQL
select /*+ INDEX(s SP_XH) */ count(s.xh)
from stockpile s
where upper(s.xh) like 'TL431%'
COUNT(S.XH)
-----------
186875
2. 問題出現:
讀完index SP_XH 統計出數量後, 為何有多讀一次STOCKPILE, 幸好它對效能的惡化程度還不算非常厲害,
select /*+ INDEX(s SP_XH) */ count(s.xh)
from stockpile s
where upper(s.xh) like 'TL431%'
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=272 Card=1Bytes=14)
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'STOCKPILE' (Cost=272 Card=284 Bytes=3976)
3 2 INDEX (RANGE SCAN) OF 'SP_XH' (NON-UNIQUE) (Cost=3 Card=284)
3. 分析解決:
a. 這個sql如果用count(*), 只讀 index SP_XH { upper(s.xh) } , 不讀表 。
b. 如果用 count(s.xh) , s.xh的資料只有在表中有 , 對應的index SP_XH { upper(s.xh) } 沒有, 為排除s.xh空值影響, 所以讀完index還要讀表。
註解: 與 某 function(列) 之間, ORACLE不能夠 根據 其中一個判斷另一個是否為NULL, 例如 function 是NVL(列, '1'), DECODE(列, NULL, '1', '2',NULL) 或是自定義函式, 根據函式處理後的列值-----> 不能判斷 最初的 是否為NULL。
c. 如改寫成 count( upper(s.xh)) 一樣可以只讀index不讀表。
select /*+ INDEX(s SP_XH) */ count( upper(s.xh))
from stockpile s
where upper(s.xh) like 'TL431%'
4. 回顧:
a. 函式index 中 存貯的是: 函式處理列後的值 和 行rowid。
b. 當xh 列是 可為null的,count(列) 出現, 走的又是 列的函式index, count(列)會多讀一次表。
c. 當xh列上帶not null 的約束, 只讀index不讀表。
d. count(列)出現時, 要看一下這對業務來說是否真的有必要, 如果只是程式設計師的一個書寫習慣,不要輕易的忽視它。
原創 qq: 123614791
[@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-886337/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一次慢查詢暴露的隱蔽問題
- 快速定位隱蔽的sql效能問題及調優SQL
- 隱藏的寶藏,13個不可忽視的優秀 Python 庫Python
- 簡單又較隱蔽的PHP後門PHP
- 檢視Oracle隱藏引數的SQLOracleSQL
- 杜絕安全隱患 容易忽視的Oracle安全問題(轉)Oracle
- Oracle 隱藏列Oracle
- OSX中隱藏和顯示[隱藏檔案]的命令列命令列
- 隱藏Sysbase SQL AnywhereSQL
- 一個較優雅的GridView隱藏列取值解決方案View
- 輕鬆隱藏桌面檔案,檔案隱藏工具FileUnhiderIDE
- C# 顯示、隱藏視窗對應的工作列C#
- 隱蔽的秩序-讀書筆記筆記
- iOS隱藏狀態列iOS
- DB2隱藏列DB2
- MAC如何顯示隱藏檔案和隱藏隱藏檔案的命令Mac
- Qt 子視窗 隱藏標題欄的圖示,隱藏在工作列上的圖示QT
- 如何隱藏工作列的圖示win10_win10怎麼隱藏狀態列圖示Win10
- 隱藏資料夾怎麼取消隱藏 關閉隱藏檔案的辦法
- SQL隱碼攻擊問題SQL
- Ant Design Vue 的 table 隱藏特定列Vue
- 隱藏引數查詢sqlSQL
- win10 如何檢視隱藏的資料夾 win10檢視隱藏檔案方法Win10
- Mac下顯示和隱藏隱藏檔案的命令Mac
- excel一次性取消隱藏快捷鍵 excel表格怎麼取消隱藏Excel
- Oracle事務臨時表的一個隱藏問題Oracle
- Qt隱藏標題欄QT
- 【53】不要輕忽編譯器的警告編譯
- 檢視oracle隱藏引數Oracle
- 隱藏控制檯應用程式的視窗
- oracle隱藏引數的檢視和使用Oracle
- 記一次滾動條隱藏
- win10怎樣隱藏工作列_win10全屏工作列隱藏操作方法Win10
- 工作列隱藏了怎麼還原 電腦隱藏了工作列怎麼恢復
- win10隱藏磁碟怎麼檢視 win10如何開啟隱藏的磁碟Win10
- ThinkPHP 訪問路徑隱藏 index.php 問題PHPIndex
- 如何隱藏你的 Linux 的命令列歷史Linux命令列
- 函式索引產生隱藏列函式索引