к одной той же таблице?
есть таблица на 500 миллионов, нужно вытянуть с нее кусками данные по 10
SELECT * FROM aggregation
ORDER BY id, type, offer, codes
LIMIT 10_000_000 OFFSET 10_000_000;
на графике трафик с БД. Видно, что ждем данные из-за выполнения запроса
в DDL таблице ORDER BY на эти же поля есть
Уточнение, данные хочу получить в C#. Net Framework 4.8
а точно "SELECT *" нужен? просто так как система колоночная, то если нужно вытащить три-четыре колонки в таблице из 100 колонок, то лучше их явно указать
Там всего 5 колонок, нужны все
вы их для чего вытаскиваете?
не нужно пользоваться LIMIT/OFFSET. Нужно пользоваться where id between 10000 and 10100. При условии что у вас order by id
с ORDER BY rule_id проблем нет. немного не корректно написал исходный вопрос. SQL правильный так выглядит, нужно 4 полям ордер SELECT * FROM aggregation ORDER BY search, type, offer, codes LIMIT 10_000_000 OFFSET 10_000_000;
я имел в виду order by/primary key таблицы - её первичный индекс. limit/offset вам не поможет, он фильтрует на выходе, после того как данные уже прочитаны (по крайней мере их начало). У вас каждый раз считывается вся таблица с начала, какой бы offset вы не поставили. Отсюда и такой профиль нагрузки
DLL таблицы engine = MergeTree ORDER BY (search, type, offer, codes) если делать селект на кусок данных через LIMIT OFFSET без order by (search, type, offer, codes), то данные могут прийти не сортированные Это не подходит where id between 10000 and 10100.
search строковый что-ли? Тогда можно фрагменты для выборки и по буквам сформировать. order by (search, type, offer, codes) в запросе - оставляйте, если хотите чтобы сортировку делал КХ (но может и память сожрать свех меры) там при таком подходе иная проблема - пока вы частями вычитываете, могут прийти новые данные, и вы их не получите. Но все равно не очень понятно - для чего вы делите запрос на фрагменты, а не получаете его целиком? Если памяти хватает отсортировать все, то выгребайте целиком, без лимита. КХ будет вам стримить - только принимайте.
не заметил сразу, что у вас order by таблицы и запроса совпадают. Тогда проблемы с сортировкой нет вобще - КХ все отсортирует на вставках/мерджах. Вам нужен сеттинг правильный - https://clickhouse.com/docs/en/sql-reference/statements/select/order-by/#optimize_read_in_order Будет работать быстро - читать с диска и кормить ваше приложение. Главное чтобы оно приняло. Не нужен вам limit/offset - забудьте про него. Он тут почти не работает при несовпадении order by. Но у вас совпадает.
Обсуждают сегодня