Qual é a diferença entre um procedimento armazenado e uma exibição?

138

Estou confuso sobre alguns pontos:

  1. Qual é a diferença entre um procedimento armazenado e uma exibição?

  2. Quando devo usar procedimentos armazenados e quando devo usar modos de exibição no SQL Server?

  3. As visualizações permitem a criação de consultas dinâmicas nas quais podemos passar parâmetros?

  4. Qual é o mais rápido e com que base um é mais rápido que o outro?

  5. As exibições ou procedimentos armazenados alocam memória permanentemente?

  6. O que significa se alguém diz que as visualizações criam uma tabela virtual, enquanto os procedimentos criam uma tabela de materiais?

Por favor, deixe-me saber sobre mais pontos, se houver algum.

NoviceToDotNet
fonte

Respostas:

144

Uma visualização representa uma tabela virtual . Você pode associar várias tabelas em uma exibição e usá-la para apresentar os dados como se estivessem vindo de uma única tabela.

Um procedimento armazenado usa parâmetros para executar uma função ... esteja atualizando e inserindo dados ou retornando valores únicos ou conjuntos de dados.

Criando vistas e procedimentos armazenados - possui algumas informações da Microsoft sobre quando e por que usar cada uma.

Digamos que eu tenha duas tabelas:

  • tbl_user, Com colunas: user_id, user_name,user_pw
  • tbl_profile, Com colunas: profile_id, user_id,profile_description

Então, se eu me perguntar tanto nessas tabelas ... em vez de fazer a junção em TODAS as partes do SQL, eu definiria uma exibição como:

CREATE VIEW vw_user_profile
AS
  SELECT A.user_id, B.profile_description
  FROM tbl_user A LEFT JOIN tbl_profile B ON A.user_id = b.user_id
GO

Assim, se eu quiser consulta profile_descriptionpor user_idno futuro, tudo o que tenho a fazer é:

SELECT profile_description FROM vw_user_profile WHERE user_id = @ID

Esse código pode ser usado em um procedimento armazenado como:

CREATE PROCEDURE dbo.getDesc
    @ID int
AS
BEGIN
    SELECT profile_description FROM vw_user_profile WHERE user_id = @ID
END
GO

Então, mais tarde, eu posso ligar para:

dbo.getDesc 25

e eu receberei a descrição para user_id25, onde 25é o seu parâmetro.

Obviamente, há muito mais detalhes, essa é apenas a idéia básica.

Patrick
fonte
1
Mas eu posso ingressar pode associar várias tabelas no procedimento armazenado, bem como onde eu não tenho que dar parâmetro.
NoviceToDotNet #
5
mas por que você faria isso? O que você está tentando realizar? Você pode usar uma visão como uma tabela ... os procedimentos armazenados são para FAZER coisas ... as visões são para facilitar sua vida.
Patrick Patrick
1
Pense em uma exibição como uma consulta armazenada; portanto, se você tiver duas tabelas em que precisa participar muito para fazer o trabalho, poderá criar uma exibição para trabalhar, para não precisar se juntar a elas o tempo todo.
Patrick Patrick
2
Não estou entendendo, por favor, faça um pouco mais de descrição.
NoviceToDotNet #
2
certo, mas ele armazena sua visão então ... para que você possa chamá-lo como uma única tabela. dessa maneira, você cria sua associação uma vez e qualquer uso futuro faz referência diretamente à visualização, que chama o sql subjacente como se fosse uma tabela.
Patrick Patrick
107

Muitas informações disponíveis aqui

Aqui está um bom resumo:

Um procedimento armazenado:

  • Aceita parâmetros
  • NÃO pode ser usado como bloco de construção em uma consulta maior
  • Pode conter várias instruções, loops, SE ELSE, etc.
  • Pode realizar modificações em uma ou várias tabelas
  • NÃO pode ser usado como destino de uma instrução INSERT, UPDATE ou DELETE.

Uma vista:

  • Será que não aceitam parâmetros
  • Pode ser usado como bloco de construção em uma consulta maior
  • Pode conter apenas uma única consulta SELECT
  • NÃO pode realizar modificações em nenhuma tabela
  • Mas (às vezes) pode ser usado como destino de uma instrução INSERT, UPDATE ou DELETE.
cusimar9
fonte
6
Também Visualizações não deve conter qualquer "ordem por" "top" cláusulas ou
sksallaj
2
O que significa "NÃO pode ser usado como destino de uma instrução INSERT, UPDATE ou DELETE"? Não podemos usar INSERT, DELETE, UPDATE no Stored Procedure?
Arsman Ahmad #
"Uma visualização, NÃO aceita parâmetros", não é verdade? O vídeo por exemplo: youtube.com/watch?v=zK-mWjUxKpw
xayer
As visualizações podem executar modificações nas tabelas / tabelas base: csharp-video-tutorials.blogspot.com/2012/09/…
Khurram
8

Primeiro você precisa entender que ambas são coisas diferentes. Stored Proceduressão melhor utilizados para INSERT-UPDATE-DELETEinstruções. Considerando que Viewssão usados ​​para SELECTinstruções. Você deve usar os dois.

Nas visualizações, você não pode alterar os dados. Alguns bancos de dados têm visões atualizáveis onde você pode usar INSERT-UPDATE-DELETEon Views.

Mahesh
fonte
2
Você pode alterar os dados na tabela subjacente usando Views. As visualizações são atualizáveis.
Dot Net developer
7

Uma exibição do SQL é uma tabela virtual, baseada na consulta SQL SELECT. Uma visualização faz referência a uma ou mais tabelas de banco de dados existentes ou outras visualizações. É o instantâneo do banco de dados, enquanto um procedimento armazenado é um grupo de instruções Transact-SQL compiladas em um único plano de execução.

