2013-03-22 3 views
3

Я нашел документы, объясняющие, что oracle использует их для настройки производительности и т. Д., Но не совсем понял, что на самом деле это делает. Может кто-нибудь объяснить это мне простым словом с очень простым примером или чем-то еще?Почему они используют DBMS_STATS.GATHER_TABLE_STATS?

ответ

28

Большинство баз данных предприятий, включая Oracle, используют оптимизатор затрат для определения соответствующего плана запроса для данного оператора SQL. Это означает, что оптимизатор использует информацию о данных, чтобы определить, как выполнять запрос, а не полагаться на правила (это то, что сделал более старый оптимизатор на основе правил).

Например, представьте таблицу для простого отслеживания ошибок приложения

CREATE TABLE issues (
    issue_id number primary key, 
    issue_text clob, 
    issue_status varchar2(10) 
); 

CREATE INDEX idx_issue_status 
    ON issues(issue_status); 

Если я крупная компания, я мог бы иметь 1 миллион строк в этой таблице. Из них 100 имеют issue_status ACTIVE, 10 000 имеют issue_status QUEUED, а 989 ​​900 имеют статус COMPLETE. Если я хочу запустить запрос к таблице, чтобы найти свои активные проблемы

SELECT * 
    FROM issues 
WHERE issue_status = 'ACTIVE' 

У оптимизатора есть выбор. Он может либо использовать индекс на issue_status, а затем выполнять однострочный поиск в таблице для каждой строки в индексе, который соответствует, или он может выполнять сканирование таблицы в таблице issues. Какой план более эффективен, будет зависеть от данных, которые находятся в таблице. Если Oracle ожидает, что запрос вернет небольшую часть данных в таблицу, использование индекса будет более эффективным. Если Oracle ожидает, что запрос вернет значительную часть данных в таблице, сканирование таблицы будет более эффективным.

DBMS_STATS.GATHER_TABLE_STATS - это то, что собирает статистику, которая позволяет Oracle делать это определение. Он сообщает Oracle, что в таблице примерно 1 миллион строк, что есть 3 различных значения для столбца issue_status и что данные распределены неравномерно. Поэтому Oracle знает, как использовать индекс для запроса, чтобы найти все активные проблемы. Но он также знает, что, когда вы поворачиваете вокруг и попытаться взглянуть на все закрытые вопросы,

SELECT * 
    FROM issues 
WHERE issue_status = 'CLOSED' 

, что это будет более эффективно делать сканирование таблицы.

Сбор статистики позволяет изменять планы запросов с течением времени по мере изменения объемов данных и распределений данных. Когда вы впервые установите трекер проблемы, у вас будет очень мало COMPLETED проблем и более проблем ACTIVE и QUEUED. Со временем число ЗАПОЛНЕННЫХ проблем растет намного быстрее. По мере того как вы получаете больше строк в таблице и относительная доля этих строк, находящихся в разных статусах, меняются, планы запросов будут меняться так, что в идеальном мире вы всегда получите максимально эффективный план.

+0

Большое спасибо Джастину, это имеет смысл. – Manth

+0

Посмотрел много документов о GATHER_TABLE_STATS, это так хорошо объяснено. Спасибо, что поделились мыслями! –

Смежные вопросы