Diferença entre lote SQL, instrução e RPC?

35

Qual é a diferença entre lote SQL, instrução T-SQL e chamada de procedimento remoto?
Como posso saber se parte do código T-SQL é um lote ou instrução?

FrogEye
fonte

Respostas:

25

Bem, suponho que você esteja falando principalmente sobre as classes Profiler, mas a explicação permanece assim mesmo.

Um lote SQL é um conjunto de uma ou mais instruções agrupadas e separadas por uma instrução GO. EG: mais instruções SELECT e INSERT formam um lote se tiverem um GO no final.

Uma chamada RPC é uma chamada que vem de um aplicativo cliente para o banco de dados. EG: um serviço Windows, um aplicativo Web, um aplicativo Windows, o que precisar de uma conexão com o banco de dados efetivamente faz uma chamada RPC.

Agora, no Profiler, você verá tudo o que toca no servidor de banco de dados. Um lote do Management Studio, uma chamada RPC (que é um lote ou uma chamada de procedimento armazenado) de um aplicativo externo, uma execução de procedimento do Management Studio.

Cada uma delas é formada por instruções TSQL, portanto, essa classe Profiler é útil caso você queira expandir ainda mais a execução, para ver o que realmente é executado. O que insere, seleciona..etc.

A maneira mais fácil de vê-los no Profiler é habilitar apenas a chamada Final RPC ou Finalizar chamada em lote e você verá todas as estatísticas necessárias (duração, IO, CPU). Em seguida, avance ativando a classe TSQL Statements e vá mais fundo.

Marian
fonte
4
+1 Apenas para especificar, GOé o terminador de lote aceito e padrão dos clientes populares que usamos (por exemplo, SSMS e sqlcmd), mas vale a pena notar que a GOstring real como terminador de lote pode sofrer alterações e é configurável.
22413 Thomas Thomas Stringer
11
"Uma chamada RPC (que é um lote ou uma chamada de procedimento armazenado)" . Então, tudo é RPC no final? Você pode esclarecer isso?
Iain Samuel McLean Elder
Não, eu queria dizer que uma chamada RPC é formada por uma chamada de procedimento armazenado ou por um lote de mais instruções. O que você realmente vê neste evento do Profiler é um único procedimento ou um lote de mais instruções.
Marian
Por favor, veja algumas explicações aqui . Algumas outras informações aqui .
Marian
14

Instrução Lote vs T-SQL

Isso está claramente definido no BOL do SQL Server aqui

Um lote é um grupo de uma ou mais instruções Transact-SQL enviadas ao mesmo tempo de um aplicativo para o SQL Server para execução. O Go é um separador de lotes usado na maioria dos aplicativos clientes, incluindo SSMS.

O SQL Server compila as instruções de um lote em uma única unidade executável, chamada de plano de execução. As instruções no plano de execução são executadas uma de cada vez.

Em um termo simples, com base no meu entendimento, o RPC é quando você executa um processo armazenado usando a API do cliente (por exemplo, no método CommandObject. Execute do ADO.net)

Uma explicação mais detalhada é encontrada em um dos grupos de notícias da Internet que estão postando aqui :

RPC "vs" batch "é o modo de execução do TDS que o ADO.NET (ou qualquer cliente do SQL Server) usa. Quando uma instrução SQL simples sem parâmetros é executada, usamos um" batch ". Quando um proc armazenado é executado, usamos RPC (isso não é o mesmo que RPC que a chamada de procedimento remoto de rede independente, apenas chamamos esse modo de RPC no TDS (o protocolo de rede do SQL Server)). Além disso, se você executar um lote com o parâmetro, na verdade, usamos um proc armazenado chamado sp_executesql e passamos a própria instrução SQL e o restante dos parâmetros para ela, para que ela também apareça como RPC.

Pablo Castro
Gerente de Programa - Equipe ADO.NET
Microsoft Corp.

SQL Learner
fonte
portanto, se uma instrução do lote falhar, o lote inteiro será revertido automaticamente?
MonsterMMORPG
Não, cada instrução do lote é confirmada de forma autônoma, a menos que o lote esteja dentro de uma transação ativa ou você configure IMPLICIT_TRANSACTIONS ON. Lotes e transações são dois conceitos diferentes. Sei que a pergunta é muito antiga, só vou deixar isso aqui para futuros leitores.
spaghettidba