【发布时间】:2014-03-13 07:54:56
【问题描述】:
我有一个用例,其中在用户中输入一些数据,然后在后端根据输入生成 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 数据库,但没有数据库连接。所有查询都针对单个数据库运行。
【问题讨论】:
-
您的问题缺少一些重要的细节。什么是 UI 应用程序?您是否可以控制 SQL 的生成方式?最重要的是:您担心什么?您是否对针对数据库运行查询时的性能问题或查询文本超过最大语句长度限制感到怀疑?
-
没有帮助,但这是一个糟糕的设计:让用户生成大量的 OR 查询。
-
@YaroslavShabalin 有某种二维表,根据用户选择的单元格生成一个子句。现在如果用户选择 N 个单元格,则将生成 N 个子句。缩放中的问题。如果用户选择 1000 个单元格,查询会运行很长时间,有时会失败
-
被查询的表有多大?如果有 10k
or子句,会返回多少? (听起来是个可怕的问题,抱歉。) -
您可以尝试在
(someCol1, someColB') or even one bitmap index onsomeCol1` 和someColB上创建一个位图索引。 但是:位图索引在您对表执行大量 DML 的环境中效果不佳。如果索引有帮助,您将需要决定是否可以忍受这些缺点。顺便说一句:您不是加入“数据库”,而是加入 tables。在您的查询中只有一个 table,而不是一个“DB”。