設法減少表掃描次數(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 框架的掃描時間框架
- 全表掃描和全索引掃描索引
- O(1)緯度減少迴圈次數
- MySQL中的全表掃描和索引樹掃描MySql索引
- 全表掃描和全索引掃描繼續(PG-TiDB)索引TiDB
- 前端巧用localStorage做“快取”,減少HTTP請求次數前端快取HTTP
- Win10系統下掃描器程式無法掃描的解決方法Win10
- AWVS掃描器掃描web漏洞操作Web
- Withings:2020年全球人們走路的次數減少 但體重卻減輕了
- 快速冪演算法(二分思想減少連乘次數)演算法
- 掃描器的存在、奧普 掃描器
- win10系統掃描器提示掃描不到掃描器如何解決Win10
- 掃描器
- win10 mcafee怎麼設定排除掃描_win10 mcafee如何設定排除掃描Win10
- oracle是如何進行全表掃描的Oracle
- 掃描王 for Mac專業圖片掃描工具Mac
- 大幅減少訓練迭代次數,提高泛化能力:IBM提出「新版Dropout」IBM
- 24_Oracle資料庫全表掃描詳解(四)_全表掃描生產最佳化案例三則Oracle資料庫
- 什麼是漏洞掃描?漏洞掃描功能有哪些?
- 一次調整arraysize減少邏輯讀
- [20210219]全表掃描邏輯讀問題.txt
- python掃描埠Python
- 目錄掃描
- 埠掃描器
- 多位數碼管動態掃描原理分析
- DAST 黑盒漏洞掃描器 第四篇:掃描效能AST
- C++原始碼單詞掃描程式(詞法分析)C++原始碼詞法分析
- 電腦掃描檔案怎麼掃描 win10電腦掃描檔案方法介紹Win10
- PostgreSQL大表掃描策略-BAS_BULKREAD,synchronize_seqscansSQL
- 奧普快票通表票掃描識別系統
- SELECT COUNT(*) 會造成全表掃描?回去等通知吧
- 京東掃描平臺EOS—JS掃描落地與實踐JS
- [20210220]全索引掃描快速索引掃描的邏輯讀.txt索引
- MySQL 減少InnoDB系統表空間的大小MySql
- 埠掃描工具nmap的常用引數講解
- 圖形學 畫直線 DDA掃描法與中點畫線法
- Zenmap(埠掃描工具)
- P2032 掃描
- direasch目錄掃描