AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 3999
Accepted
8kb
8kb
Asked: 2011-07-21 14:30:08 +0800 CST2011-07-21 14:30:08 +0800 CST 2011-07-21 14:30:08 +0800 CST

A adesão ao princípio DRY justifica o SQL dinâmico?

  • 772

Suponha que eu tenha duas consultas que serão executadas com frequência em meu banco de dados:

SELECT 
  UserID,
  UserName,
  UserGender
FROM Users
WHERE UserID = @User

SELECT 
  UserID,
  UserName,
  UserGender
FROM Users
WHERE UserName LIKE @Name + '%

Eles devem estar em dois procedimentos armazenados separados ou apenas um único que cria as instruções dinamicamente usando sp_executesql?

Se eles estiverem em dois procedimentos armazenados, precisarei modificar ambos os procedimentos se quiser adicionar ou remover uma coluna na instrução SELECT. E se eu usar SQL dinâmico, presumivelmente estou sacrificando uma pequena quantidade de desempenho.

Este é um caso em que a manutenção e a adesão ao princípio DRY (não se repita) usando SQL dinâmico teriam precedência sobre o ganho de desempenho de um procedimento armazenado?

stored-procedures best-practices
  • 2 2 respostas
  • 781 Views

2 respostas

  • Voted
  1. Best Answer
    gbn
    2011-07-21T21:59:23+08:002011-07-21T21:59:23+08:00

    Strict DRY realmente não se aplica a bancos de dados

    Eu vi DRY ser usado como justificativa para criar visualizações para "reutilização". Então, temos visualizações juntando visualizações, etc., e pioramos o desempenho.

    Geralmente, consultas semelhantes serão usadas de maneiras diferentes. Um pode ter um agregado, outro não, os filtros serão diferentes (como acima). A semelhança não justifica o SQL dinâmico nem justifica uma visualização.

    No seu caso específico acima, eu consideraria uma instrução IF para capturar a diferença, especialmente se o código foi emitido pela mesma página de pesquisa ou formulário: você tem semelhança com base no uso, não apenas nas mesmas colunas e tabelas sendo usadas.

    Além disso, você tem segurança a considerar.

    SQL dinâmico requer EXECUTE AS (escalonamento de direitos) ou permissões nas tabelas base. O uso de um procedimento armazenado simples não requer tais permissões.

    Você também pode ter código de cliente diferente: temos procedimentos armazenados por cliente (permissões de controle de esquemas). Deseja CONCEDER direitos de seleção em todas as suas mesas a todos os clientes?

    • 9
  2. Aaron Bertrand
    2011-07-21T16:52:33+08:002011-07-21T16:52:33+08:00

    Não tenho certeza se o SQL dinâmico é a única resposta aqui, embora às vezes possa ser a melhor solução se os parâmetros de pesquisa ficarem relativamente complexos. No caso simples que você propõe, por que não uma consulta simples que aceite um ou ambos os parâmetros...

    WHERE UserID = COALESCE(@User, UserID)
    AND UserName LIKE COALESCE(@Name+'%', UserName)
    

    Mas você terá que considerar o SQL dinâmico se as condições de pesquisa ficarem complexas porque o SQL Server terá mais sorte tentando otimizar planos para as várias versões da consulta e tentando criar um plano mágico que satisfaça todos os diferentes critérios de pesquisa.

    Você pode criar procedimentos armazenados separados que identificam o(s) usuário(s) por seus métodos de pesquisa individuais, retornando apenas os valores da chave primária e, em seguida, chamar qualquer procedimento com base nos critérios, despejar os resultados em uma tabela #temp e, em seguida, defina o restante de sua lista de seleção em uma junção com a tabela base. Muito mais trabalho na frente, mas evita o problema de manutenção e permite otimizar procedimentos armazenados para cada critério de pesquisa.

    • 6

relate perguntas

  • Como descubro se existe um procedimento ou função em um banco de dados mysql?

  • Alguém está usando o recurso do SQL Server para criar grupos de stored procedures diferenciadas por número?

  • SQL dinâmico em rotinas armazenadas do MySQL

  • Qual é a configuração RAID recomendada para um banco de dados Oracle?

  • Melhores práticas para conectar bancos de dados que estão em diferentes regiões geográficas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve