簡體   English   中英

建議提高查詢性能(Oracle)

[英]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)列上創建索引並使用compression->,在這種情況下,每個索引數據塊都存儲更多條目。 在這種情況下,最終查詢條件應為trunc(date_column) >= trunc(sysdate) - 3

根據表A中X,Y,Z的選擇性,也可以壓縮它們。 因此,我建議檢查兩種情況:

  1. create index trunc_date_ai on A(trunc(date_column)) pctfree 0 compress; +您的IDX2
  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM