回答

收藏

加入时间太长

技术问答 技术问答 129 人阅读 | 0 人回复 | 2023-09-13

我有此查询,大约需要5分钟才能在Oracle中运行:2 Z( @9 d: |: a% |  _
select t1.A,t2.B,t2.C,t2.D,t2.E   z- {' d! l, K1 v* x2 _* _: k$ a
from TABLE1 t1 join TABLE2 t2 ; U* D6 l! j% _2 E3 O+ A. h. _
on t2.X = t1.Y
5 j/ c/ N. U6 e% q$ c0 T$ _* J; vwhere t1.F = <i> . p6 |% M9 a" A, T
and t2.G = <i> * K4 v$ ?$ o4 x* n" q
and t1.H = <i># Q6 k6 ?' y3 p
t1有170万行,t2有3100万行。我在t2.X和t1.F上有索引。尝试在t1.Y,t2.G和t1.H上添加索引,但它们没有帮助。有什么想法可以改善此联接的性能吗?8 a( d5 Q- o+ @& M
               
# R5 c. U0 W! k7 R6 H+ Y解决方案:
9 v7 u9 G  c3 ^$ H  ?/ F8 k( W# p( `               
! X( r6 w$ |* `$ S* D' t( M9 T4 F
/ T9 t. Q  A& R  Q7 I$ R7 \/ S; C: J3 C' w4 B  o. b
                查看所有涉及的字段,每个表的覆盖索引将涉及可能的列& p9 e+ a$ Z4 f- J0 H  u
t1: Y, F, H, A! F' T9 T4 F0 o
t2: X, G, C, D, E7 ?* O1 R) K) u$ R" [# G
t2.X,t2.G或t1.Y,t1.F,t1.H中的任何准则的选择性如何?
7 D7 u+ F+ `/ \/ r如果没有一个单独的列具有足够的选择性(理想情况下为0.5%或更少),则可能要创建一个或多个涉及多个列的覆盖索引,例如
9 [( ^+ j( u# \, u+ @t2 (G, X)1 [4 {4 x$ U( f9 ?/ o" j9 s# p- ]
t1 (H, F, Y)9 D" e5 {+ p7 {4 A  v( ^
注意: 索引中列的顺序非常重要-始终将最有选择性的列(将列数据划分为最不同的集合的列)放在第一位。) o; E% E5 E9 C
您可以通过在索引本身中提供所有必要的列来使索引覆盖查询,而以存储为代价。这意味着查询根本不需要返回表数据。
% o( h( l/ J, a+ B; u" k0 Acreate index ix_t2 on t2 (G,X) INCLUDE (C,D,E)/ C* i4 _0 K+ A: Z' ?5 m- S
create index ix_t1 on t1 (H,F,Y) INCLUDE (A)3 [2 W/ F; E; C6 ]% k  _" j
编辑
7 }0 o4 f( V% Y: L2 r好像我在其中插入了SQL Server
% P) ?' O4 w. W0 iDDL。在Oracle中,您必须将索引扩展为t2(G,X,C,D,E)-但这会增加索引使用的选择性要求,因为索引键变得很长。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则