Como o uso de esquemas separados afeta o desempenho do SQL Server 2008?

11

Desejo usar esquemas separados para objetos com diferentes propósitos em nosso banco de dados do SQL Server 2008. No momento, usamos uma convenção de nomenclatura bastante entorpecente para indicar a finalidade de uma tabela ou procedimento armazenado, e os prefixos significam que precisamos digitalizar cinco ou seis caracteres x antes mesmo de ver o início do nome exclusivo. Gostaria de usar esquemas separados para tabelas que são usadas apenas para direcionar a interface do usuário (menus, funções por pessoa, etc.) e para aquelas que são tabelas de dimensões versus tabelas de fatos, etc.

Minha pergunta é: haverá impactos no desempenho ao usar vários esquemas (esquemas?) Que se opunham ao bom e velho dbo de tudo?


fonte

Respostas:

4

Pode haver um impacto no desempenho do otimizador de consultas, embora seja pequeno, dependendo do seu estilo de codificação. Se você referenciar uma tabela sem um esquema, o otimizador deve tentar identificar a tabela primeiro, verificando as tabelas no esquema padrão do usuário (se houver), depois usando dbo. E tudo mais. Se você referenciar explicitamente as tabelas como schema.table, o que provavelmente é uma boa prática de qualquer maneira, mesmo essa pequena sobrecarga será evitada.


fonte
1

Não há diferença no desempenho. No entanto, você está usando esquemas agora (mesmo que não o conheça).

O uso de referências a esquema de objetos, como tabelas, procedimentos armazenados, UDFs, etc, que são não qualificado pelo esquema não ter um impacto no desempenho. As referências sempre devem ser qualificadas pelo esquema. Tais referências não qualificadas precisam ser resolvidas, e isso acontece assim:

  • Primeiro, procure um objeto com o mesmo nome e tipo no esquema padrão do usuário sob cujas credenciais a sessão foi estabelecida (por exemplo jsmith). Se encontrado, essa instância é usada.
  • Caso contrário, procure um objeto com o mesmo nome e digite no esquema dbo.

Isso tem vários efeitos:

  • Na maioria das vezes, são necessárias duas pesquisas para resolver a referência, e não a pesquisa única necessária, se a referência for qualificada pelo esquema.
  • O plano de execução obtido quando a consulta / procedimento armazenado / função definida pelo usuário está vinculada não pode ser armazenada em cache e reutilizada.

O efeito final que você encontrará apenas dolorosamente quando algo quebra é que usuários diferentes podem obter resultados diferentes de uma consulta ou procedimento armazenado. Algo como select * from foo join barpode funcionar bem para mim como proprietário do banco de dados; pode ser quebrado para o usuário jsmithque, inadvertidamente ou não, criou uma tabela nomeada foosob seu próprio esquema ( jsmith.foo) no mesmo banco de dados.

Por esse motivo, também, createe as dropinstruções devem qualificar o esquema do nome do objeto que está sendo criado ou descartado.


fonte