20張表每張表都有保單號。每張表資料不一樣。有大有小。大的可能5、6千萬以上。如果快速把所有表的保單生成一張表。要性能
uj5u.com熱心網友回復:
不同的表怎么union? 性能不是針對表/視圖這些物件來講的,性能是針對程式,也就是針對SQL來講的,可以說只有知道程式如何訪問物件的情況下,才能做性能優化uj5u.com熱心網友回復:
不能簡單的 union ,這個不現實的。首先,要實作你的需求,其次,才是性能的調整。
源資料長什么樣,你的結果又想要什么樣,都要明確。
uj5u.com熱心網友回復:
我需要的就是把這20張表里面所有的保單號全部生成一張臨時表。因為為擔心有漏掉的資料,所以所有表都要過一下。簡單的陳述句就是
create table tmp
as
select 保單
from(select 保單 from tab1
union select 保單 from tab2
......
......
union select 保單 from tab20
)tmp
擔心性能問題,希望能有一個好的解決辦法。
uj5u.com熱心網友回復:
如果只是單個欄位生成一張臨時表那沒有問題。但是你說的性能到底指的是什么東西的性能?是生成臨時表的性能,還是臨時表之后被查詢的性能?
uj5u.com熱心網友回復:
1、是SQL本身的性能、這樣作對資料庫的壓力、2、是這20張表其實重復率很高,很可能三張表就已經包含所有保單了。更希望是能找到一個種更好的辦法實作
uj5u.com熱心網友回復:
SQL本身是什么SQL?
uj5u.com熱心網友回復:
如果能確保多張表中的保單號不重復,用union all 不要用union因為union內部需要排序,20張5千萬的表加在一起排序挺恐怖的
create table tmp
as
select 保單 from tab1
union all select 保單 from tab2
......
......
union all select 保單 from tab20
如果要去重復 建議先建好tmp表,并給tmp表的這個欄位建立 unique 索引
然后依次插入各表的資料
insert into tmp select 保單 from tab1 where not exists(select 1 from tmp where tmp.保單 = tab1.保單);
insert into tmp select 保單 from tab2 where not exists(select 1 from tmp where tmp.保單 = tab2保單);
insert into tmp select 保單 from tab3 where not exists(select 1 from tmp where tmp.保單 = tab3.保單);
...
insert into tmp select 保單 from tab20 where not exists(select 1 from tmp where tmp.保單 = tab20.保單);
此外 可以試試 insert /*+APPEND*/ into ……
uj5u.com熱心網友回復:
作20次的not existsuj5u.com熱心網友回復:
有唯一索引其實還好,比你20張表加起來十幾億資料排序好多了。
你的union ,排序最快的復雜度是 O(nlogn) 這里 n=1e10
有唯一索引的情況下,如你所說,3張表其實已經基本全了,那么后面17張表進行not exists運算,相當于先全表掃描然后逐一進行二分法查找 復雜度為O(17logn) 這里 n=6e8
uj5u.com熱心網友回復:
1.union涉及排序操作,很影響性能。所以盡量使用union all代替union。2.插入方法有三種
(1) 如果20張表的資料量都非常少,可以使用:
create table tmp
select distinct 保單號
from (
select 保單號 from tab1
union all
select 保單號 from tab2
union all
....
select 保單號 from tab20
)
(2) 表資料量大的話,建議單獨插入:
create table tmp as select 保單號 from tab1;
insert into tmp values(保單號) select 保單號 from tab2;
commit;
insert into tmp values(保單號) select 保單號 from tab3;
commit;
....
insert into tmp values(保單號) select 保單號 from tab20;
commit;
最后記得對tmp表的報表號作去重處理。
(3) 還可以使用存盤程序,動態查詢含有保單號的表、欄位,使用動態SQL拼接后插入。
uj5u.com熱心網友回復:
我咋覺得這個問題有點越來越歪的跡象……樓主從一開始就放出的是自己的猜測,沒有實際描述自己的需求和遇到的問題,能否再詳細描述一遍原始的需求和實施“union” 方案之后遭遇到的問題?
uj5u.com熱心網友回復:
樓主應該其實就是想怎么高效的處理20張表的去重問題,樓主想用union ,想問問還有沒有更好的方法,被各位夸大化了吧涉及到去重,很難達到樓主想的高效吧
如果20張表,資料重復度很高,我覺得可以直接20張表一路union下來
如果重復度不高,那就先全部union all 然后distinct吧
建表的方法除非資料量非常大,用時間換記憶體空間
uj5u.com熱心網友回復:
樓主說了,大的表五六千萬,小的表起碼也在百萬級吧
uj5u.com熱心網友回復:
union應該就是最好的方式了uj5u.com熱心網友回復:
先去重再uniall再去重吧uj5u.com熱心網友回復:
如果要把資料插入到臨時表,就不用UNION了,先創建空表,然后對每個表分別執行INSERT插入就可以了,插入時可以用/*+ APPEND */,后面增加NOLOGGING禁止產生日志,SELECT 后面用/*+ PARALLEL */增加并行,可以在晚上做,當然要注意UNDO表空間是否足夠。轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/63598.html
標籤:開發
上一篇:關于把兩張表的內容合成視圖的撰寫
