我正在执行以下查询,其中包含运算符内的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。 此查询工作非常慢,有时会抛出异常。有没有其他方法来编写此查询。
答案 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/(第二点)
关于表现不佳,我有以下问题: