Firebird查询需要非常长的时间来处理

时间:2016-06-16 12:17:15

标签: sql firebird

我正在执行以下查询,其中包含运算符内的3000个条件。

select * from Orders a where a.key 
 in(101,155,16,45,778,9,8,67,1,44,455,56,88,888,8888,88888,77777,77,78, 3000) 

里面的数值是3000。 此查询工作非常慢,有时会抛出异常。有没有其他方法来编写此查询。

3 个答案:

答案 0 :(得分:2)

您可以通过创建global temporary table并将值插入GTT来解决此问题。您只需创建一次,然后可以将其重新用于所有查询。它将在事务结束时自动清空,并且值仅对您当前的连接可见。

例如:

create global temporary table temp_keys (
   keyvalue integer primary key
)

请注意,我添加了primary key,因为您不需要重复项,而且还会创建索引。

然后,您可以使用值填充它并在查询中使用它。

select * 
from Orders a
inner join temp_keys b on b.keyvalue = a.key

您需要在同一个交易中完成所有这些操作,否则您需要创建一个GTT on commit preserve rows,这将保留值,直到您的连接关闭。

这可能并不总是更快(因为必须先将密钥插入GTT的开销)。

至于您偶尔会遇到的错误,这是因为IN子句中的项目数最多为1500项,请参阅Firebird 2.5语言参考中的Predicates, IN

答案 1 :(得分:1)

您可以使用临时表,将密钥加载到表中,然后将其加入查询中的订单。

答案 2 :(得分:0)

以下是Mark

提到的IN子句中元素数量限制的链接

http://www.firebirdfaq.org/faq175/(第二点)

关于表现不佳,我有以下问题:

  1. 您是否在'key'列上有索引?
  2. 经常更改表格中的数据吗?