Замечания по выпуску


8.3 Глава 5. Статистики системного каталога

8.3.1 Сбор и использование статистики распределения

В подразделе "Пример влияния на предикаты равенства" обсуждается предикат C <= 10. Указано, что ошибка равна -86%. Это неверно. Предложение в конце этого абзаца должно выглядеть так:

   Если исходить из предположения о равномерном распределении данных и
использовать формулу (1), оценка числа строк, удовлетворяющих этому  предикату,
будет равна 1 (ошибка -87,5%).

В подразделе "Пример влияния на предикаты равенства" обсуждается предикат C > 8,5 AND C <= 10. Оценка значения r_2 с использованием линейной интерполяции должна быть изменена на:

                    10 - 8,5   
   r_2 *= ---------- x (число строк, значение в которых > 8,5 и <= 100,0)
          100 - 8,5
          10 - 8,5
   r_2 *= ---------- x (10 - 7)
          100 - 8,5
          1,5
   r_2 *= ---- x (3)
          91,5
   r_2 *= 0

Следующий за этим новым примером абзац также нужно изменить:

   Итоговая оценка - r_1 + r_2 *= 7, и абсолютная ошибка равна только -12,5%.

8.3.2 Правила обновления статистики каталога

В разделе "Правила обновления статистики столбцов" последний абзац в первом пункте списка надо заменить следующим:

HIGH2KEY должно быть больше, чем LOW2KEY, если в соответствующем столбце есть более 3 различных значений. Если число различных значений в столбце равно или меньше 3, HIGH2KEY может равняться LOW2KEY.

8.3.3 Статистика подэлементов

В FixPak 1 есть опция для сбора и использования статистики подэлементов. Это статистика о содержимом данных в столбцах, когда структура данных имеет вид последовательностей подполей и подэлементов, разделенных пробелами.

Например, предположим, что база данных содержит таблицу DOCUMENTS, в которой каждая строка описывает документ, и в DOCUMENTS есть столбец под названием KEYWORDS, содержащий список соответствующих ключевых слов, описывающих текст этого документа. Значения в KEYWORDS могут выглядеть так:

   'база моделирование аналитика бизнес интеллект'
   'моделирование модель дрозофила размножение температура'
   'лес хвойный почва эрозия дождевой'
   'лес температура почва осадки пожар'

В этом примере каждое значение столбца состоит из 5 подэлементов, каждый из которых является словом (ключевым словом), отделенным от других одним пробелом.

Для запросов, содержащих предикаты LIKE для таких столбцов с использованием символа %, который означает соответствие всем символам:

   SELECT .... FROM DOCUMENTS WHERE KEYWORDS LIKE '%моделирование%'

оптимизатору часто полезно знать основные статистические характеристики структуры подэлементов этого столбца, а именно:

SUB_COUNT
Среднее число подэлементов.

SUB_DELIM_LENGTH
Средняя длина ограничителя, отделяющего подэлемент, где ограничитель в данном контексте - один или несколько последовательных символов пробела.

В приведенном примере SUB_COUNT равняется 5, а SUB_DELIM_LENGTH - 1, поскольку все ограничители состоят из одного символа пробела.

В FixPak 1 системный администратор управляет сбором и использованием такой статистики при помощи расширения переменной реестра DB2_LIKE_VARCHAR. Эта переменная реестра определяет, как оптимизатор DB2 UDB работает с предикатами вида:

   COLUMN LIKE '%xxxxxx'

где xxxxxx - любая строка символов; то есть с любыми предикатами LIKE, поисковое значение которых начинается с символа %. (Оно может и заканчиваться символом %, но это не обязательно). Далее мы будем называть их "предикаты LIKE с подстановкой". Для каждого предиката оптимизатор должен оценить, какое число строк отвечает этому предикату. Для предикатов LIKE с подстановкой оптимизатор полагает, что у COLUMN, для которого найдено совпадение, имеется структура из последовательности сочлененных элементов, образующих собственно столбец, и оценивает длину каждого из этих элементов на основе длины строки символов, исключая из нее начальные и конечные символы %. Новый синтаксис:

   db2set  DB2_LIKE_VARCHAR=[Y|N|S|num1][,Y|N|num2]
 
     где
   - первый член (перед запятой) означает следующее
      (только для столбцов, не имеющих позитивной
      статистики подэлементов)
