Предположим, у вас есть таблица с медленно меняющимся измерением типа 2.
Давайте представим эту таблицу следующим образом со следующими столбцами:
* [Key]
* [Value1]
* ...
* [ValueN]
* [StartDate]
* [ExpiryDate]
В этом примере предположим, что [StartDate] фактически является датой, когда значения для данного [Key] становятся известны системе. Таким образом, наш первичный ключ будет состоять из [StartDate] и [Key].
Когда для данного [Key] поступает новый набор значений, мы присваиваем [ExpiryDate] какое-то предопределенное старшее суррогатное значение, например «31.12.9999». Затем мы устанавливаем существующие «самые последние» записи для этого [Key] так, чтобы [ExpiryDate] был равен [StartDate] нового значения. Простое обновление на основе соединения.
Итак, если бы мы всегда хотели получить самые последние записи для данного [Key], мы знаем, что можем создать кластеризованный индекс, который будет таким:
* [ExpiryDate] ASC
* [Key] ASC
Хотя пространство ключей может быть очень широким (скажем, миллион ключей), мы можем минимизировать количество страниц между чтениями, изначально упорядочив их по [ExpiryDate]. И поскольку мы знаем, что самая последняя запись для данного ключа всегда будет иметь [ExpiryDate] '31/12/9999', мы можем использовать это в наших интересах.
Однако... что, если мы хотим получить снимок всех [Key] на определенный момент времени? Теоретически не все пространство ключей обновляется одновременно. Следовательно, для данного момента времени окно между [Дата начала] и [Дата окончания] является переменным, поэтому упорядочение по [Дата начала] или [Дата окончания] никогда не даст результата, в котором все записи, которые вы ищете, смежный. Конечно, вы можете сразу отбросить все записи, в которых [StartDate] больше заданного вами момента времени.
По сути, какая стратегия индексирования в типичной СУБД обеспечивает лучший способ минимизировать количество операций чтения для извлечения значений всех ключей для заданного момента времени? Я понимаю, что могу, по крайней мере, максимизировать ввод-вывод, разбив таблицу на разделы [Key], однако это, конечно, не идеально.
В качестве альтернативы, существует ли другой тип медленно меняющегося измерения, который решает эту проблему более эффективно?