Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
Теоретические аспекты и практические реализации создания, внедрения и использования баз данных, СУБД, хранилищ.
  • Страница:
  • 1
  • 2

ТЕМА: Oracle. all_tab_col_statistics

Oracle. all_tab_col_statistics 14 июль 2011 08:01 #1698

  • Jekson
  • Jekson аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 48
  • Спасибо получено: 0
Есть в данной вюшке столбец такой - DENSITY, т.е. плотность. Документация говорит нам:
DENSITY NUMBER Density of the column
Что это за плотность кто-нибудь может объяснить?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Oracle. all_tab_col_statistics 14 июль 2011 08:02 #1701

  • Den
  • Den аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 44
  • Спасибо получено: 0
DENSITY используется оптимизатором в некоторых случаях расчета селективности.

Это есть статистическая величина, в общем случае численно равная отношению:
1/NDV

Что на более понятном языке можно записать в виде SQL-выражения:
1 / count(distinct field_name).

При наличии гистограм вычисляется немного по другому.
Подробнее про эту кухню можно глянуть у Брайтлинга или Льюиса.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Den.

Re: Oracle. all_tab_col_statistics 14 июль 2011 08:03 #1704

  • Jekson
  • Jekson аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 48
  • Спасибо получено: 0
До этого я уже дошел. Теперь вопрос в другом: есть столбец типа varchar2(1000), 7 миллионов строк. Запрос select count(distinct col1) from tab1 возвращает 500000. Однако в all_tab_col_statistics их почему то 70000. В чем подвох?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Oracle. all_tab_col_statistics 14 июль 2011 08:03 #1705

  • Den
  • Den аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 44
  • Спасибо получено: 0
1) Устаревшая статистика.
2) Не полный сбор статистики (COMPUTE), а приближенный(ESTIMATE - сбор статистики не по всему множеству данных, а по надцати процентам от полного объема данных).
Если статистика актуальная и сбор осуществлялся методом COMPUTE, то можно предположить некоторый баг (а может и фичу) в работе DBMS_STATS при анализе длинных строковых полей. К примеру, сбор информации не по полной длине поля, а по некоторой подстроке (к примеру по первым 255 символам строки).
Но это из области предположений - в документации такой "особенности" поведения я не нашел.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Den.

Re: Oracle. all_tab_col_statistics 14 июль 2011 08:05 #1708

  • Jekson
  • Jekson аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 48
  • Спасибо получено: 0
Статистика точно не устарела, собирается каждую ночь.
Собиралась она как раз методом ESTIMATE, параметер estimate_percent задавался в DBMS_STATS.AUTO_SAMPLE_SIZE. Сейчас собираю 100%.
Еще такой вопрос: поле имеет тип varchar2(2000), а максимальная длина строки возможная по логике приложения - не больше 500 (на деле и того меньше). Это как то влияет на производительность?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Oracle. all_tab_col_statistics 14 июль 2011 08:07 #1712

  • Den
  • Den аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 44
  • Спасибо получено: 0
Если нужен сбор по всем данным (т.е. COMPUTE), то нужно параметру ESTIMATE_PERCENT передать значение NULL или вообще не указывать этот параметр в вызове (по умолчанию он как раз NULL).

Еще такой вопрос: поле имеет тип varchar2(2000), а максимальная длина строки возможная по логике приложения - не болше 500 (на деле и того меньше). Это как то влияет на производительность?


В чистом SQL - не влияет.
В PL/SQL - очень даже влияет.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
  • 2