Схема таблицы:
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 очень дорогая.