Oracle

代替靜態列表,對 IN 鍵使用表選擇結果

  • April 5, 2014

我對某些查詢使用靜態列表 WHERE 子句,例如

WHERE STypeID IN ('12', '13', '14', '265')

此列表將來會更改;將添加新值。當列表更改時,我不想檢查所有要更改此列表的查詢,而是想從 1 個地方控制此列表;所以我創建了一個有兩列的表;鍵和值,將我的靜態值插入到表中。

     Key             Value

SupportedTypeID        12  
SupportedTypeID        13  
SupportedTypeID        14  
SupportedTypeID        265

我修改了我的where子句

WHERE STypeID IN (SELECT Value FROM LOVs WHERE Key LIKE 'SupportedTypeID')

但這會導致性能問題;查詢結果來得太晚了。

在大多數情況下,用 EXISTS 子句替換 IN 子句可以提高性能。嘗試這個:

WHERE exists (SELECT 1 FROM LOVs WHERE value = STypeID )

WHERE STypeID IN(從 LOV 中選擇值 WHERE Key LIKE ‘SupportedTypeID’)

使用 IN 子句退出,只需加入您的表。在您的 ON 子句中使用 AND 將連接表的行過濾到您感興趣的行。

INNER JOIN LOVs
ON LOVs.Value = STypeID
AND LOVs.Key = SupportedTypeID

此外,為了進行性能調整,請對 SQL:BatchCompleted 和 RPC:Completed 事件使用 SQL Server Profiler,並查看 Reads、Writes、CPU 和 Duration 列。

引用自:https://dba.stackexchange.com/questions/60093