Вопрос

Насколько я понимаю, значения NULL не индексируются в DB2, поэтому предположим, что у нас есть огромная таблица (Продажи) со столбцом даты (sold_on), который обычно является датой, но иногда (в 10% случаев) имеет значение NULL.

Кроме того, давайте предположим, что это устаревшее приложение, которое мы не можем изменить, поэтому эти нули остаются там и что-то значат (скажем, возвращенные продажи).

Мы можем ускорить следующий запрос, поместив индекс в столбцы «sold_on» и «total».

Select * from Sales 
where 
Sales.sold_on between date1 and date2
and Sales.total = 9.99

Но индекс не сделает этот запрос быстрее:

Select * from Sales 
where 
Sales.sold_on is null
and Sales.total = 9.99

Потому что индексация выполняется по значению.

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

Это было полезно?

Решение

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

Подумайте, сколько записей находится на странице/блоке — скажем, 20.Причина использования индекса заключается в том, чтобы избежать загрузки ненужных страниц.Вероятность того, что данная страница будет содержать 0 записей со значением NULL, равна (90%)^20, или 12%.Это не очень хорошие шансы — вам в любом случае понадобится, чтобы 88% ваших страниц были загружены, а использование индекса не очень полезно.

Однако если ваше предложение выбора включало только несколько столбцов (а не *) — скажем, только salesid, вы, вероятно, могли бы заставить его использовать индекс (sold_on,salesid), поскольку чтение страницы данных не было бы необходимо - все данные будут в индексе.

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

Откуда у вас сложилось впечатление, что DB2 не индексирует значения NULL?Я не могу найти ничего в документации или статьях, подтверждающих это утверждение.И я только что выполнил запрос к большой таблице с использованием ограничения IS NULL, включающего индексированный столбец, содержащий небольшую часть значений NULL;в этом случае DB2 определенно использовала индекс (проверенный EXPLAIN и наблюдением того, что база данных ответила мгновенно, вместо того, чтобы тратить время на сканирование таблицы).

Так:Я утверждаю, что у DB2 нет проблем с NULL в индексах без первичного ключа.

Но как писали другие:Ваши данные могут быть составлены таким образом, что DB2 считает, что использование индекса не будет быстрее.Или статистика базы данных для задействованных таблиц неактуальна.

Эмпирическое правило заключается в том, что индекс полезен для значений до 15% записей....поэтому индекс может быть здесь полезен.

Если DB2 не будет индексировать нули, я бы предложил добавить логическое поле IsSold и установить для него значение true всякий раз, когда устанавливается дата проданного_на (это можно сделать в триггере).

Это не самое лучшее решение, но может быть то, что вам нужно.

Троэльс прав;даже строки со значением SOLD_ON, равным NULL, получат выгоду от индекса в этом столбце.Если вы выполняете ранжированный поиск на SOLD_ON, вы можете получить еще большую выгоду, создав кластеризованный индекс, который начинается с SOLD_ON.В этом конкретном примере может не потребоваться больших дополнительных затрат для поддержания порядка кластеризации на основе SOLD_ON, поскольку новые добавленные строки, скорее всего, будут иметь более новую дату SOLD_ON.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top