Статистика индекса ASE 15.x по второстепенным атрибутам

Если мы создадим такой индекс:

create nonclustered index idx_person on person(gender, name)

в ASE 12.5 создается статистика (точнее, гистограмма) для основного атрибута (пол), но ничего не делается для имени второстепенного атрибута.

Из-за этого оптимизатор может выбрать наихудший план запроса при выборе следующим образом:

select * from person
where gender = 'M'
and name = 'John Doe'

Он может выбрать наихудший план запроса, потому что он даст значения селективности по умолчанию для имени столбца. При этом сканирование таблицы может быть лучше, чем выбор индекса.

!

Что я хочу знать, так это то, что в ASE 15.x, когда индекс создается с более чем одним столбцом, статистика запускается для всех столбцов индекса?

Или, если мы должны использовать следующие команды для обновления статистики индекса:

update statistics person(name)

update index statistics person index_person

Заранее спасибо! :)


person aF.    schedule 09.11.2011    source источник


Ответы (1)


Вы не получаете статистику по 2-му и последующим столбцам по умолчанию, я полагаю, потому что Sybase должна выполнять дополнительную обработку и использовать базу данных tempdb для их компиляции. Поэтому ожидается, что вы решите, каким из ваших индексов нужны все столбцы со статистикой.

Если вы используете v15 и у вас установлен уровень оптимизации «mix» или «dss», у вас, вероятно, возникнет проблема, связанная с тем, что вы не ведете статистику по всем столбцам индекса, потому что оптимизатор не может легко выполнить слияние и hash объединяется без всей статистики столбца индекса. В v12.5 то же самое применяется, если у вас включено MERGE JOIN.

Я думаю, что у вас может быть больше проблем такого рода, чем неправильные планы, только из-за отсутствия гистограммы во 2-м и последующих столбцах, хотя я думаю, это зависит от обстоятельств.

Вы можете использовать функцию DATACHANGE, чтобы узнать, какие таблицы изменились более чем на заданный вами процент, чтобы вы могли написать сценарий оболочки (или что-то еще), который периодически (один раз в час/несколько часов/день/начало пакета/конец пакета/и т. д.) проверяет базу данных и обновляет статистику для затронутых таблиц. (На самом деле я не совсем уверен, что это на 12.5 - вполне может быть только v15.)

person abe crabbers    schedule 16.11.2011