Oracle在执行动态生成的SQL查询时进行扩展

时间:2014-03-13 07:54:56

标签: sql database oracle

我有一个用例,在用户中有一些输入数据,然后在后端根据输入生成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运行。

1 个答案:

答案 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表最有可能被转动。