1. Проблема здесь в плохом кодировании. В вашем выпуске плохой код и плохой дизайн таблиц являются главными причинами (98%), что оптимизатор принимает неправильные решения (эти два идут рука об руку, я не определил соотношение каждого из них). Оба:
WHERE status IN ('NEW','SENT')
и
WHERE status IN (SELECT status FROM allowableStatusValues)
некачественные, потому что в обоих случаях ASE создает рабочий стол для содержимого в скобках, чего можно легко избежать (и избежать всех вытекающих из этого проблем). Статистика рабочего стола невозможна, так как статистика по t.status или s.status отсутствует (AdamH верен в этом отношении), он правильно выбирает сканирование таблицы.
Подзапросы имеют свое место, но никогда не заменяют чистого (таблицы имеют отношение ). Исправления:
WHERE status = "NEW" OR status = "SENT"
и
FROM myTable t,
allowableStatusValues s
WHERE t.status = s.status
2. Заявление
| Теперь вам не нужно добавлять индекс для получения статистики по столбцу, но это, вероятно, лучший способ.
неверно. Никогда не создавайте индексы, которые вы не будете использовать. Если вы хотите обновить статистику по столбцу, просто
UPDATE STATISTICS myTable (status)
3. Важно обеспечить, чтобы у вас была текущая статистика по (a) всем проиндексированным столбцам и (b) всем столбцам соединения.
4.Да, SHOWPLAN не может заменить ни один сегмент кода, предназначенный для выпуска, и вдвойне любой код с сомнительной производительностью. Вы также можете SET NOEXEC ON
, чтобы избежать исполнения, например. для больших наборов результатов.