[英]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.