簡體   English   中英

加入時間太長

[英]Join takes too long

我有這個查詢,大約需要5分鍾才能在Oracle中運行:

select t1.A,t2.B,t2.C,t2.D,t2.E 
from TABLE1 t1 join TABLE2 t2 
on t2.X = t1.Y 
where t1.F = <integer> 
and t2.G = <integer> 
and t1.H = <integer> 

t1有170萬行,t2有3100萬行。 我在t2.X和t1.F上有索引。 嘗試在t1.Y,t2.G和t1.H上添加索引,但它們沒有幫助。 有什么想法可以改善此聯接的性能嗎?

查看所有涉及的字段,每個表的覆蓋索引將涉及可能的列

t1: Y, F, H, A
t2: X, G, C, D, E

t2.X,t2.G或t1.Y,t1.F,t1.H中的任何准則的選擇性如何?

如果沒有一個單獨的列具有足夠的選擇性(理想情況下為0.5%或更少),則可能要創建一個或多個涉及多個列的覆蓋索引,例如

t2 (G, X)
t1 (H, F, Y)

注意:索引中列的順序非常重要-始終將最具有選擇性的列(將列數據划分為最不同的集合的列)放在第一位。

您可以通過在索引本身中提供所有必要的列來使索引覆蓋查詢,而以存儲為代價。 這意味着查詢根本不需要返回表數據。

create index ix_t2 on t2 (G,X) INCLUDE (C,D,E)
create index ix_t1 on t1 (H,F,Y) INCLUDE (A)

編輯

好像我在其中插入了SQL Server DDL。 在Oracle中,您必須將索引擴展為t2(G,X,C,D,E)-但這會增加索引使用的選擇性要求,因為索引鍵變得很長。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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