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

И еще вопрос Читаю книгу, и там пишут, что индекс

для такого запрос
SELECT * FROM coordinates WHERE longitude > 51.21321 AND
longitude < 100.21323 AND latitude > 21.123123 AND latitude < 23.123123;
Будет не эффективено выполняться. Вопрос почему? Разве для btree index сложно выбрать значения между ?

19 ответов

20 просмотров

> Подскажите, есть ли отличие custom и concatenated index? А откуда эта терминология, вообще (про отличия надо спрашивать того, кто её придумал)? > Я так понимаю, что БД поняла, что данных в таблице нет и использовать индекс нет смысла? Если гадать — то, скорее всего, случился autovacuum / autoanalyze, и таки да, "поняла". > Разве для btree index сложно выбрать значения между ? Разумеется, сложно. Вам стоит разобраться, как он устроен (или, для начала, понять на уровне аналогий — обычно приводят примеры отсортированного массива, телефонного справочника и индекса (алфавитного указателя) в книгах — в каждом из них тоже [может быть] составной ключ).

DORIAN GRAY- Автор вопроса
Yaroslav Schekin
> Подскажите, есть ли отличие custom и concatenate...

Сложность в том , что нужно искать в двух диапазонах ? Или запрос с одним диапазоном тоже сложный был бы?

DORIAN GRAY
Сложность в том , что нужно искать в двух диапазон...

Да. Нет. Разберитесь, как устроен b-tree индекс — это основной (а в некоторых — и единственный, наверное) тип индекса во всех "классических" RDBMS, поэтому изучить его полезно.

DORIAN GRAY- Автор вопроса
Yaroslav Schekin
Да. Нет. Разберитесь, как устроен b-tree индекс —...

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

DORIAN GRAY
Ну что значит разберись. Я плюс минус знаю как оно...

Если знаете, то почему с вопросами выше какие-то сложности?

Смотрите, допустим у вас не составной индекс. Тогда он использует только индекс по лонгитюду например, а латитюд ему придется тупо фильтровать.

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

Владимир Гришин
А составной индекс не поможет, потому что будет сл...

И дажэ если бы не слишком много — с оптимизацыями пропусков в постгресе пока тяжко.

DORIAN GRAY- Автор вопроса
Владимир Гришин
Смотрите, допустим у вас не составной индекс. Тогд...

Так сложность заключается не в том, что по двум параметрам искать, а в том, что нужно искать между двумя значениями ?

Ilya Anfimov
И дажэ если бы не слишком много — с оптимизацыями ...

Это да... почти везде уже есть, а у нас так и нет. ;( Я даже помню, как я общался с кем-то, кто хотел "для себя" написать какой-то инструмент (не помню, зачем там была СУБД), и просто выкинул PostgreSQL из списка поддерживаемых им СУБД именно поэтому (только в нём какой-то важный запрос выполнялся неприемлемо долго).

DORIAN GRAY
Так сложность заключается не в том, что по двум па...

В одномерном случае все хорошо и быстро, но представьте, что у вас после выборки по первому индексу осталась миллион точек. Что делать? Индекс уже не используешь. Только секскан

DORIAN GRAY- Автор вопроса
Владимир Гришин
В одномерном случае все хорошо и быстро, но предст...

Что имеется ввиду под одномерным в случае индексов ? Ну если у тебя составной индекс по (field1,field2), то запрос where field1=… and field2=… должен работать быстро Найдет записи сразу по первому полю, а из них Найдет по второму

DORIAN GRAY
Так сложность заключается не в том, что по двум па...

Ваши сложности заключаются в том, что Вы не даёте себе труда подумать пару минут, уж извините. Если Вы собираетесь работать с СУБД — у Вас ещё немало будет подобных вопросов, а простое представление дало бы Вам ответы на большинство из них. "Знание одного принципа заменяет тысячу фактов" и т.п.

Если Вам не нравится аналогия с алфавитным указателем — та, что с отсортированным массивом и бинарным поиском, ничуть не хуже. Т.е. индекс по (field1,field2) по сути эквивалентен массиву, отсортированному по (мульти)ключу (field1,field2).

DORIAN GRAY- Автор вопроса
Yaroslav Schekin
Если Вам не нравится аналогия с алфавитным указате...

Мне нравится аналогия, но я видно ее не понял. Отыскать значения с фамилией начинающиеся на букву от В до Г это сложно ? Я не знаю как там будет бегать этот указатель по дереву, но мне кажется он найдет сразу уровень на котором будет левая граница. Дальше надо найти где правая граница. Тут конечно может придется начинать бежать с начала

DORIAN GRAY
Мне нравится аналогия, но я видно ее не понял. Оты...

Да какие деревья?! ;) Вы в жизни видели телефонный справочник (бумажный такой, там где абоненты отсортированы по фамилии, а потом по имени, и ещё есть "закладки" с первыми буквами фамилий, хотя бы)? Или предметный указатель в книге, вот такой? Попробуйте представить, как бы Вы чем-то из этого пользовались для поиска ответов на свои запросы.

DORIAN GRAY- Автор вопроса
Yaroslav Schekin
screenshot Да какие деревья?! ;) Вы в жизни видели телефонный...

Ну тут да, придется просто бежать по всем значениям в диапазоне, чтобы собрать индексы.

DORIAN GRAY
Ну тут да, придется просто бежать по всем значения...

Ну так b-tree индексы по сути работают аналогично — в этом примере легко найти все страницы по первому ключу (от "Теорема" до "Тип", например), а вот найти что-нибудь по второму (например, "логический/ая" — куда сложнее).

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта