設法減少表掃描次數(luise)
點選(此處)摺疊或開啟
-
--場景: SQL語句非常複雜,涉及dcc_ne_log和dcc_sys_log兩張表. 表中記錄分別為305 473, 5 037 050
-
-- 目前的執行時間為300秒.
-
-
SELECT DISTINCT ne_state.peer_id AS peer_name, to_char(ne_state.ne_state) AS peer_state,
-
(CASE WHEN ne_state.ne_state = 0 THEN
-
to_char(0)
-
ELSE
-
(to_char(NVL((SELECT COUNT(*) FROM dcc_ne_log
-
WHERE dcc_ne_log.result <> 1
-
AND peer_id = ne_state.peer_id
-
AND log_time >= TRUNC(SYSDATE)
-
GROUP BY(peer_id)), 0))) END) AS err_cnt,
-
(CASE WHEN ne_state.ne_state = 0 THEN
-
to_char(0)
-
ELSE
-
(to_char(NVL((SELECT COUNT(*) FROM dcc_ne_log in_dnl
-
WHERE in_dnl.direction = \'recv\'
-
AND in_dnl.peer_id = ne_state.peer_id
-
AND log_time >= TRUNC(SYSDATE)), 0))) END) AS recv_cnt,
-
-
(CASE WHEN ne_state.ne_state = 0 THEN
-
to_char(0)
-
ELSE
-
(to_char(NVL((SELECT SUM(LENGTH) FROM dcc_ne_log in_dnl
-
WHERE in_dnl.direction = \'recv\'
-
AND in_dnl.peer_id = ne_state.peer_id
-
AND log_time >= TRUNC(SYSDATE)), 0))) END) AS recv_bytes,
-
-
(CASE WHEN ne_state.ne_state = 0 THEN
-
to_char(0)
-
ELSE
-
(to_char(NVL((SELECT COUNT(*) FROM dcc_ne_log in_dnl
-
WHERE in_dnl.direction = \'send\'
-
AND in_dnl.peer_id = ne_state.peer_id
-
AND log_time >= TRUNC(SYSDATE)), 0))) END) AS send_cnt,
-
-
(CASE WHEN ne_state.ne_state = 0 THEN
-
to_char(0)
-
ELSE
-
(to_char(NVL((SELECT SUM(LENGTH) FROM dcc_ne_log in_dnl
-
WHERE in_dnl.direction = \'send\'
-
AND in_dnl.peer_id = ne_state.peer_id
-
AND log_time >= TRUNC(SYSDATE)), 0))) END) AS send_bytes
-
FROM dcc_ne_log, (SELECT DISTINCT dsl1.peer_id AS peer_id, NVL(ne_diconnect_info.ne_state, 1) AS ne_state
-
FROM dcc_sys_log dsl1, (SELECT DISTINCT dnl.peer_id AS peer_id, DECODE(action,
-
\'disconnect\', 0,
-
\'connect\', 0,
-
1) AS ne_state
-
FROM dcc_sys_log dsl, dcc_ne_log dnl
-
WHERE dsl.peer_id = dnl.peer_id
-
AND ((dsl.action = \'disconnect\' AND dsl.cause = \'關閉對端\') OR
-
(dsl.action = \'disconnect\' AND dsl.cause = \'連線主機失敗\'))
-
AND log_type = \'對端互動\'
-
AND dsl.log_time = (SELECT MAX(log_time) FROM dcc_sys_log
-
WHERE peer_id = dnl.peer_id
-
AND log_type = \'對端互動\')) ne_disconnect_info
-
WHERE dsl1.peer_id = ne_disconnect_info.peer_id(+)) ne_state
-
WHERE ne_state.peer_id = dcc_ne_log.peer_id(+);
-
-
--這個語句太複雜了,語句執行了多次表掃描和複雜連線.
-
--為構造出err_cnt, recv_cnt, recv_byte, send_cnt, send_byte,而使用了5個SQL,這是簡化的突破口
-
-
--5個欄位部分的程式碼可改寫為
-
SELECT peer_id, COUNT(CASE WHEN RESULT <> 1 THEN 1 END) AS err_cnt,
-
COUNT(CASE WHEN direction = \'recv\' THEN 1 END) AS recv_cnt,
-
SUM(CASE WHEN direction = \'recv\' THEN LENGTH END) AS recv_byte,
-
COUNT(CASE WHEN direction = \'send\' THEN 1 END) AS send_cnt,
-
SUM(CASE WHEN direction = \'send\' THEN LENGTH END) AS send_byte
-
FROM dcc_ne_log
-
WHERE log_time >= TRUNC(SYSDATE)
- GROUP BY peer_id;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17013648/viewspace-1072012/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何減少 Hyperf 框架的掃描時間框架
- MySQL中的全表掃描和索引樹掃描MySql索引
- 優化全表掃描優化
- delete 與全表掃描delete
- Oracle中存取資料掃描Table及索引的方式(全表掃描,索引掃描等)Oracle索引
- 前端巧用localStorage做“快取”,減少HTTP請求次數前端快取HTTP
- oracle 全表掃描,索引範圍掃描與塊的理解Oracle索引
- SQL 掃描引數(SARG)SQL
- (轉)索引掃描還是全表掃描(Index Scan Or Full Table Scan)索引Index
- 轉)索引掃描還是全表掃描(Index Scan Or Full Table Scan)索引Index
- ORACLE全表掃描查詢Oracle
- js儘量減少程式碼重複執行的次數JS
- 快速冪演算法(二分思想減少連乘次數)演算法
- javascript提高效能方式之減少dom元素訪問次數JavaScript
- Java Web效能優化之一:減少DAO層的呼叫次數JavaWeb優化
- 查詢全表掃描語句
- oracle優化:避免全表掃描Oracle優化
- 查詢全表掃描的sqlSQL
- 掃描技術和掃描工具
- 使用索引快速全掃描(Index FFS)避免全表掃描的若干場景索引Index
- Win10系統下掃描器程式無法掃描的解決方法Win10
- delete 刪除資料 全表掃描還是掃描所有塊的測試delete
- 抓取全表掃描的表,篩選和分析
- oracle實驗記錄 (分割槽表,掃描基數的計算)Oracle
- AWVS掃描器掃描web漏洞操作Web
- 大幅減少訓練迭代次數,提高泛化能力:IBM提出「新版Dropout」IBM
- 高效的SQL語句有助於減少資料庫的訪問次數SQL資料庫
- win10系統掃描器提示掃描不到掃描器如何解決Win10
- oracle是如何進行全表掃描的Oracle
- 優化Oracle with全表掃描的問題優化Oracle
- 掃描王 for Mac專業圖片掃描工具Mac
- Nmap掃描教程之基礎掃描詳解
- Withings:2020年全球人們走路的次數減少 但體重卻減輕了
- win10 mcafee怎麼設定排除掃描_win10 mcafee如何設定排除掃描Win10
- 24_Oracle資料庫全表掃描詳解(四)_全表掃描生產最佳化案例三則Oracle資料庫
- eDigitalResearch:手機使用者線下購物的次數日趨減少Git
- Joomla漏洞每天受到黑客16600次掃描攻擊OOM黑客
- 多位數碼管動態掃描原理分析