статистика подэлементов
      S                 Использовать алгоритм, как в DB2 версии 2.
      N                 Использовать алгоритм подэлементов с фиксированной длиной.
      Y  (по умолчанию) Использовать алгоритм подэлементов с переменной длиной
                        с используемым по умолчанию значением для параметра
                        алгоритма.
      num1              Использовать алгоритм подэлементов с переменной длиной
                        со значением num1 для параметра алгоритма.
   - второй член (после запятой) означает:
      N  (по умолчанию) Не собирать или не использовать статистики подэлементов.
      Y                 Собирать статистики подэлементов. Использовать алгоритм
                        подэлементов с переменной длиной, использующий эти
                        статистики, а также устанавливаемое по умолчанию значение
                        для параметра алгоритма в случае столбцов с позитивными
                        статистиками подэлементов.
      num2              Собирать статистики подэлементов. Использовать алгоритм
                        подэлементов с переменной длиной, использующий эти
                        статистики, а также значение num2
                        для параметра алгоритма в случае столбцов с позитивными
                        статистиками подэлементов.

Если значение DB2_LIKE_VARCHAR содержит только первый член, статистика для подэлементов не собирается, а вся ранее собранная статистика игнорируется. Указанное значение влияет подсчет оптимизатором селективности предикатов LIKE с подстановкой так же, как и раньше, то есть:

Если значение DB2_LIKE_VARCHAR содержит два члена и второй из них - Y или константа с плавающей запятой, статистика подэлементов собирается во время операции RUNSTATS по столбцам типа CHAR, VARCHAR, GRAPHIC или VARGRAPHIC со строками наборов однобайтных символов и используются во время компиляции запросов, включающих в себя предикаты LIKE с подстановкой. Оптимизатор использует алгоритм, предполагающий подэлементную модель, и вычисляет селективность предиката по показателям SUB_COUNT и SUB_DELIM_LENGTH, а также по параметру алгоритма. Параметр алгоритма указывается так же, как описано выше, то есть:

Если во время компиляции оптимизатор обнаружит, что статистики подэлементов для включенного в запрос столбца не собраны, он будет использовать "дедуктивный" алгоритм подэлементов, то есть алгоритм, используемый, если указан только первый член DB2_LIKE_VARCHAR. Таким образом, чтобы статистики подэлементов были использованы оптимизатором, второй член DB2_LIKE_VARCHAR должен быть установлен и во время RUNSTATS, и во время компиляции.

Значения статистик подэлементов можно посмотреть, запросив SYSIBM.SYSCOLUMNS. Например:

   select substr(NAME,1,16), SUB_COUNT, SUB_DELIM_LENGTH
      from sysibm.syscolumns where tbname = 'DOCUMENTS'

Столбцов SUB_COUNT и SUB_DELIM_LENGTH нет в производной таблице статистики SYSSTAT.COLUMNS и поэтому изменить их нельзя.
Прим.:При использовании этой опции RUNSTATS может работать дольше. Например, RUNSTATS может работать на 15 - 40% дольше для таблицы со столбцами из пяти символов, если не используются опции DETAILED и DISTRIBUTION. Если указана опция DETAILED или DISTRIBUTION, процентное увеличение будет меньше, несмотря на то, что абсолютное значение увеличения останется таким же. Если вы собираетесь использовать эту опцию, надо сопоставить эти дополнительные расходы и повышение производительности запроса.


[ Начало страницы | Страница назад | Страница вперед | Содержание | Индекс ]