Как выполнять сложные запросы в Tarantool - PullRequest
0 голосов
/ 05 декабря 2018

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

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

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

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

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

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

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

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

Спасибо!

1 Ответ

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