我有一个用例,在用户中有一些输入数据,然后在后端根据输入生成SQL查询。
用户输入多个过滤条件,并将其转换为新条件
clause.Eg (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数据库,并且没有数据库连接。所有查询都针对单个DB运行。
答案 0 :(得分:0)
我建议使用带过滤器的临时表。
如果你有少量的过滤器(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表最有可能被转动。