Фасет BUCKETS¶
Этот фасет может быть использован для просмотра
бакетов, которым соответствует
запрошенная порция данных. Например, в SELECT на вычисление бакетов влияют
условия WHERE, а в INSERT сами вставляемые данные определяют бакеты.
Возможными значения вывода фасета BUCKETS являются:
any— запрос может быть выполнен на любом узле.- множество
= [...]— для запроса удалось рассчитать точные бакеты, на которых он будет исполняться. - множество
<= [...]— означает, что запрос может быть исполнен на подмножестве указанных бакетов. Иными словами, выведенные бакеты представляют собой верхнюю границу множества бакетов, использующихся при исполнении запроса.
Примеры¶
Подготовка тестового окружения
Примеры использования команд включают в себя запросы к тестовым таблицам.
Ниже представлены примеры запросов для каждого возможного значения.
any¶
EXPLAIN (BUCKETS) SELECT name, id FROM _pico_table;
buckets = any
Из вывода следует, что запрос может исполниться на любом узле, в том числе и локально.
Множество = [...]¶
EXPLAIN (BUCKETS) SELECT * FROM foo WHERE id in (42, 88, 99);
buckets = [388, 587, 2426]
Планировщик смог точно вычислить бакеты, на которых лежат необходимые данные.
Множество <= [...]¶
EXPLAIN (BUCKETS) SELECT * FROM warehouse;
buckets <= [1-3000]
Вывод фасета BUCKETS является верхней границей множества бакетов, на которых
исполняется запрос.
Транзакционные блоки¶
Для транзакционного блока фасет BUCKETS выводит объединение бакетов всех
запросов блока:
EXPLAIN (BUCKETS)
DO $$ BEGIN
RETURN QUERY SELECT * FROM foo WHERE id = 1;
DELETE FROM foo WHERE id = 2;
END $$;
buckets = [1410, 1934]
Бакеты каждого запроса по отдельности можно увидеть при помощи фасета
RAW.
Обратите внимание: исполнить такой блок нельзя — транзакция выполняется на одном
бакете, и запросы выше указывают на разные. Тем не менее EXPLAIN позволяет
увидеть, на какие бакеты идут запросы.
Форматирование¶
Если список бакетов не умещается в одну строку, его можно разбить с помощью
опции FMT:
EXPLAIN (BUCKETS, VERBOSE, FMT) SELECT * FROM warehouse
WHERE id IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16);
buckets = [
219, 626, 653, 799, 1403, 1410, 1418, 1860,
1934, 1948, 1958, 2564, 2640, 2752, 2802,
2852
]
Подробный вывод¶
По умолчанию выводится лишь начало списка бакетов — столько элементов, сколько умещается в одну строку (диапазон смежных бакетов считается одним элементом). В конце указывается, сколько бакетов осталось за ними:
EXPLAIN (BUCKETS) SELECT * FROM warehouse
WHERE id IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16);
buckets = [219, 626, 653, 799, 1403, ... (11 more)]
Чтобы вывести список целиком, можно воспользоваться опцией
VERBOSE:
EXPLAIN (BUCKETS, VERBOSE) SELECT * FROM warehouse
WHERE id IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16);
buckets = [219, 626, 653, 799, 1403, 1410, 1418, 1860, 1934, 1948, 1958, 2564, 2640, 2752, 2802, 2852]