Как выполнять сложные запросы в Tarantool

Я всегда работал с реляционными БД и недавно решил перенести сервис, критичный к производительности, с SQL Server на Tarantool с надеждой воспользоваться преимуществами быстрого поиска и обработки в памяти. У меня есть пара вопросов при планировании миграции.

У меня есть таблица с около миллиона записей, содержащих информацию о ценах, что означает, что я имею дело в основном с числами и uuids. Во-первых, мне нужно выполнить выборку, содержащую несколько условий, чтобы получить подмножество данных, например

SELECT * FROM rates WHERE SupplierId = @SupplierId AND ProductId = @ProductId AND (LocalDistributionZoneId = @LocalDistributionZoneId OR LocalDistributionZoneId IS NULL)

Q1: Какова стратегия выполнения такого запроса в Lua? Создаю ли я индекс для каждого поля в предикате, или я могу использовать один вторичный составной индекс?

Вопрос 2: Будет ли удобнее выполнять такой запрос в SQL (box.sql.execute), а не в чистом Lua? Это будет значительно медленнее, чем выполнение того же запроса в чистом Lua?

В3: Если я использую SQL, можно ли пересмотреть план исполнения, чтобы убедиться, что выполняемый запрос действительно использует индексы, которые я определил в пространстве?

Хорошо, после того, как я получил результаты первого запроса, мне нужно проанализировать данные, а затем, основываясь на результатах анализа, выполнить еще один запрос к набору данных, возвращенному первым запросом.

Q4: Может ли Tarantool помочь мне в работе с промежуточным набором данных? Более конкретно, могу ли я как-то выполнить больше запросов к промежуточному подмножеству кортежей, используя индексы, созданные в пространстве? Или мне нужно было бы реализовать альтернативные стратегии, такие как повторное добавление результатов интрима во временное пространство с предварительно определенными индексами, а затем сделать другой выбор или осуществить дополнительный поиск самостоятельно?

Спасибо!

1 ответ

Решение
  1. Не. Используйте SQL, это быстрее: он не создает объекты для сбора мусора для промежуточных результатов выполнения.
  2. Да, пожалуйста, используйте наши возможности SQL для этого.
  3. Используйте оператор EXPLAIN.
  4. Я не знаю, что именно вы подразумеваете под "помощью". Вы можете попробовать любую стратегию, которая работает лучше всего: создать более сложный запрос, сохранить исходный запрос в представлении для использования в результирующем запросе, создать временную таблицу и работать с ней. Чтобы получить более подробную информацию, давайте посмотрим, достаточно ли хорош план выполнения, выбранный Tarantool, или вам нужно оптимизировать его вручную.
Другие вопросы по тегам