Sql 使用“选择查询时替换”查询时间过长

Sql 使用“选择查询时替换”查询时间过长,sql,firebird,Sql,Firebird,我试图在select子查询中使用REPLACE函数,但它花费的时间太长。如果在子查询中不使用REPLACE,速度会快得多。我需要使用REPLACE将订单id从.001更改为.000以进行第一次选择 快速加载的示例 select product from orders where order_id in (select order_id from orders where customer_id = 10) 我正

我试图在select子查询中使用
REPLACE
函数,但它花费的时间太长。如果在子查询中不使用
REPLACE
,速度会快得多。我需要使用
REPLACE
将订单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)
我做错什么了吗?

试试这个:

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函数的第2个和第3个参数是交换的。

首先,您的问题中遗漏了一些有关您的情况的信息

  • 订单id的数据类型是什么?它是浮点(单、双)还是文本(
    varchar
    char
    ,text
    blob
  • 在这两张表上你有什么指数
  • 您的两个查询都生成了什么
    查询计划
  • 通常,中的
    在Interbase/Firebird中的大型列表上效果不佳,通常最好用连接表替换。有时甚至使用
    全局临时表
    来保存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年编写。我相信它被翻译成了英语,但没有找到。通过

    使用REPLACE阅读它。如果您将查询设置为非SARGableOK,您是否推荐其他内容?示例数据、所需结果和逻辑解释会有所帮助。两个查询是否返回相同的行数?@LukaszSzozda:第二个查询仍然可以使用
    orders.order_id
    上的索引(如果适用)。