powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
17 сообщений из 17, страница 1 из 1
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
    #39397935
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть табличка с двумя записями и уникальным индексом по одному из полей NOT NULL. Селективность этого индекса 0,5. Почему именно 0.5, а не 1? Ведь, для любого значения индекса, одно значение индекса - одна строка таблицы.
...
Рейтинг: 0 / 0
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
    #39397959
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
найди уже формулу для селективности и ответь на свой вопрос сам
...
Рейтинг: 0 / 0
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
    #39397990
sdepals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а добавишь 3 запись будет 0.33 добавишь 4 будет 0.25 и т.д. 1 разделить на кол-во уникальных записей
...
Рейтинг: 0 / 0
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
    #39398018
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr, наивно полагал, что селективность индекса, это <кол-во_уникальных_значений_индекса> / <кол-во_строк_таблицы>
Сейчас нашел такое описание:
" Индексная селективность - отношение числа строк соответствующих конкретному ключевому значению к общему числу строк в индексе. Селективность индекса – это показатель того, сколько строк от общего числа приходится на одно ключевое значение индекса."

со следующей формулой:
Код: txt
1.
2.
                        NUM_ROWS     *    1            1
Селективность индекса = ----------------------- = ------------
                        DISTINCT_KEY * NUM_ROWS   DISTINCT_KEY
Но в этом случае не понятно зачем вообще упоминать количество строк таблицы, если селективность не зависит от этого значения, а зависит только от количества уникальных значений индекса.
...
Рейтинг: 0 / 0
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
    #39398024
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Rdb Dev!
You wrote on 3 февраля 2017 г. 12:18:29:

Rdb Dev> Сейчас нашел такое описание: http://oracle-patches.ru/component/content/article/35/341
ты форумом ошибся.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
    #39398048
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

селективность - это 1/(Keys - TotalDup), где TotalDup - количество повторов ключей. Буквально Keys - TotalDup это количество уникальных значений в ключе (считается от 1 как +1 при каждом повторе значения ключа).
Допустим, 1000 записей.

все разные = 1/(1000 - 1) = 0,001001001
все одинаковые = 1/(1000 - 999) = 1
два значения = 1/(1000-998) = 0.5
и т.д.

То есть, селективность - показатель уникальности индекса.

rdb_devВедь, для любого значения индекса, одно значение индекса - одна строка таблицы.
ШТО? :-)
...
Рейтинг: 0 / 0
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
    #39398083
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv, да, я уже понял, что селективность индекса, это коэффициент, на который надо домножить кол-во строк таблицы, чтобы получить усредненное кол-во строк, отбираемое через одно уникальное индексное значение.
<отбираемое_кол-во_строк(среднее)> = <кол-во_строк_таблицы> * <селективность_индекса> = NUM_ROWS * (1 / DISTINCT_KEYS)
...
Рейтинг: 0 / 0
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
    #39398085
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvrdb_devВедь, для любого значения индекса, одно значение индекса - одна строка таблицы.
ШТО? :-)Для случая, когда: rdb_devЕсть табличка с двумя записями и уникальным индексом по одному из полей NOT NULL
...
Рейтинг: 0 / 0
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
    #39398090
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо!
...
Рейтинг: 0 / 0
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
    #39398133
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev<отбираемое_кол-во_строк(среднее)> = <кол-во_строк_таблицы> * <селективность_индекса>
если ты про эффективность индекса с учетом его уникальности, то
- dimitr утверждает, что индекс остается эффективным (против натурала) даже если по индексу выбирается до 90% записей

- с точки зрения I/O это может быть не так. Например, таблица 762 мб. Если читать все натуралом, это столько и будет.
Следовательно, если использовать индекс для поиска 90% записей, индекс должен быть по размеру меньше этих самых 10% (или равен, в крайнем случае). 10% это 76.2мб. А вот я на этой таблице вижу индексы по 68мб, 88мб, 104 мб, 166мб.
Неуникальные все, как назло, как раз в районе 70мб :-) а вот уникальные - больше. Значит их эффективность должна быть ниже 90%.

- у нас нет гистограмм. Есть только Max Duplicates в статистике - это максимальное число повторов одного ключа.
Например. 1000 записей, 2 ключа. 1 ключ = 1 запись, 2й ключ - 999 записей. Селективность будет 0.5. И эффективность поиска по ключу 1 и ключу 2 будет очень разная - с ключом в 999 записей будут прочитаны почти все страницы индекса, т.е. I/O будет много выше.

