大表範圍掃描走SORT MERGE JOIN的SQL優化
SQL文字
select XXXXX
from t1 a
where 1 = 1
and a.flag = '0'
and a.flag2 = '1'
and exists (select 'x'
from t2 b
where b.startno <= t1_certno
and b.endno >= t1_certno
and balanceno in
(select c.balanceno
from t3 c
where 1 = 1
and c.proposalno = '50062000429971'))
order by a.t1_certno
邏輯讀排第一。這個 SQL由於是範圍掃描,因此只能走 SORT MERGE JOIN,幾個小時都跑不出結果。
靠固定執行計劃解決不了問題。
靠固定執行計劃解決不了問題。
要解決問題只能改程式。
其實,給定 proposalno從 t3裡搜出來的資料一般只有幾行,而且每行資料的 startno和 endno也相差不遠。
因此可以將 b.startno <= t1_certno and b.endno >= t1_certno改成t1_certno in “t3裡每行的b.startno和 b.endno之間每一個值”。
也就是先找出所有的 t1_certno所有可能的取值,最後再通過索引從大表 t1找資料。
下面寫了一個方案,開發可以根據需要改寫成能和程式互動的方式,例如寫成函式,返回 table型別的資料等。
set serverout on
declare
tmp t2.startno%type;
i number;
len int;
begin
for c1 in ( select startno, endno from t2 b where balanceno in
(select c.balanceno
from t3 c
where 1 = 1
and c.proposalno = '50062000429971')
) loop
i := to_number(c1.startno);
len := length(c1.startno);
while i <= to_number(c1.endno) loop
-- dbms_output.put_line(lpad(to_char(i), len, '0'));
for c2 in (
select 要查的欄位
from t1 a
where 1 = 1
and a.flag = '0'
and a.flag2 = '1'
and t1_certno = lpad(to_char(i), len, '0')
order by a.t1_certno
) loop
dbms_output.put_line(c2.xxx||' '||c2.xxx||' '||c2.xxx||' '||c2.xxx||' '||c2.xxx||' '||c2.xxx||' '||c2.xxx);
end loop;
i:=i+1;
end loop;
end loop;
end;
/
......
......
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26239116/viewspace-1392049/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL8.0之跳躍範圍掃描MySql
- Insertion Sort and Merge Sort
- 全表掃描和全索引掃描索引
- SonarQube系列-透過配置掃描分析範圍,聚焦關鍵問題
- MySQL中的全表掃描和索引樹掃描MySql索引
- 微課sql最佳化(16)、表的連線方法(5)-關於Merge Join(排序合連線)SQL排序
- Polyphase Merge Sort
- 要命的MERGE JOIN CARTESIAN
- [20200306]hash join會提前終止掃描嗎.txt
- 理解資料庫掃描方法-利用掃描方法對資料儲存進行優化資料庫優化
- 全表掃描和全索引掃描繼續(PG-TiDB)索引TiDB
- PostgreSQL大表掃描策略-BAS_BULKREAD,synchronize_seqscansSQL
- SQL精華總結索引型別優化SQL優化事務大表優化思維導圖❤️SQL索引型別優化
- 24_Oracle資料庫全表掃描詳解(四)_全表掃描生產最佳化案例三則Oracle資料庫
- 【TUNE_ORACLE】列出NL(NESTED LOOPS)被驅動表走了全表掃描的SQL參考OracleOOPSQL
- 掃描器的存在、奧普 掃描器
- SQL 優先順序join>whereSQL
- oracle是如何進行全表掃描的Oracle
- PostgreSQL/GreenPlum Merge Inner Join解密SQL解密
- SQL效能優化的祕訣,快來圍觀,乾貨!SQL優化
- join 查詢優化優化
- SQL優化案例-單表分頁語句的優化(八)SQL優化
- sql merge intoSQL
- AWVS掃描器掃描web漏洞操作Web
- webpack構建優化:縮小檔案搜尋範圍Web優化
- Redis大key掃描Python指令碼RedisPython指令碼
- 非掃描式定位攻擊域內SQL ServerSQLServer
- mysql優化 | 儲存引擎,建表,索引,sql的優化建議MySql優化儲存引擎索引
- group by排序,derived_merge優化的坑排序優化
- mysql驅動表、被驅動表、大表小表及join最佳化MySql
- SQL中Merge的用法SQL
- win10系統掃描器提示掃描不到掃描器如何解決Win10
- 掃描器
- 多表連線的三種方式詳解 hash join、merge join、 nested loopOOP
- Android 基於zxing的二維碼掃描功能的簡單實現及優化Android優化
- [20210220]全索引掃描快速索引掃描的邏輯讀.txt索引
- 掃描王 for Mac專業圖片掃描工具Mac
- 索引掃描可能不如全表掃描的場景的理解__純粹資料量而言,不涉及CLUSTERING_FACTOR索引
- mysql的left join和inner join的效率對比,以及如何優化MySql優化