172 похожих чатов

Подскажите плиз. имею огромную таблицу. сотни миллионов строк. я делаю join таблиц.

и потом делаю where .как сначала выполнить where для одной таблички (например там есть where где is_calc = true) а потом только сделать join и сделать where по сравнению с двумя таблицами??

запрос примеерно такой

select
calculation.id,
calculation.participate_bet_sum,
calculation.level_id,
calculation.calculation_start,
calculation.calculation_end,
bets.bet_sum
from bets left outer join calculation on calculation.id = bets.id join participants on bets.id = participants.id
where bets.is_calculated = false and bets.calc_date between calculation.calculation_start and calculation.calculation_end and participants.is_participate = true

27 ответов

13 просмотров

От перемены местами WHERE (для доступных столбцов) и INNER JOIN результат не меняется. Объясните детальнее, что вы хотите и чем вам не нравится очевидное решэние.

calculation.id, bets.id, participants.id - проиндексированы?

Илья Я Я
нет

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

Илья Я-Я Автор вопроса
Юра
Тогда попробуйте проиндексировать эти поля. В боль...

индекс participant_bets.id. есть. а воможно ли будет быстрее если отдельно получить выборку сначала таблицы по participant_bets.is_calculated = false participants.is_participate = true ?

Илья Я Я
индекс participant_bets.id. есть. а воможно ли бу...

нет. При наличии JOIN'ов с условиями и предложений WHERE движок БД сам принимает решение, в каком порядке проверять условия, чтобы запрос выполнялся быстрее (сам смотрит по индексам, по объемом выборок и т.д.)

Илья Я Я
индекс participant_bets.id. есть. а воможно ли бу...

Пробуйте, конечно. Впрочем, без индэкса на is_calculated это будет такжэ долго. А participants у вас и так выбирается и фильтруется за несущественное время. ЗЫ Индэкс на is_calculated, возможно, имеет смысл делать частичный (WHERE NOT is_calculated), ну или посмотреть на не-btree индэксы.

Илья Я-Я Автор вопроса
Ilya Anfimov
Пробуйте, конечно. Впрочем, без индэкса на is_calc...

а подскажите конструкцию в рамках одного запроса, как сделать подвыборку сначала по is_calculated

Илья Я Я
а подскажите конструкцию в рамках одного запроса,...

В рамках одного запроса -- ну, можно попытаться через CTE materialized.

Илья Я Я
а подскажите конструкцию в рамках одного запроса,...

Но вообще -- в рамках одного запроса оно довольно малоосмысленно. В первую очередь из-за трудности понимания. Разбейте на несколько, если хотите проводить такие эксперименты.

Илья Я-Я Автор вопроса
Ilya Anfimov
В рамках одного запроса -- ну, можно попытаться че...

а может ли быть медлительность проблемы из-за того что поля по которым делается JOIN текстовые, а не BigInt?

Илья Я Я
а может ли быть медлительность проблемы из-за того...

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

Илья Я-Я Автор вопроса
Юра
Зависит от количества записей в таблицах. Строки, ...

понял. больше упор сделать на индексы

Илья Я-Я Автор вопроса
Юра
Зависит от количества записей в таблицах. Строки, ...

в одной из таблиц 34.00.000 записей с текстовой колонкой по которой происходит соединение

Илья Я Я
понял. больше упор сделать на индексы

Да. Если мы делаем джоин двух таблиц без индексов, то SQL-серверу нужно "спарить" каждую запись из левой таблицы с каждой записью правой таблицы и проверить условие Join, после чего решить, оставлять эту запись, или нет. Т.е. объем работы MxN, где M и N количество записей в левой и правой таблице. Если же в правой таблице есть индекс по столбцу соединения, то для каждой записи левой таблицы SQL-сервер сразу "видит" список подходящих записей. Т.е. уже не приходится для каждой записи из левой таблицы пересматривать все записи правой таблицы.

Илья Я Я
в одной из таблиц 34.00.000 записей с текстовой ко...

А сколько записей в той таблице, с которой мы эту таблицу джойним? (общие рассуждения. Когда выполняется JOIN то серверу для каждой записи из левой таблицы нужно найти ответ на вопрос "есть ли в правой таблице записи с таким же значением поля соединения. Если индексов нет, единственным способом нахождения ответа на этот вопрос является просмотр всей таблицы. Индексы же - структуры данных, которые позволяют очень быстро получить ответ на вопрос, есть там такие значения, или нет. Например время полного просмотра таблицы на 1000 записей и 1 000 000 записей отличается в 1000 раз. А время поиска значений в индексах на 1000 и 1 000 000 значений отличается всего лишь в несколько раз. Поэтому индексы радикально ускоряют операции)

Илья Я-Я Автор вопроса
Юра
А сколько записей в той таблице, с которой мы эту ...

подскажите. а индексы сделать просто на колонку или с улосвием? create index idx_participant_bets_is_calculated on participant_bets (is_calculated); и create index idx_participant_bets_is_calculated on participant_bets (is_calculated) where (is_calculated = false);

Илья Я Я
подскажите. а индексы сделать просто на колонку ил...

Если в выборках нас интересуют только записи с is_calculated=false, то можно делать индекс с условием. Если же в других запросах нас интересуют записи с is_calculated=true, то, наверное, лучше индекс без условия. Хотя можно сделать и два индекса: один с true, второй с false. Зависит от того, сколько у нас тру и фолс в таблице, и в каких запросах кто нам из них нужен.

Юра
Если в выборках нас интересуют только записи с is_...

А оно вообще нормально делать индекс на колонку, в кот-й только 2 значения, или зависит от распределения?

central hardware
для 2 значений индекс не нужен

ну в оракеле бывает вроде такое

central hardware
для 2 значений индекс не нужен

Индекс с условием для boolean может быть нужен для кейса когда одного вида значениq значительно (на порядок, а лучше на 2-3) меньше чем другого. А так да, при примерно равном числе он просто использоваться не будет

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Всем привет! Массив вводится с клавиатуры, кол-во элементов неизвестно, поэтому я указал arr db 100 dup(?) С нахождением максимума проблем нет, а вот минимум почему-то всегд...
En Vind Av Sorg
11
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
Кто создает тут ботов для телеграмм групп ?
Antskup
8
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
14
Вроде бы вопрос уже заезжанный, но тем не менее У меня есть функция menu() которая выводит набор возможных действий, а затем спрашивает у пользователя что он хотел бы сделать....
David Golovatin
2
Я хочу запустить свой проект в тг. Что-то между пирамидой и майнилкой. Еще подобного ничего не было. Уникальная идея. Нужен именно не бот, а приложение. С ввод, выводом тон...
Павел А.
6
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Карта сайта