Existe um ganho de desempenho ao manipular dados com procedimentos armazenados versus alimentá-los em funções após a recuperação?

8

O título resume tudo. Estou razoavelmente familiarizado com o PHP e confortável em fazê-lo com os valores extraídos do MySQL, no entanto, no interesse de expandir meu conhecimento, tenho me perguntado se talvez fosse uma técnica mais eficiente no longo prazo. Eles são equivalentes (por serem aproximadamente a mesma quantidade de processamento no final) ou existem casos em que um apresenta uma vantagem distinta sobre o outro?

Kaji
fonte
3
Boa pergunta e ponto de discussão de longa data .. quanto será do lado da APP, quanto será feito no lado do DB. Você pode reformulá-lo para "RDBMS to APP-Layer", porque a pergunta se aplica a todos os tipos de interações de banco de dados e APP.
Sebastian Roth
2
Quero acrescentar tanto a essa pergunta, mas não tenho nada de interesse em adicionar. Esta é uma ótima pergunta, e eu não me importaria se tornar um FAQ canônica
jcolebrand
Na verdade, eu estava pensando em fazer essa pergunta, se teria sido abordada aqui por DBAs. Procurei algo completamente diferente e encontrei este por acidente. Então, +1 para ler minha mente
Derek Downey

Respostas:

6

Depende muito do que você está fazendo com os registros e da aparência da sua arquitetura de rede. Por exemplo, se o procedimento armazenado reduzir a quantidade geral de dados transmitidos do MySQL para PHP e você tiver um link relativamente lento entre a instância do PHP e o banco de dados, um SP certamente poderá ajudá-lo.

Eu recomendo que você comece com algumas das manipulações 'mais pesadas' que você faz com seus dados no lado do PHP, veja o que você pode escrever como um SP e depois faça o benchmark.

TML
fonte
5

Um ponto a favor de fazer mais processamento no banco de dados é que o banco de dados não pode otimizar o que não vê. Como exemplo, definir uma propriedade de uma classe persistente como um valor constante para todas as instâncias definitivamente terá um desempenho melhor se for feito na camada de banco de dados.

Um ponto contra é que os bancos de dados são bons em operações baseadas em conjuntos, mas não tão bons em operações baseadas em linhas. Por exemplo, algo como converter um horário UTC para horário local com base em um fuso horário variando por linha pode não ter um desempenho tão bom no banco de dados quanto na camada de aplicativos.

Larry Coleman
fonte
Um excelente ponto sobre o otimizador.
TML
2

Geralmente, se o resultado é uma agregação (soma, média, contagem), é muito mais rápido ser calculado no servidor de banco de dados, evitando a comunicação desnecessária entre o servidor e o cliente. Além disso, a ordenação e o agrupamento podem se beneficiar dos índices, reduzindo a quantidade de computação.

Razvan Popovici
fonte