|
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
|
|||
---|---|---|---|
#18+
Есть табличка с двумя записями и уникальным индексом по одному из полей NOT NULL. Селективность этого индекса 0,5. Почему именно 0.5, а не 1? Ведь, для любого значения индекса, одно значение индекса - одна строка таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2017, 11:18 |
|
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
|
|||
---|---|---|---|
#18+
найди уже формулу для селективности и ответь на свой вопрос сам ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2017, 11:32 |
|
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
|
|||
---|---|---|---|
#18+
а добавишь 3 запись будет 0.33 добавишь 4 будет 0.25 и т.д. 1 разделить на кол-во уникальных записей ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2017, 11:56 |
|
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
|
|||
---|---|---|---|
#18+
dimitr, наивно полагал, что селективность индекса, это <кол-во_уникальных_значений_индекса> / <кол-во_строк_таблицы> Сейчас нашел такое описание: " Индексная селективность - отношение числа строк соответствующих конкретному ключевому значению к общему числу строк в индексе. Селективность индекса – это показатель того, сколько строк от общего числа приходится на одно ключевое значение индекса." со следующей формулой: Код: txt 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2017, 12:13 |
|
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2017, 12:19 |
|
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
|
|||
---|---|---|---|
#18+
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Ведь, для любого значения индекса, одно значение индекса - одна строка таблицы. ШТО? :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2017, 12:38 |
|
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
|
|||
---|---|---|---|
#18+
kdv, да, я уже понял, что селективность индекса, это коэффициент, на который надо домножить кол-во строк таблицы, чтобы получить усредненное кол-во строк, отбираемое через одно уникальное индексное значение. <отбираемое_кол-во_строк(среднее)> = <кол-во_строк_таблицы> * <селективность_индекса> = NUM_ROWS * (1 / DISTINCT_KEYS) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2017, 13:04 |
|
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
|
|||
---|---|---|---|
#18+
kdvrdb_devВедь, для любого значения индекса, одно значение индекса - одна строка таблицы. ШТО? :-)Для случая, когда: rdb_devЕсть табличка с двумя записями и уникальным индексом по одному из полей NOT NULL ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2017, 13:05 |
|
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
|
|||
---|---|---|---|
#18+
Всем спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2017, 13:08 |
|
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2017, 13:39 |
|
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
|
|||
---|---|---|---|
#18+
rdb_devДля случая, когда: я еще попутно (на всякий случай) добавлю, что количество ключей плавает между количеством записей и количеством записей+версий. Например, 1 запись со значением А в столбце. 1 ключ, указывающий на эту запись. Теперь делаем update этой записи на значение Б - запись одна - версий две - ключей два, оба указывают на одну и ту же запись. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2017, 13:42 |
|
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
|
|||
---|---|---|---|
#18+
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Мб, разве стоит этим пренебрегать? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2017, 14:14 |
|
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
|
|||
---|---|---|---|
#18+
kdv, я это еще к тому, что если у тебя при отборе из одной и той же таблицы используются индексы с разной селективностью (к примеру 0,5 и 0,25), то более эффективным по статистике будет считаться индекс с селективностью 0,25, даже если при реальном выполнении запроса по конкретному значению ключа этого индекса будет отобрано и прочитано больше данных, чем по конкретному значению ключа индекса с селективностью 0,5. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2017, 14:37 |
|
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
|
|||
---|---|---|---|
#18+
rdb_devлибо одна запись, либо почти все. Но разве оно того не стоит? все же, неплохо было бы иметь гистограммы. В реальных базах обычно много индексов с большим количеством дубликатов одного значения ключа. Оптимизатор сейчас такие индексы использует почти безусловно (кроме других критериев). Поэтому Симонов и написал про +0 или ||''. Но в этом случае мы вынуждены писать разные запросы при выборке конкретных значений, что крайне неудобно. rdb_devЕсли есть вероятность, что половина обращений по такому индексу будет приводить лишь к чтению только двух страниц таблицы это уже зависит от предметной области. Вырожденный случай - FK с миллиона записей на справочник с одной записью. Индекс по ФК обязателен быть, но у него селективность = 1, т.к. всего 1 значение. Допустим, оптимизатор такой индекс не станет брать (хотя вроде берет). Тут ты добавляешь в справочник еще одну запись, которая год-два (а может и никогда) использоваться не будет. Индекс получает селективность 0.5 (после обновления статистики), и ... получается что все равно он нафиг не нужен (оптимизатору). ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2017, 14:48 |
|
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
|
|||
---|---|---|---|
#18+
kdvТут ты добавляешь в справочник еще одну запись, которая год-два (а может и никогда) использоваться не будет. Индекс получает селективность 0.5 (после обновления статистики), и ... получается что все равно он нафиг не нужен (оптимизатору).Оптимизатору этот индекс, как раз, нужен, но не нужен тебе и только ты знаешь, что в данном случае лучше отобрать по "натуралу". В этом случае без гистограмм, действительно, никак. Хотя... Если не основываться на жестком плане, то в процессе выполнения запроса можно было бы, для начала, отобрать все значения участвующих в отборе индексов, проверить у каких значений индексов меньше дубликатов и основываясь на этой информации изменить план запроса. Но это, по сути, та же гистограмма по каждому из значений индексов. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2017, 15:13 |
|
Не очень понимаю, что именно показывает селективность индекса. Разъясните, плз!
|
|||
---|---|---|---|
#18+
Кстати, что "дешевле" использовать +0 и || '' или Cast( .. AS SAME_DOMAIN) ? Или это равнозначно? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2017, 09:48 |
|
|
start [/forum/topic.php?fid=40&msg=39398203&tid=1561722]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
58ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 295ms |
total: | 452ms |
0 / 0 |