Запустите DB2 Runstats без активности, но получите SQLSTATE = 01650

Прочитав множество статей в Интернете, я все еще не уверен, какова настоящая цель DB2 Runstats.

Насколько я понимаю, DB2 Runstats «зарегистрирует» индекс таблицы в каталоге DB2, так что в следующий раз, когда будет запущен связанный запрос, он будет использовать индекс для повышения производительности. (Пожалуйста, поправьте меня, если я ошибаюсь)

То есть, если DB2 Runstats не запускается долгое время, индекс будет удален из каталога DB2?

Я создаю новый индекс для таблицы. Первоначально эта таблица уже содержала другой индекс.

После создания нового индекса я запустил DB2 Runstats в таблице для старого индекса, но обнаружил следующую ошибку:

SQL2314W Some statistics are in an inconsistent state. The newly collected "INDEX" statistics are inconsistent with the existing "TABLE" statistics. SQLSTATE=01650

Сначала я подумал, что это вызвано действием по созданию нового индекса, а таблица все еще находилась в стадии «обработки». На следующий день я снова выполнил команду DB2 Runstats, но все равно получил ту же ошибку.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
1 963
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваше понимание db2 runstats неверно. Эта команда собирает статистику по данной таблице и ее индексам и помещает ее в представления схемы SYSSTAT, такие как SYSSTAT.TABLES, SYSSTAT.INDEXES и т. д. Эта информация используется оптимизатором DB2 для создания лучших планов доступа ваших запросов. Сам он не «регистрирует» индексы. Индексы не удаляются автоматически, если вы не собираете по ним статистику.

Что касается предупреждающего сообщения SQL2314W.

Это просто предупреждение о том, что статистика таблицы и индекса логически несовместима (например, количество ключей индекса больше, чем количество строк в таблице). Иногда это происходит, когда вы собираете статистику по активно обновляемой таблице одновременно, даже если вы запускаете такой сбор для таблицы и ее индексов с помощью одной команды RUNSTATS. Вы можете проигнорировать это сообщение или заставить утилиту RUNSTATS блокировать таблицу во время сбора статистики по таблице и ее индексам с помощью одной команды (предложение ALLOW READ ACCESS).

Спасибо за объяснение. Хотел бы спросить о «улучшении планов доступа для ваших запросов». Применимо ли это также, когда приложение запрашивает базу данных? Если я не запустил команду runstats, будет ли действовать старый индекс? Если да, могу ли я узнать, чем отличается команда runstats от команды runstats. Прошу прощения, если задаю глупый вопрос.

Panadol Chong 20.12.2018 10:35

db2 использует так называемый оптимизатор, основанный на затратах. Это означает, что на решение оптимизатора влияет не только наличие объектов базы данных (например, индексов), но и ранее собранные данные и статистика индексов. Поэтому, как правило, лучше иметь самую свежую статистику, чтобы помочь оптимизатору выбрать наиболее эффективный план доступа из всех возможных.

Mark Barinstein 20.12.2018 11:19

Если я проигнорирую предупреждающее сообщение, повлияет ли оно на мои запросы к таблице?

Panadol Chong 21.12.2018 02:59

Это зависит от «размера несоответствия статистики».

Mark Barinstein 21.12.2018 11:12

Привет, @Mark Barinstein, могу я узнать, что означает несогласованность статистики? что мне делать, если я хочу избежать появления этого предупреждающего сообщения. Если я проигнорирую это, это означает, что сбор статистики завершился ошибкой, верно? В случае неудачи возникнут ли проблемы с таблицей?

Panadol Chong 03.10.2019 04:35

@PanadolChong Пожалуйста, прочтите мой пост еще раз внимательно. Уже есть ответы на все ваши вопросы. Другими словами, я не знаю, как ответить на ваши вопросы.

Mark Barinstein 03.10.2019 07:02

Другие вопросы по теме