Оптимизатор запросов sqlite дорогой_функции - PullRequest
0 голосов
/ 16 октября 2018

Схема таблицы:

create table test_table (id int PRIMARY KEY NOT NULL, feature blob)

например, данные:

id      feature
1       blob=bytes[512]=float[128] eg[0.01,111,232....]
2       blob=bytes[512]=float[128] eg[0.02,113,-22....]
3       blob=bytes[512]=float[128] eg[2222,113,-22....]

UDF cosine_distance - это пользовательская функция с двумя аргументами BLOB-объектов.Элементом столбца является блоб для массива с плавающей точкой (float [128]). , Затем я хочу вычислить косинусное расстояние.У меня есть sql с дорогой_функцией cosine_distance (udf) с sqlite.

select cosine_distance(a,?) as distance 
from test_table 
where distance >=? 
order by distance desc limit ?

В этом sql функция cosine_distance будет вызываться дважды в sqlite.Как позволить cosine_distance (дорогостоящей функции) выполняться только один раз?

Когда я использую подвыбор, такой как:

select * from (select cosine_distance(feature,?) d from test_table) nt 
where nt.d>? 
order by nt.d desc limit ?

UDF cosine_distance будет выполняться дважды для каждой записи.

Когда таблица test_table имеет 5 records.cosine_distance, она будет вызываться 10 раз. Но cosine_distance очень дорогая.

1 Ответ

0 голосов
/ 12 февраля 2019

Попробуйте добавить LIMIT для подзапроса, например:

select * from (select cosine_distance(feature,?) as d from test_table limit -1) nt 
where nt.d>? 
order by nt.d desc limit ?

Это может отключить расширение подзапроса в соответствии с правилом 13.

Вариант 2: использованиеСмещение в подзапросе:

select * from (select cosine_distance(feature,?) as d from test_table offset 0) nt 
where nt.d>? 
order by nt.d desc limit ?

Вариант 3: использование ORDER BY в обоих запросах:

select * from (select cosine_distance(feature,?) as d from test_table order by d) nt 
where nt.d>? 
order by nt.d desc limit ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...