2011-01-12 106 views
0

通常需要根據某些指定的值完成數據庫中的搜索。對於這個問題,請考慮有一個表格,其中包含多個鍵K = {K1, K2 ... Km}和一些元列C = {C1, C2 ... Cn}。元列不包含在任何密鑰中。在搜索標準被定義爲S = {Ki, Cj1, Cj2 ... Cjh}的地方,什麼是優雅而有效的方式來執行查詢?複雜的Oracle SQL搜索查詢優化

澄清:

  • 元列是不是關鍵的一部分的任何柱;
  • S是一個搜索條件,它總是隻包含一個關鍵和可選的元列進行過濾;

現實生活中的例子(故事處理系統):

  • 鍵:時間範圍,story_id
  • 元列:標題,記者,編輯,...

要求是能夠使用爲元列提供的任意數量的可選過濾器來搜索任何密鑰。

可能的解決方案:

  • 一種解決方案是使用動態SQL。考慮這些reasons並不是首選。
  • 使用存儲過程,每個鍵一個過程。因爲只有元列的子集被指定,所以可以使用用於元列的table.column = NVL(paratemers.column, table.column)類型的表達式。我不確定Oracle是否會優化該部分查詢,以避免在parameters.columnNULL時進行比較 - 這是問題的一部分。如果是的話,那也許是解決問題的方法。

有什麼優雅的解決方案不會犧牲性能嗎?

+0

很難看到你在做什麼。我認爲這取決於密鑰的密度 - 如果稀疏,那麼密鑰上的索引應該是有效的。 – Randy 2011-01-12 14:38:59

+3

你能舉一個真實生活的佈局嗎?在這種情況下,對於我來說什麼是元列或「S = {Ki,Cj1,Cj2 ... Cjh}」並不明顯。 – Quassnoi 2011-01-12 14:42:46

回答

1

帶綁定變量的動態SQL是要走的路。您發佈的「原因」鏈接正確地說明了動態SQL與連接值的關係 - 雖然其標題確實表明它指的是所有動態SQL。事實上,接着展示瞭如何使用綁定變量來執行動態SQL:

"SELECT * FROM SomeTable Where Field1 = @FirstValue AND SecondField = @SecondField" 

現在,當一些標準(或「元柱」爲你呼喚他們出於某種原因)是可選的,你可以建立基於已經指定的值的動態SQL,並在運行時綁定值。