#sql-server
Вопрос:
Я работаю с таблицей, которая содержит примерно миллиард строк. У него есть столбец с меткой времени, который по своей природе постоянно увеличивается.
Если бы я запросил эту таблицу и запросил записи, созданные за последние 5 минут (используя метку времени в предложении where), SQL Server просканирует весь индекс, чтобы получить результаты, и это может занять несколько минут.
Однако, поскольку этот столбец постоянно увеличивается и, следовательно, упорядочивается, SQL Server может использовать более сложную технику поиска для поиска этих записей, как если бы это был индекс. Я понимаю, что SQL Server не знает, что эти столбцы упорядочены (за пределами некоторой статистики/информации о распространении), и он также не может гарантировать, что они упорядочены, поэтому он не может этого сделать.
Возможно, существует «постоянно растущее» ограничение, в соответствии с которым любые добавленные новые строки должны иметь значение столбца с меткой времени, которое больше или равно предыдущему? Похоже, должен быть способ воспользоваться естественным порядком этой колонки.
Комментарии:
1. И почему бы вам просто не проиндексировать столбец?
2. Если ваш наиболее распространенный запрос в этой таблице основан на метке времени, то, возможно, этот столбец должен быть ключом кластеризации (потенциально не уникальным, чтобы разрешить несколько записей с одной и той же меткой времени, если это возможно). Для таблиц журналов с высокой пропускной способностью часто имеет смысл сделать дату создания ключом кластеризации, который не ограничивается постоянным увеличением, но если это так, у вас не возникнет никаких проблем с разделением страниц, и ваши поиски записей за последние 5 минут будут быстрыми.
3. @stickybit, потому что это большая таблица, и есть только несколько запросов, которые используют этот столбец
4. @GarethD согласился. Это было бы идеально
5. @EvanPayne: Ну и что? В настоящее время дисковое пространство дешево, поэтому объем, необходимый для индекса, не должен быть проблемой. И запросы, не использующие столбец, не должны быть затронуты им вообще (если вы столкнулись с иным и подозреваете, что это замедляет другие запросы, вам следует опубликовать новый вопрос, включающий
CREATE
инструкции таблицы и индекса, запрос (a) и план выполнения, показывающий, что индекс используется.)
Ответ №1:
К сожалению, такого ограничения/опции/и т.д. нет. SQL server не знает, что такое связь между таблицами или индексами… Честно говоря, я думаю, что вам следует подумать о создании индекса для этого столбца. Другим вариантом было бы создать разделы в этой таблице на основе столбца метки времени, тогда вы сможете заставить SQL сканировать только данный раздел. Однако новый индекс-это гораздо более простое и гибкое изменение.