Spec-Zone.ru › DuckDB

Примеры

Примеры используются для случайного выбора подмножества набора данных.

Примеры

Выбрать образец из 5 строк из tbl с помощью выборочного отбора:

SELECT *
FROM tbl
USING SAMPLE 5;

Выбрать образец из 10% таблицы с помощью системного отбора (кластерного отбора):

SELECT *
FROM tbl
USING SAMPLE 10%;

Выбрать образец из 10% таблицы с помощью выборочного отбора Бернулли:

SELECT *
FROM tbl
USING SAMPLE 10 PERCENT (bernoulli);

Выбрать образец из 50 строк таблицы с помощью выборочного отбора с фиксированным значением генератора случайных чисел (100):

SELECT *
FROM tbl
USING SAMPLE reservoir(50 ROWS)
REPEATABLE (100);

Выбрать образец из 20% таблицы с помощью системного отбора с фиксированным значением генератора случайных чисел (377):

SELECT *
FROM tbl
USING SAMPLE 20% (system, 377);

Выбрать образец из 20% tbl до объединения с tbl2:

SELECT *
FROM tbl TABLESAMPLE reservoir(20%), tbl2
WHERE tbl.i = tbl2.i;

Выбрать образец из 20% tbl после объединения с tbl2:

SELECT *
FROM tbl, tbl2
WHERE tbl.i = tbl2.i
USING SAMPLE reservoir(20%);

Синтаксис

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

DuckDB поддерживает три разных типа методов отбора: reservoir, bernoulli и system. По умолчанию DuckDB использует reservoir выборку, когда выбирается точное количество строк, и system выборку, когда указан процент. Методы отбора описаны подробно ниже.

Примеры требуют размера выборки, который указывает, сколько элементов будет отобрано из всей популяции. Примеры могут быть заданы в процентах (10%) или в виде фиксированного количества строк (10 rows). Все три метода отбора поддерживают выборку по проценту, но только метод выборочного отбора поддерживает выборку фиксированного числа строк.

Примеры являются вероятностными, то есть выборки могут отличаться в разных запусках, если явно не указано значение генератора случайных чисел. Указание значения генератора случайных чисел только гарантирует, что выборка будет одинаковой, если многопоточность не включена (т.е., SET threads = 1). В случае нескольких потоков, работающих над выборкой, выборки не обязательно будут согласованными даже с фиксированным значением генератора случайных чисел.

reservoir

Выборочный отбор — это метод выборки потока, который выбирает случайную выборку, сохраняя резервуар размером, равным размеру выборки, и случайным образом заменяя элементы по мере поступления большего количества элементов. Выборочный отбор позволяет нам указать точно, сколько элементов мы хотим в результирующей выборке (выбирая размер резервуара). В результате выборочный отбор всегда выводит одинаковое количество элементов, в отличие от системного и выборочного отбора Бернулли.

Выборочный отбор рекомендуется только для небольших размеров выборки и не рекомендуется использовать с процентами. Это связано с тем, что для выборочного отбора необходимо материализовать всю выборку и случайным образом заменить кортежи в материализованной выборке. Чем больше размер выборки, тем выше затраты производительности, связанные с этим процессом.

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

Рекомендация. По возможности избегайте использования выборочного отбора с большими размерами выборки. Выборочный отбор требует материализации всей выборки в памяти.

bernoulli

Выборочный отбор Бернулли можно использовать только при указании процента выборки. Он довольно прост: каждый кортеж в основной таблице включается с вероятностью, равной указанному проценту. В результате выборка Бернулли может возвращать разное количество кортежей, даже если указан один и тот же процент. Количество строк обычно будет более или менее равно указанному проценту таблицы, но будут некоторые отклонения.

Поскольку выборочный отбор Бернулли полностью независимый (нет общего состояния), нет штрафа за использование выборочного отбора Бернулли совместно с несколькими потоками.

system

Системный отбор — это разновидность выборочного отбора Бернулли с одним важным отличием: каждый вектор включается с вероятностью, равной проценту выборки. Это форма кластерного отбора. Системный отбор более эффективен, чем выборочный отбор Бернулли, так как не требуется выполнение выборок по каждому кортежу. При использовании системного отбора практически нет дополнительных накладных расходов, в то время как для выборочного отбора Бернулли могут добавляться дополнительные затраты, так как ему требуется генерация случайных чисел для каждого кортежа.

Системный отбор не подходит для небольших наборов данных, так как гранулярность выборки составляет приблизительно ~1000 кортежей. Это означает, что если системный отбор используется для небольших наборов данных (например, 100 строк), то либо все данные будут отфильтрованы, либо все данные будут включены.

Образцы таблиц

Операторы TABLESAMPLE и USING SAMPLE идентичны по синтаксису и результату, за исключением одного важного отличия: табличные выборки производят выборку непосредственно из таблицы, для которой они указаны, в то время как оператор `sample` выбирает образец после того, как весь оператор `from` был разрешен. Это важно, когда в плане запроса присутствуют объединения.

Оператор TABLESAMPLE по существу эквивалентен созданию подзапроса с оператором USING SAMPLE , т.е. следующие два запроса идентичны:

Выбрать образец из 20% tbl до объединения:

SELECT * FROM tbl TABLESAMPLE reservoir(20%), tbl2 WHERE tbl.i = tbl2.i;

Выбрать образец из 20% tbl до объединения:

SELECT *
FROM (SELECT * FROM tbl USING SAMPLE reservoir(20%)) tbl, tbl2
WHERE tbl.i = tbl2.i;

Выбрать образец из 20% после объединения (т.е. образец из 20% результата объединения):

SELECT *
FROM tbl, tbl2
WHERE tbl.i = tbl2.i
USING SAMPLE reservoir(20%);

© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/sql/samples.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API