【DB筆試面試587】在Oracle中,常規游標共享和自適應游標共享的聯繫和區別有哪些?

  • 2019 年 10 月 10 日
  • 筆記

題目部分

在Oracle中,常規游標共享和自適應游標共享的聯繫和區別有哪些?

答案部分

從嚴格意義上來說,常規游標共享和自適應游標共享是各自獨立的,兩者之間沒有必然的聯繫。

常規游標共享的目的是通過使用系統產生的綁定變量替換目標SQL的SQL文本中的具體輸入值,以達到在不改一行應用代碼的情況下,使那些僅僅是SQL文本的WHERE條件或者VALUES子句(適用於INSERT語句)中的具體輸入值不同的目標SQL彼此之間共享解析樹和執行計劃。而自適應游標共享的目的在於通過適時觸發硬解析的動作來緩解綁定變量窺探所帶來的副作用。

在Oracle 11g中,對於使用了綁定變量的目標SQL而言,不管這個綁定變量是該SQL自帶的還是開啟常規游標共享後系統產生的,只要滿足一定的條件(比如綁定變量窺探被開啟,該SQL中使用的綁定變量的數量不超過14等),自適應游標共享就能生效。例如,如果參數CURSOR_SHARING的值為EXACT,那麼必須在目標SQL使用自定義的綁定變量後自適應游標共享才能生效;而當參數CURSOR_SHARING的值為FORCE時,即使目標SQL沒有使用自定義的綁定變量,自適應游標共享也能生效。

在自適應游標共享被開啟的情況下,Oracle並不推薦將CURSOR_SHARING的值設為SIMILAR,因為當把CURSOR_SHARING的值設為SIMILAR後,對自適應游標共享可能有不好的影響,因為SIMILAR本來就是一個即將過時的值,它有太多的副作用,無論什麼時候都不要將CURSOR SHARING的值設為SIMILAR。

本文選自《Oracle程序員面試筆試寶典》,作者:李華榮。