Performance
為什麼此 SQL 在具有相同硬體/數據的 Oracle 伺服器中比另一台 Oracle 伺服器執行得更快?
我的應用程序有一個 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 池。
這也是共享池和緩衝區記憶體中實際包含哪些數據的問題。測試伺服器可能在緩衝區中有更多相關數據,不會被其他生產查詢刷新。
然後是硬體配置。像回寫記憶體這樣簡單的東西可能會產生巨大的影響。
雖然很有趣,但我們不要把所有的時間都浪費在猜測上。用完整的時間跟踪查詢,看看到底發生了什麼:)