[英]Advise to improve Query Performance (Oracle)
我有一張表(A),其中有116,317,979條記錄,並且每天在增長,大約每天750,000條記錄。
根據我的要求,我想使用日期列(日期時間存儲在該列中)從表中有效地獲取最近3天的數據。 所以查詢將是
select * from A where date_column >= trunc(sysdate) - 3
我還需要將表A與表B連接起來,這樣
select * from A
left outer join B
on A.X = B.X and A.Y = B.Y and A.Z = B.Z and B.M = 'XYZ' and B.N = 'UIM'
where A.date_column >= trunc(sysdate) - 3
表B的唯一索引和PK(X,Y,Z,M,N)
表A的唯一索引和PK(ID)
表A上建議的IDX 1(date_column)
表A(X,Y,Z)上建議的IDX 2
Time without Indexes 34 sec
Time with IDX 1 32 sec
Time with IDX 1 & 2 27 sec //Sorry about the mistype
通過僅在A.date_column上添加索引,我認為我可以顯着提高性能,但是我的測試結果為負。 除了添加新索引之外,還有其他提示可用來提高性能嗎? 從長遠來看,添加這樣的索引是否有任何危害。
要么
最好創建另一個表,並以某種方式實時填充最后3天的數據(使用db觸發器)。 我可以輕松地通過另一個過程清除每晚3天以上的數據。
提前致謝。
Oracle分區在這里很有意義,但這是一個額外的成本選擇,即使對於企業版也是如此。 如果無法進行分區-保留最近3天的單獨表應該是性能最好的。 你應該試試看。
如果要從索引中獲取最大收益,則可以考慮使用物理參數:
PCTFREE 0
設置為PCTFREE 0
trunc(date_column) >= trunc(sysdate) - 3
根據表A中X,Y,Z的選擇性,也可以壓縮它們。 因此,我建議檢查兩種情況:
create index trunc_date_ai on A(trunc(date_column)) pctfree 0 compress;
+您的IDX2 create index trunc_date_ai on A(trunc(date_column),X,Y,Z) pctfree 0 compress;
pctfree 0
應的情況下,X可以使用,Y,Z不更新在表A. compress
關鍵字這里使壓縮所有4列,所以它利用是值得如果X,Y,Z值在特定TRUNC表A中高度可重復(date_column)。 要強制使用索引,您可以提示查詢,例如:
select --+ index (A trunc_date_ai)
*
from A left outer join B
on A.X = B.X and A.Y = B.Y and A.Z = B.Z and B.M = 'XYZ' and B.N = 'UIM'
where trunc(A.date_column) >= trunc(sysdate) - 3
您應該檢查執行計划,以查看是否正在使用索引。 我猜想沒有使用date_column
上的索引,並且32和34秒之間的區別只是噪音。
我建議為此查詢在A(date_column, X, Y, Z)
上建立索引。
添加索引是否有害? 好吧,它們增加了insert
s / update
s / delete
的開銷。 如果插入是事務性的,則每秒插入約10行-不包括更新和刪除。 如果您的峰值明顯高於該峰值, 並且您的硬件不是很好,那么索引可能會使速度變慢。 如果將其他行分批添加,則不必擔心開銷。
我懷疑將表格分成一個單獨的3天表格是否會帶來很大的不同。 但是為什么要聽我的話? 試試看。 提取最后3天以上的數據,將其轉儲到表中,對其進行正確索引,然后查看查詢是否更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.