我正在尝试在选择子查询中使用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)
我做错什么了吗?
答案 0 :(得分:1)
首先,您的问题中还有一些有关您的情况的信息。
order_id
是什么数据类型?是浮点数(单,双精度)还是文本(varchar
,char
,文本blob
)? 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函数的第二和第三参数已交换。