Eu já fiz isso em índices específicos antes de agora, para ajudar muitas vezes a executar consultas pesadas. Efetivamente, o que eles fizeram foi criar vários índices em cluster: quando qualquer um desses índices é usado para encontrar linhas, não é necessário trabalho extra procurando o restante dos dados no índice em cluster real (ou no heap se não houver índice em cluster real) .
Esta é uma estratégia sensata?
Para alguns índices, quando necessário, para suportar determinados padrões de consulta, certamente sim.
Mas, para fazer isso com todos os índices, eu certamente diria que não.
Vai ser um desperdício de espaço para fazer onde não é realmente necessário e reduzirá significativamente as inserções / atualizações. Isso pode diminuir a velocidade de consultas de leitura, pois ajuda também, porque cada página de índice contém menos registros; portanto, qualquer consulta que precise fazer referência a uma parte do índice para filtragem, mas não usar todas as outras colunas, precisará acessar mais páginas. Isso tornará seu banco de dados com mais memória: essas páginas precisarão ser carregadas no buffer pool, ejetando outras páginas úteis se houver pouca memória. Se a compactação for usada nesses índices para tentar mitigar o efeito nos requisitos de armazenamento e memória, ela estará enviando uma carga extra para as CPUs.
como o acesso é via ORM que, por padrão (mas nem sempre) recupera todas as colunas
Esse é um padrão comum com o uso pouco otimizado de um ORM (ou apenas ORMs ingênuos) e, nesses casos, eu vi o consultor de índices do SQL Server (e ferramentas similares de terceiros) sugerir índices com muitas INCLUDE
colunas d, então eu concordo com o seu sugestão de que é por isso que os índices foram criados dessa maneira.
Mas, embora possa tornar essas consultas um pouco mais rápidas e algumas significativamente mais rápidas, suspeito que, em muitos casos, qualquer benefício seja tão pequeno que não valha o espaço extra de memória exigido pelo seu conjunto de trabalho comum, o espaço no disco e o IO entre disco e memória.
Lembre-se também de que o ORM pode não estar selecionando todas as colunas de todas as tabelas que uma consulta toca, para que o benefício seja válido apenas para o destino principal da solicitação atual, e os índices maiores podem penalizar a consulta quando outros objetos são usados para filtrar mas não retornando dados ( SELECT * FROM table1 WHERE id IN (SELECT someID FROM table2 WHERE someColumn='DesiredValue')
talvez).
Outra consideração pelo excesso de espaço usado, especialmente se os dados forem grandes, é que eles terão um impacto na sua estratégia de backup: custos de armazenamento e transferência para esses backups, possíveis tempos de restauração e assim por diante.
devemos estar preparados para quaisquer diferenças entre os dois [no local e AzureSQL]
Geralmente, acho que as considerações aqui serão as mesmas em cada caso, embora qualquer excesso de custo de memória / IO imposto pelos grandes índices possa ser mais diretamente visível no Azure, onde você pode ajustar a camada de serviço e, portanto, a infraestrutura custa mais facilmente do que tendo um conjunto relativamente fixo de recursos de hardware. Se você usar camadas padrão / premium em vez de preços baseados em vcore, você será afetado mais pelo custo de IO no padrão, pois o premium inclui significativamente mais IO por DTU. Se você estiver usando backups com várias regiões ou redundância ou outros recursos não locais no Azure, poderá haver um custo de largura de banda associado ao espaço extra ocupado por índices desnecessariamente amplos.
SELECT
sem especificar,ORDER BY
começaram a retornar as mesmas linhas de antes, mas com uma ordem arbitrária diferente.