簡體   English   中英

Oracle在執行動態生成的SQL查詢時進行擴展

[英]Oracle scaling while executing dynamically generated SQL queries

我有一個用例,其中在用戶中一些輸入數據,然后在后端根據輸入生成SQL查詢。

用戶輸入多個過濾條件,這些條件將轉換為新的子句。例如(someCol1='valA' and someColB ='valP' )

用戶可以輸入10000個子句,數據庫就會命中。

例如

select * from table where  (
(someCol1='valA' and someColB ='valP' ) OR
(someCol1='valB' and someColB ='valQ' ) OR
(someCol1='valC' and someColB ='valR' ) OR
(someCol1='valD' and someColB ='valS' ) OR
....
(someCol1='valE' and someColB ='valT' ) OR
)

問題是子句數量很大(大約1000條)時執行時間會增加。響應時間可能長達5分鍾,但工作永遠不會失敗。

我正在使用Oracle數據庫,並且沒有數據庫聯接。 所有查詢針對單個數據庫運行。

我建議使用帶過濾器的臨時表。

如果您的過濾器數量很少(SomeCol1,SomeColB等),則可以將過濾器存儲在“平面”表中:

FLTRS_TMP ( filter_seq_id, SomeCol1_id, SomeColB_id, ... )

然后,您可以在特定列上聯接表:

select * from FACT_TABLE F, FLTRS_TMP FT
 where nvl(F.SomeCol1_id,'!null!') = nvl(FT.SomeCol1_id,'!null!')
   and nvl(F.SomeColB_id,'!null!') = nvl(FT.SomeColB_id,'!null!')
   and ...

但是,如果過濾器的數量相對太大,則可以考慮將過濾器放置在類似屬性(未透視)的表中:

FLTRS_TMP ( filter_seq_id, filter_family_seq_id, column_name, column_value )

filter_family_seq_id用於對AND條件進行分組(分隔不同的OR條件)。 如果要使用其他運算符,則可以添加operator_id列。 最后,在與FACT_TABLE聯接之前,最有可能對FLTRS_TMP表進行透視。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM