|
一个旧的系统已经到达我们的办公室进行一些更改和修复,但是它也遭受性能问题的困扰。我们不确切知道这种缓慢性的根源是什么。: ?3 d$ v( b2 m' F) O* S
在重构旧代码时,我们发现了一些遵循以下模式的sql查询(出于示例目的,对查询进行了简化):
' T& E; i3 N) q% u! c8 pSELECT: x% D4 G7 }$ v8 ^2 }( `1 p
( e. y7 v$ Z0 L& E
SELECT X0 m1 J" `& h; Y
FROM A+ B, ~, X# a5 h" F
WHERE A.id = TABLE.id/ [* F0 h' S4 g
) AS COLUMN1,, @: d4 T, S. U0 N
(
# M& A& u& e& V. E r( f SELECT Y
# U7 @& I% m$ M6 F" t2 b2 m+ i FROM B, t0 n# W8 t" U! x3 P1 G
WHERE B.id = TABLE.id6 V6 j! K8 z$ O0 @
) AS COLUMN1,
: o3 o: {4 @' T (* ]2 m8 S5 ~- s& I
SELECT Z, h9 \: C. F' z0 V5 x) w, k9 i
FROM C
. Y$ G3 T. z# O/ c WHERE C.id = TABLE.id
* U9 C% |0 M6 m5 z8 d: W( m ) AS COLUMN1,! F9 Z9 S4 ]- Z3 q- l
...( j z8 s) I7 t7 L9 k
FROM
. j% h# P) }$ B TABLE
5 ^/ c! `& e0 \5 c9 |3 yWHERE
/ W& ~, }; j/ z! P9 F TABLE.id = @param;1 U( D- I* Q0 Y6 U+ E0 s: `9 {
这些查询从它们返回的 每一 列中进行几个内部子查询。9 c2 ]6 j! [, H5 u" R; x3 @4 [8 A
我们计划按照以下模式重写这些查询:6 b Y! l6 Z1 g1 W6 @$ e
SELECT
: F1 n6 ?( F6 t A.X, B.Y, C.Z
9 R5 q+ a1 L7 u8 i3 T( _FROM& O% v' |. K6 m# s0 o/ N
TABLE+ m& `: \" O& {7 B, {9 {
INNER JOIN A on A.ID = TABLE.ID- V/ C$ e! S& o% v7 N( E* m
INNER JOIN B on B.ID = TABLE.ID) U0 p/ x; c1 A; Z. n
INNER JOIN C on C.ID = TABLE.ID
0 a# b: E2 k* a- G( v% O& G& uWHERE
9 @/ @3 J, p5 c; p: F TABLE.id = @param;
% W& {: ]' ], e: W使用内部联接,它们 更易于阅读和理解' _1 F) @$ h, e# [
,但是真的更快吗?这是写它们的更好的方法吗?不幸的是,我们改写的第一个查询并没有缩短查询时间,这使查询速度变慢了。; @( M5 V3 M6 H, ^
这是我的问题:我们应该重写所有这些查询吗?这些子查询是完成这项工作的好方法吗?它们在内部联接方式上是否更快?
# V2 e$ D: _. s$ r' v8 Q- A$ U
% Y0 a8 E7 |! Z2 h2 [4 H解决方案:
% {0 p! p- `1 W7 u0 g( J! z
% u" l( M- v3 a( h3 m
0 D4 L3 L! E, ^8 g" s8 [" r8 q- H' a' u _: B. {
如果我正确理解了您的问题,那么您将开始重写某些SQL语句的操作,因为您认为它们可能存在问题。) b$ d" @0 `1 N( i) `
我的建议是停止并首先开始确定您当前在哪里花费时间。只有在发现带有这些标量子选择的查询中,并且是由于这些标量子选择之后,才应该重写它们。在此之前:开始跟踪和检查。- _; B& ^6 X; E* |# {
这是OTN的两个线程,用于指导有性能问题的人员:
& ?8 d; ?& L# Y H" A, chttp://forums.oracle.com/forums/thread.jspa?messageID=1812597+ o1 ?8 [- r* m) e; }+ Z
( _0 T8 Q$ s3 Q4 ~7 G. ehttp://forums.oracle.com/forums/thread.jspa?threadID=863295
& t9 z F" {# b1 y9 b. U问候,
5 }" f2 N4 i3 R罗布。. W+ e" {% u. y& d
并且:由于标量子查询缓存,您的原始查询可能比使用联接的重写查询快得多。 |
|