Я делал это по определенным индексам до сих пор, чтобы помочь часто выполнять тяжелые запросы. По сути, они создали несколько кластеризованных индексов: когда любой из этих индексов используется для поиска строк, не требуется никакой дополнительной работы для поиска остальных данных в реальном кластеризованном индексе (или в куче, если реального кластеризованного индекса нет). ,
это разумная стратегия?
Для некоторых индексов, где необходимо поддерживать определенные шаблоны запросов, конечно, да.
Но чтобы сделать это со всеми индексами, я бы точно так же сказал, что нет.
Это будет расточительное пространство для выполнения там, где это на самом деле не нужно, и значительно замедлит вставку / обновление. Это может замедлить столько запросов на чтение, сколько и помогает, потому что на каждой странице индекса содержится меньше записей, поэтому любой запрос, которому необходимо ссылаться на часть индекса для фильтрации, но не используя все другие столбцы, должен будет получить доступ к большему количеству страниц. Это сделает вашу базу данных более требовательной к памяти: эти страницы необходимо будет загрузить в пул буферов, что может привести к удалению других полезных страниц при нехватке памяти. Если для этих индексов используется сжатие, чтобы попытаться смягчить влияние на требования к объему памяти и памяти, вместо этого оно будет увеличивать нагрузку на ЦП.
поскольку доступ осуществляется через ORM, который по умолчанию (но не всегда) извлекает все столбцы
Это обычная модель с плохо оптимизированным использованием ORM (или просто наивных ORM), и в этих случаях я видел, как советник по индексам SQL Server (и подобные сторонние инструменты) предлагает индексы с большим количеством INCLUDE
столбцов d, поэтому я согласен с вашим Предположение, что именно поэтому индексы были созданы таким образом.
Но хотя это может сделать все такие запросы несколько быстрее, а некоторые - значительно быстрее, я подозреваю, что во многих случаях любое преимущество настолько мало, что не стоит дополнительной памяти, необходимой для вашего общего рабочего набора, места на диске и IO между диском и памятью.
Также помните, что ORM может не выделять все столбцы всех таблиц, к которым обращается запрос, так что преимущество может иметь место только для главной цели текущего запроса, а более крупные индексы могут оштрафовать запрос, когда другие объекты используются для фильтрации. но не возвращая данные ( SELECT * FROM table1 WHERE id IN (SELECT someID FROM table2 WHERE someColumn='DesiredValue')
возможно).
Еще одно соображение относительно используемого избыточного пространства, особенно если объем данных большой, заключается в том, что это повлияет на вашу стратегию резервного копирования: затраты на хранение и передачу для этих резервных копий, потенциальное время восстановления и т. Д.
должны ли мы быть готовы к любым различиям между двумя [on-prem & AzureSQL]
В целом, я думаю, что соображения здесь будут одинаковыми в каждом случае, хотя любые избыточные затраты памяти / ввода-вывода, вызванные большими индексами, могут быть более четко видны в Azure, где вы можете настроить уровень обслуживания, и, следовательно, стоимость инфраструктуры легче, чем имея относительно фиксированный набор аппаратного ресурса. При использовании стандартных / премиальных уровней вместо цен на основе vcore затраты на ввод-вывод в стандарте окажут на вас большее влияние, так как наценка включает значительно больше операций ввода-вывода на DTU. Если вы используете резервное копирование нескольких регионов или избыточность или другие нелокальные функции в Azure, то может потребоваться пропускная способность, связанная с дополнительным пространством, занимаемым неоправданно широкими индексами.
SELECT
без указанияORDER BY
начал возвращаться те же строки, что и раньше, но в другом произвольном порядке.