|
|
|
Как считаются логические чтения при доступе к табличному блоку по индексу?
|
|||
|---|---|---|---|
|
#18+
Подскажите, Допустим есть у меня таблица по полю которой построен индекс. И я выбираю данные с этой таблицы по индексу например по условию id > :n and id < :n1, т.е. в плане будет INDEX RANGE SCAN и TABLE ACCESS BY INDEX ROWID. Так вот вопрос как считаются логические чтения? Например находится блок индекса с нужными значениями (допустим весь наш диапазон помещается в одном листовом блоке) - это я так понимаю например 2 или 3 логических чтения (в зависимости от высоты дерева). Далее в этом индексном блоке допустим 100 ROWID которые попадают в наш диапазон и по ним мы должны обратиться к блокам таблицы чтобы извлечь 100 записей. Но допустим все эти 100 ROWID находятся только в 20 блоках таблицы. То есть фактически нам нужно обратиться к блоку индекса и 20 блокам таблицы чтобы получить результат. Как будет действовать Оракл - оптимизирует это дело (как??) и прочитает по разу эти 20 блоков - соответственно общее кол-во чтений будет 20 + 2 (индексных) или же он будет читать каждый блок по несколько раз и общее количество чтений будет 100 + 2 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2017, 16:01 |
|
||
|
Как считаются логические чтения при доступе к табличному блоку по индексу?
|
|||
|---|---|---|---|
|
#18+
хочу_знать, Для начала надо определиться что ты понимаешь под LIO. consistent gets (или еще db block gets? или в том числе consistent gets - examination? может какая-то еще статистика) может вообще отдельная цифра session logical reads? или v$sql.buffer_gets или что-то еще. Если из одного блока читаются 20 строк, то он пойдет в статистику как один +1 Но есть моменты. 1. Во-первых для получения согласованной версии может быть необходимо прочитать более одного блока даже для одной строки https://jonathanlewis.wordpress.com/2009/06/12/consistent-gets-2/ 2. Во-вторых помимо собственно данных читаются разная служебная инфа. Для индекса, как минимум, путь от корня к данным. Для таблицы - заголовок сегмента и прочее (зависит от manual/automatic segment management). 3. В-третьих есть всякие оптимизации. Гугли consistent gets - examination richard foote. Ну и напоследок - все можно трассировать. Я демонстировал пару use case 10200 trace name context ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2017, 16:47 |
|
||
|
Как считаются логические чтения при доступе к табличному блоку по индексу?
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopЕсли из одного блока читаются 20 строк, то он пойдет в статистику как один +1 Смотря в какую. Для consistent gets Зависит от fetch_array_size (Том Кайт) Если он будет =1 то будет ~ 20 + 1 consistent gets :) хочу_знатьТо есть фактически нам нужно обратиться к блоку индекса и 20 блокам таблицы чтобы получить результат. Как будет действовать Оракл - оптимизирует это дело (как??) Будет 20 + 3 ( если высота 2) без оптимизаций. Другое дело в том что он может прочитать их за одно обращение, тем самым уменьшив LIO если блоки таблицы повторяються (INDEX ROWID BATCHED ACCESS) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2017, 17:50 |
|
||
|
Как считаются логические чтения при доступе к табличному блоку по индексу?
|
|||
|---|---|---|---|
|
#18+
ora601Смотря в какую. Для consistent gets Зависит от fetch_array_size (Том Кайт) Если он будет =1 то будет ~ 20 + 1 consistent gets :)Ну да, если речь про настройку плюса arraysize и фетч всего результата на клиент без использования агрегатов и тп. :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2017, 18:01 |
|
||
|
Как считаются логические чтения при доступе к табличному блоку по индексу?
|
|||
|---|---|---|---|
|
#18+
при возможности оптимизирует https://www.pythian.com/blog/batched-table-access/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2017, 18:06 |
|
||
|
Как считаются логические чтения при доступе к табличному блоку по индексу?
|
|||
|---|---|---|---|
|
#18+
хочу_знать, Кайт Индекс хранится отсортированным по ключу. Индекс будет просматриваться в порядке сортировки ключей. Блоки, на которые указывает индекс, хранятся в случайном поряд- ке, в виде кучи. Поэтому при доступе к таблице по индексу придется выполнять мно- жество разрозненных, случайных операций ввода/вывода. Разрозненность объясняется тем, что по индексу придется читать блок 1, блок 1000, блок 205, блок 321, блок 1, блок 1032, блок 1 и т.д., а не последовательно блок 1, затем 2, 3 и т.д. Придется читать блоки случайным образом. В этом случае ввод/вывод одного блока может выполняться край- не медленно. В качестве упрощенного примера возьмем несложную таблицу, читаемую по индексу, при условии, что должно быть прочитано 20 процентов строк. Предположим, в таблице 100000 строк. Двадцать процентов от этого составляет 20000 строк. Если строки в сред- нем имеют длину 80 байт, в базе данных с размером блока 8 Кбайт в нем будет поме- щаться около 100 строк. Это означает, что в таблице — около 1000 блоков. Теперь рассчи- тать все будет несложно. Мы собираемся прочитать по индексу 20000 строк, другими словами, выполнить 20000 операций TABLE ACCESS BY ROWID. Для выполнения этого запроса придется обработать 20000 блоков таблицы. Хотя во всей таблице всего лишь около 1000 блоков! В конечном итоге окажется, что мы прочитали и обработали каж- дый блок в таблице в среднем 20 раз! Даже если увеличить размер строки на порядок (до 800 байт), что дает 10 строк в блоке, — такая таблица займет 10000 блоков. При доступе по индексу к 20000 строк нам придется прочитать каждый блок в среднем дважды. В данном случае полный просмотр таблицы будет намного эффективнее, чем доступ по индексу, поскольку каждый блок будет просматриваться только один раз. Запрос, ис- пользующий этот индекс для доступа к данным, не будет выполняться эффективно, если в среднем обращается более чем к 5 процентам данных для столбца размером 800 байт (в этом случае мы обратимся примерно к 5000 блоков) или к еще меньшей части (менее 0,5 процента) для столбца размером 80 байт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2017, 19:14 |
|
||
|
Как считаются логические чтения при доступе к табличному блоку по индексу?
|
|||
|---|---|---|---|
|
#18+
Спасибо всем, господа. Всё почитал, всё это интересно. Но ещё раз, правильно я понимаю, что arraysize только для sqlplus. Повлиять на этот параметр внутри PLSQL пакета мы никак не можем? Потому как с ним пару моих тестов, да собственно таких же как и у Кайта в главе упоминаемой stax... , всё выглядит логичным - я так понимаю есть определённое количество записей (по умолчанию 15) - которые оракл считывает с блока индекса за раз и соответственно если блоки таблицы всех этих 15 записей совпадают, он один раз считает этот блок и извлечёт 15 записей (это одно логическое чтение блока таблицы). Дальше опять 15 с листового блока индекса и опять за одно логическое чтение читаем с этого же блока таблицы и т.д. При изменении arraysize всё пропорционально изменяется. Ещё раз спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 11:48 |
|
||
|
Как считаются логические чтения при доступе к табличному блоку по индексу?
|
|||
|---|---|---|---|
|
#18+
хочу_знатьСпасибо всем, господа. Всё почитал, всё это интересно. Но ещё раз, правильно я понимаю, что arraysize только для sqlplus. Повлиять на этот параметр внутри PLSQL пакета мы никак не можем? Потому как с ним пару моих тестов, да собственно таких же как и у Кайта в главе упоминаемой stax... , всё выглядит логичным - я так понимаю есть определённое количество записей (по умолчанию 15) - которые оракл считывает с блока индекса за раз и соответственно если блоки таблицы всех этих 15 записей совпадают, он один раз считает этот блок и извлечёт 15 записей (это одно логическое чтение блока таблицы). Дальше опять 15 с листового блока индекса и опять за одно логическое чтение читаем с этого же блока таблицы и т.д. При изменении arraysize всё пропорционально изменяется. Ещё раз спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 12:13 |
|
||
|
Как считаются логические чтения при доступе к табличному блоку по индексу?
|
|||
|---|---|---|---|
|
#18+
хочу_знатьПовлиять на этот параметр внутри PLSQL пакета мы никак не можем? Ну почему же. Если используешь явный курсор, то limit. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 12:14 |
|
||
|
Как считаются логические чтения при доступе к табличному блоку по индексу?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 03:11 |
|
||
|
Как считаются логические чтения при доступе к табличному блоку по индексу?
|
|||
|---|---|---|---|
|
#18+
DВАпри возможности оптимизирует https://www.pythian.com/blog/batched-table-access/ Вячеслав Любомудров http://www.juliandyke.com/Presentations/LogicalIO.ppt Всегда было интересно спросить у наших уважаемых старожил форума - коллеги, вы гуглите эти ссылки каждый раз чтобы ответить вопрошающим, все это помните или у вас какие-то адские каталогизаторы ? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 09:11 |
|
||
|
Как считаются логические чтения при доступе к табличному блоку по индексу?
|
|||
|---|---|---|---|
|
#18+
kinky cat, я гуглю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 16:21 |
|
||
|
Как считаются логические чтения при доступе к табличному блоку по индексу?
|
|||
|---|---|---|---|
|
#18+
kinky cat, Помним даже контент до запятой) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 16:24 |
|
||
|
Как считаются логические чтения при доступе к табличному блоку по индексу?
|
|||
|---|---|---|---|
|
#18+
На самом деле, стОящих не так и много ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2017, 02:30 |
|
||
|
Как считаются логические чтения при доступе к табличному блоку по индексу?
|
|||
|---|---|---|---|
|
#18+
kinky catВсегда было интересно спросить у наших уважаемых старожил форума - коллеги, вы гуглите эти ссылки каждый раз чтобы ответить вопрошающим, все это помните или у вас какие-то адские каталогизаторы ? ;) когда знаешь что гуглить, проще нагуглить, чем объяснять своими словами ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2017, 12:29 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39441759&tid=1886037]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
137ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 240ms |
| total: | 443ms |

| 0 / 0 |
