Слишком большое время запроса с использованием замены в запросе выбора - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь использовать функцию REPLACE в подзапросе выбора, но это занимает слишком много времени.Если я не использую REPLACE в подзапросе, это намного быстрее.Мне нужно использовать REPLACE, чтобы изменить значение order_id с «.001» на «.000», чтобы сделать первый пример выбора

, который быстро загружается

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

, что я пытаюсь, нозагрузка занимает 100 лет

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 ]

1 голос
/ 28 июня 2019

Прежде всего, есть некоторая информация о вашей ситуации, пропущенная в вашем вопросе.

  1. Что такое тип данных order_id? это с плавающей запятой (одинарный, двойной) или текст (varchar, char, текст blob) ???
  2. Какие у вас показатели по этим двум таблицам?
  3. Что query plans порождает оба ваших запроса?

Обычно IN плохо работает с большими списками в Interbase / Firebird, и обычно его лучше заменить объединением таблиц. Иногда даже используется Global Temporary Tables для хранения списка идентификаторов.

Попробуйте это:

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

Понятия не имею, какая разница между «поиском по индексу» и «поиском по индексу» должна составлять

здесь есть две ссылки для чтения

Последний написан на русском языке и написан в 2006 году разработчиком ядра Firebird. Я считаю, что он был переведен на английский, но не нашел его. Прочитайте это через http://Translate.ru

0 голосов
/ 27 июня 2019

попробуйте это:

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

обратите внимание, что 2-й и 3-й параметры функции REPLACE поменялись местами.

...