Физическая последовательность многоколоночного кластерного индекса - PullRequest
1 голос
/ 04 декабря 2011

Мне интересно, как база данных будет хранить кластерную индексированную таблицу с несколькими столбцами.

* 1003 Е.Г. *

У меня есть такая таблица:

product area price date
Wood NewYork 20 20111102
Iron NewYork 155 20111102
Stone NewYork 33 20111102
Wood Boston 21 20111102
Iron Boston 150 20111102
Stone Boston 30 20111102

Wood NewYork 19 20111101
Iron NewYork 165 20111101
Stone NewYork 32 20111101
Wood Boston 22 20111101
Iron Boston 159 20111101
Stone Boston 34 20111101

Большинство моих запросов - получить среднюю цену за определенный товар в определенный день. Первичный ключ имеет значение (product, area, date), для этого первичного ключа существует кластеризованный индекс.

Вопрос 1.
Как база данных будет физически хранить эти данные? Если в последовательности (product, area, date), это может выглядеть как

product area price date
Wood NewYork .. 20111102
Wood Boston .. 20111102
Wood ... .. 20111101
Wood ...  .. 20111101

Iron NewYork  50 20111102
Iron Boston 30 20111102

Stone NewYork 19 20111101
Stone Boston 165 20111101

Но разве не будет быстрее, если физические записи упорядочены по датам, тогда БД сможет загружать строки с меньшим количеством операций на диске? Если это так, могу ли я контролировать заказ?

Вопрос 2. Похоже, что кластеризованный индекс не обеспечивает повышения производительности запроса. После того как я добавил некластеризованный индекс по дате, для большинства запросов скорость составляет 1 секунду (50 секунд, когда по дате нет индекса). Почему такая огромная разница?

1 Ответ

3 голосов
/ 04 декабря 2011

Индекс кластеризации определяет физический порядок, так что в вашем случае у вас будет

product  area      price  date

Iron     Boston     30    20111102
Iron     NewYork    50    20111102

Stone    Boston    165    20111101
Stone    NewYork    19    20111101

Wood     Boston     ..    20111102
Wood     NewYork    ..    20111102

и так далее. Это отличный индекс , если вы всегда выбираете по этим трем столбцам - если вы всегда выбираете product, area и date. Однако этот индекс не поможет вам, если вы выберете только date - составной индекс будет использоваться только в том случае, если вы используете / задаете n крайних левых столбцов; этот индекс здесь можно использовать для product, product и area или для всех трех столбцов, но не для других столбцов.

В зависимости от ваших потребностей, вы также можете

  • поставить некластеризованный первичный ключ на (product, area, date) (если это действительно единственная комбинация столбцов, делающая ваши строки уникальными) - или подумать о суррогатном столбце INT IDENTITY чтобы упростить это

  • поместить кластеризованный индекс на, например, (date, product), чтобы ваши данные были упорядочены так, как вам нужно для запросов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...