Performance

為什麼此 SQL 在具有相同硬體/數據的 Oracle 伺服器中比另一台 Oracle 伺服器執行得更快?

  • January 2, 2015

我的應用程序有一個 SQL,需要大約 30 分鐘才能在生產環境中的 Oracle 伺服器中執行。在測試 Oracle 伺服器中需要的時間大致相同。

出於某種原因,在另一台 Oracle 伺服器上,它執行得更快:只有 5 分鐘左右!

這些時間實際上僅適用於 SQL(沒有應用程序處理成本)。我是從 Oracle Enterprise Manager 獲得的。此外,它們是一致的,即如果您再次執行 SQL,您將獲得大致相同的時間。

硬體、Oracle 版本(10g)、數據在這三台伺服器中是相同的。甚至 SQL 執行計劃也完全相同。

是什麼讓 SQL 在該測試環境中執行得如此之快?

SQL 是一個 MERGE:

MERGE /*+ USE_NL(DORMANT_POINTS) */
INTO MKT_CURVE_POINT DORMANT_POINTS
USING (SELECT
// big select   
) ACTIVE_POINTS
   ON (
// ..
)
WHEN MATCHED THEN
UPDATE
SET DORMANT_POINTS.ACTIVE_PARENT_PRICE = ACTIVE_POINTS.ACTIVE_PARENT_PRICE
WHERE DORMANT_POINTS.ACTIVE_PARENT_PRICE <>
ACTIVE_POINTS.ACTIVE_PARENT_PRICE;

我懷疑這與記憶體有關。與快速執行 SQL 的伺服器中的物理讀取相比,我注意到大量的緩衝區獲取。在執行緩慢的伺服器中,該比率較低。

什麼可以解釋這種巨大的性能差異?

並發、鎖定和閂鎖可能會起作用。我假設生產伺服器正在做其他事情而不是等待這個特定的查詢?

記憶體策略是否設置為自動?也許生產伺服器分配了不同的 SGA 池。

這也是共享池和緩衝區記憶體中實際包含哪些數據的問題。測試伺服器可能在緩衝區中有更多相關數據,不會被其他生產查詢刷新。

然後是硬體配置。像回寫記憶體這樣簡單的東西可能會產生巨大的影響。

雖然很有趣,但我們不要把所有的時間都浪費在猜測上。用完整的時間跟踪查詢,看看到底發生了什麼:)

引用自:https://serverfault.com/questions/84136