在选择查询上使用替换查询时间过长

时间:2019-06-27 18:03:04

标签: sql firebird

我正在尝试在选择子查询中使用REPLACE函数,但是花费的时间太长。如果我在子查询中不使用REPLACE,它将更快。我需要使用REPLACE将order_id从'.001'更改为'.000'才能进行第一次选择

加载速度快的示例

select product 
from orders 
where order_id in (select order_id 
                   from orders 
                   where customer_id = 10)

我正在尝试什么,但是加载需要花费很多时间

select product 
from orders 
where order_id in (select REPLACE(order_id,'.001','.000') as order_id_new 
                   from orders  
                   where customer_id = 10)

我做错什么了吗?

2 个答案:

答案 0 :(得分:1)

首先,您的问题中还有一些有关您的情况的信息。

  1. order_id是什么数据类型?是浮点数(单,双精度)还是文本(varcharchar,文本blob)?
  2. 在这两个表上有哪些索引?
  3. 两个查询都产生什么query plans

通常,IN在Interbase / Firebird中的大型列表上效果较差,通常最好用联接表代替。有时甚至使用Global Temporary Tables保留ID列表。

尝试一下:

With O2 as (
   select DISTINCT REPLACE(order_id,'.001','.000') as order_id 
     from orders
     where customer_id = 10
)
Select O1.product 
  from orders O1
  join O2 on O1.order_id = O2.order_id
  

我不知道“索引扫描”和“索引搜索”之间的区别是什么

这里有两个链接可供阅读

后者是俄语,由Firebird核心开发人员于2006年撰写。我相信它已被翻译成英文,但没有找到。通过http://Translate.ru

进行阅读

答案 1 :(得分:0)

尝试:

select product 
from orders 
where REPLACE(order_id,'.000','.001') in (select order_id as order_id_new 
                                          from orders  
                                          where customer_id = 10)

请注意,REPLACE函数的第二和第三参数已交换。