Параметризованные запросы

YDB поддерживает и рекомендует к использованию так называемые параметризованные запросы. В таких запросах данные передаются отдельно от самого тела запроса, а в SQL-запросе используются специальные параметры для обозначения местоположения данных. Планы параметризованных запросов кешируются на стороне сервера (по умолчанию — до 1000 записей), что позволяет переиспользовать планы для однотипных запросов, которые отличаются лишь значением параметров.

Во многих YDB SDK кеширование параметризованных запросов включено по умолчанию. При необходимости его можно отключить, установив для параметра KeepInCache значение false.

Запрос с данными в теле запроса:

SELECT sa.title AS season_title, sr.title AS series_title
FROM seasons AS sa INNER JOIN series AS sr ON sa.series_id = sr.series_id
WHERE sa.series_id = 15 AND sa.season_id = 3

Соответствующий ему параметризованный запрос:

DECLARE $seriesId AS Uint64;
DECLARE $seasonId AS Uint64;

SELECT sa.title AS season_title, sr.title AS series_title
FROM seasons AS sa INNER JOIN series AS sr ON sa.series_id = sr.series_id
WHERE sa.series_id = $seriesId AND sa.season_id = $seasonId

Параметризованные запросы записываются в форме шаблона, в котором определенного вида имена заменяются конкретными параметрами при каждом выполнении запроса. Лексемы начинающиеся со знака $ такие, как $seriesId и $seasonId в запросе выше, используются для обозначения параметров.

Параметризованные запросы обеспечивают следующие преимущества:

  • При повторяющихся запросах сервер базы данных имеет возможность кешировать план запроса для параметризованных запросов. Это радикально снижает потребление CPU и повышает пропускную способность системы;
  • Использование параметризованных запросов спасает от уязвимостей вида SQL Injection.
  • Сокращение кода — меняются только аргументы запроса, но не сам запрос. Не требуется ручная конкатенация строки запроса.

Смотрите также