Так что, твоя форула, как мне кажется, "ни о чем".
1000 * 0.5 = 500? А тут нет 500, тут есть или 1, или 999, которые оба весьма далеки от 500.
...
Рейтинг: 0 / 0
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
    #39398140
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devДля случая, когда:
я еще попутно (на всякий случай) добавлю, что количество ключей плавает между количеством записей и количеством записей+версий.
Например, 1 запись со значением А в столбце. 1 ключ, указывающий на эту запись.
Теперь делаем update этой записи на значение Б
- запись одна
- версий две
- ключей два, оба указывают на одну и ту же запись.
...
Рейтинг: 0 / 0
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
    #39398174
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv- у нас нет гистограмм. Есть только Max Duplicates в статистике - это максимальное число повторов одного ключа.
Например. 1000 записей, 2 ключа. 1 ключ = 1 запись, 2й ключ - 999 записей. Селективность будет 0.5. И эффективность поиска по ключу 1 и ключу 2 будет очень разная - с ключом в 999 записей будут прочитаны почти все страницы индекса, т.е. I/O будет много выше.

Так что, твоя форула, как мне кажется, "ни о чем".
1000 * 0.5 = 500? А тут нет 500, тут есть или 1, или 999, которые оба весьма далеки от 500.На то она и статистика, чтобы, без обращения к детальной информации о ключе , собирать "выжимку" информации о ключах (селективность индекса) и, опираясь на эту выжимку для приблизительных расчетов, составлять плана запроса.
Для представленного тобой примера эффективность отбора по индексу, относительно отбора по "натуралу", будет 50/50 - либо одна запись, либо почти все. Но разве оно того не стоит? Если есть вероятность, что половина обращений по такому индексу будет приводить лишь к чтению только двух страниц таблицы, а не всех из более чем 700Мб, разве стоит этим пренебрегать?
...
Рейтинг: 0 / 0
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
    #39398203
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv, я это еще к тому, что если у тебя при отборе из одной и той же таблицы используются индексы с разной селективностью (к примеру 0,5 и 0,25), то более эффективным по статистике будет считаться индекс с селективностью 0,25, даже если при реальном выполнении запроса по конкретному значению ключа этого индекса будет отобрано и прочитано больше данных, чем по конкретному значению ключа индекса с селективностью 0,5.
...
Рейтинг: 0 / 0
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
    #39398228
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devлибо одна запись, либо почти все. Но разве оно того не стоит?
все же, неплохо было бы иметь гистограммы. В реальных базах обычно много индексов с большим количеством дубликатов одного значения ключа. Оптимизатор сейчас такие индексы использует почти безусловно (кроме других критериев).
Поэтому Симонов и написал про +0 или ||''. Но в этом случае мы вынуждены писать разные запросы при выборке конкретных значений, что крайне неудобно.
rdb_devЕсли есть вероятность, что половина обращений по такому индексу будет приводить лишь к чтению только двух страниц таблицы
это уже зависит от предметной области. Вырожденный случай - FK с миллиона записей на справочник с одной записью. Индекс по ФК обязателен быть, но у него селективность = 1, т.к. всего 1 значение. Допустим, оптимизатор такой индекс не станет брать (хотя вроде берет).
Тут ты добавляешь в справочник еще одну запись, которая год-два (а может и никогда) использоваться не будет. Индекс получает селективность 0.5 (после обновления статистики), и ... получается что все равно он нафиг не нужен (оптимизатору).
...
Рейтинг: 0 / 0
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
    #39398267
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvТут ты добавляешь в справочник еще одну запись, которая год-два (а может и никогда) использоваться не будет. Индекс получает селективность 0.5 (после обновления статистики), и ... получается что все равно он нафиг не нужен (оптимизатору).Оптимизатору этот индекс, как раз, нужен, но не нужен тебе и только ты знаешь, что в данном случае лучше отобрать по "натуралу". В этом случае без гистограмм, действительно, никак. Хотя... Если не основываться на жестком плане, то в процессе выполнения запроса можно было бы, для начала, отобрать все значения участвующих в отборе индексов, проверить у каких значений индексов меньше дубликатов и основываясь на этой информации изменить план запроса. Но это, по сути, та же гистограмма по каждому из значений индексов.
...
Рейтинг: 0 / 0
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
    #39400625
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, что "дешевле" использовать +0 и || '' или Cast( .. AS SAME_DOMAIN) ? Или это равнозначно?
...
Рейтинг: 0 / 0
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
    #39400696
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

визуально - +0. Потому что +0 это понятно, а cast через год-два уже и не вспомнишь, зачем писал.
По скорости - надо проверять.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]