O View é simples, apresentando dados armazenados nas tabelas do banco de dados, enquanto um procedimento armazenado é um grupo de instruções que podem ser executadas.

Uma visualização é mais rápida, pois exibe dados das tabelas referenciadas, enquanto um procedimento de armazenamento executa instruções sql.

Confira este artigo: Exibir vs procedimentos armazenados . Exatamente o que você está procurando

reggie
fonte
5

Uma visualização é uma maneira simples de salvar um complexo SELECTno banco de dados.

Um procedimento de armazenamento é usado quando o SQL simples simplesmente não é suficiente. Os procedimentos de armazenamento contêm variáveis, loops e chamadas para outros procedimentos armazenados. É uma linguagem de programação, não uma linguagem de consulta.

  1. As vistas são estáticas. Pense nelas como novas tabelas com um determinado layout e os dados neles são criados dinamicamente usando a consulta com a qual você os criou. Como em qualquer tabela SQL, você pode classificá-la e filtrá-la com WHERE, GROUP BYe ORDER BY.

  2. Depende do que você faz.

  3. Depende do banco de dados. As visualizações simples apenas executam a consulta e filtram o resultado. Porém, bancos de dados como o Oracle permitem criar uma visualização "materializada", que é basicamente uma tabela que é atualizada automaticamente quando os dados subjacentes da visualização são alterados.

    Uma visualização materializada permite criar índices nas colunas da visualização (especialmente nas colunas computadas que não existem em nenhum lugar do banco de dados).

  4. Eu não entendo do que você está falando.

Aaron Digulla
fonte
5

Além dos comentários acima, gostaria de acrescentar alguns pontos sobre o Views.

  1. As visualizações podem ser usadas para ocultar a complexidade. Imagine um cenário em que cinco pessoas estejam trabalhando em um projeto, mas apenas uma delas é muito boa com itens de banco de dados, como junções complexas. Nesse cenário, ele pode criar modos de exibição que podem ser facilmente consultados por outros membros da equipe à medida que estão consultando uma única tabela.
  2. A segurança pode ser facilmente implementada pelo Views. Suponha que tenhamos um Funcionário da tabela que contenha colunas sensíveis como Salário , número do SSN . Essas colunas não devem estar visíveis para os usuários que não estão autorizados a visualizá-las. Nesse caso, podemos criar uma View selecionando as colunas em uma tabela que não exija nenhuma autorização como Nome , Idade , etc., sem expor colunas sensíveis (como Salário, etc., mencionamos anteriormente). Agora podemos remover a permissão para consultar diretamente a tabela Employee e apenas manter a permissão de leitura na tela View. Dessa forma, podemos implementar a segurança usando o Views.
Ajendra Prasad
fonte
4
  1. Uma VIEW é uma consulta dinâmica na qual você pode usar uma cláusula "WHERE"
  2. Um procedimento armazenado é uma seleção de dados fixa, que retorna um resultado predefinido
  3. Nem uma exibição, nem um procedimento armazenado alocam memória. Somente uma visão materializada
  4. Uma TABELA é apenas uma ENTIDADE, uma exibição pode coletar dados de diferentes ENTIDADES ou TABELAS
suíço
fonte
4

Mahesh não está certo quando sugere que você não pode alterar os dados em uma exibição. Então, com a visão de Patrick

CREATE View vw_user_profile AS 
Select A.user_id, B.profile_description
FROM tbl_user A left join tbl_profile B on A.user_id = b.user_id

POSSO atualizar os dados ... como exemplo, posso fazer um desses ...

Update vw_user_profile Set profile_description='Manager' where user_id=4

ou

Update tbl_profile Set profile_description='Manager' where user_id=4

Você não pode INSERIR nessa exibição, pois nem todos os campos de toda a tabela estão presentes e estou assumindo que PROFILE_ID é a chave primária e não pode ser NULL. No entanto, às vezes você pode INSERIR em uma visualização ...

Criei uma exibição em uma tabela existente usando ...

Create View Junk as SELECT * from [TableName]

ENTÃO

Insert into junk (Code,name) values 
('glyn','Glyn Roberts'),
('Mary','Maryann Roberts')

e

DELETE from Junk Where ID>4

Tanto o INSERT quanto o DELETE trabalharam neste caso

Obviamente, você não pode atualizar nenhum campo agregado ou calculado, mas qualquer exibição que seja apenas uma exibição direta deve ser atualizável.

Se a visualização contiver mais de uma tabela, você não poderá inserir ou excluir, mas se a visualização for apenas um subconjunto de uma tabela, normalmente poderá.

Glyn Roberts
fonte
3

A principal diferença é que, quando você está consultando uma visualização, sua definição é colada na sua consulta. O procedimento também pode fornecer resultados de consulta, mas é compilado e por muito mais rápido. Outra opção são visualizações indexadas.

rsc
fonte
1

O @Patrick está correto com o que ele disse, mas, para responder às outras perguntas, o View será criado na Memória e, dependendo do tipo de Junções, Dados e se houver alguma agregação, pode ser um modo de exibição com muita memória.

Os procedimentos armazenados fazem todo o processamento usando a Tabela Temp Hash, por exemplo, # tmpTable1 ou na memória usando @ tmpTable1. Dependendo do que você quer que ele faça.

Um procedimento armazenado é como uma função, mas é chamado diretamente pelo seu nome. em vez de funções que são realmente usadas dentro de uma consulta em si.

Obviamente, na maioria das vezes, as tabelas de memória são mais rápidas, se você não estiver recuperando muitos dados.

Robbie Tapping
fonte