Implementamos alguns recursos usando o service broker e implantamos recentemente na produção. Estou observando que o contador "Stored Procedures Invoked/sec" está sempre aumentando. No entanto, posso ver que outros contadores, como Tarefas em execução, etc., estão estáveis. Por que os procedimentos armazenados invocados/s não se atêm a um intervalo?
Ashwini Mohan's questions
Estou me conectando a um servidor de banco de dados (MSSQL 2008R2) usando SSMS 2016 e para consultas simples, mesmo como "USE DBNAME", leva de 4 a 5 segundos. No entanto, a estatística de tempo mostra "Tempo de CPU = 0 ms, tempo decorrido = 0 ms", não sabe por quê?
Por outro lado, se eu conectar o mesmo servidor usando o SSMS 2008R2, ele será executado instantaneamente.
Comparei as estatísticas do cliente para SSMS2008R2 E 2016, mas ambos mostram quase as mesmas estatísticas.
Por que meu SSMS2016 está se comportando assim?
Estou ajustando um SP e reescrevendo-o para otimizar. Agora estou comparando o código antigo e o novo código em termos de tempo usando "definir tempo de estatísticas para ligar/desligar".
Ao desativar as estatísticas de tempo, meu novo código está funcionando bem, pelo menos 4 vezes melhor que o código antigo (o código antigo leva 4 segundos e o novo código leva 1 segundo para ser executado), mas quando estou definindo as estatísticas de tempo, meu novo código está demorando aproximadamente 12 segundos e o código antigo está demorando cerca de 7 segundos.
Por que o novo código está funcionando mal depois de ativar as estatísticas de tempo? Parece que também há algum custo de estatísticas de tempo e no meu novo código, esse custo é muito maior em comparação com o código antigo. Estou certo? Se sim, o que é isso?
Estou trabalhando na otimização de um SP que contém alguma lógica de negócios usando looping. Eu removi o loop e converti esse trecho de código em algumas instruções simples de inserção/atualização.
Agora tenho que fazer benchmarking e comparar o código antigo e o novo em termos de tempo de execução e leituras lógicas/físicas.
Meu problema é por causa do loop no meu código antigo, como posso determinar qual é o número total de leituras lógicas/físicas. Porque no SSMS, posso ver milhares de declarações de estatísticas de IO como:
"Tabela 'Funcionário'. Contagem de varredura 1, leituras lógicas 3, leituras físicas 0, leituras antecipadas 0, leituras lógicas lob 43, leituras físicas lob 0, leituras antecipadas lob 0."
Ao executar o proc1, estou recebendo o erro abaixo:
UPDATE falhou porque as seguintes opções SET têm configurações incorretas: 'ANSI_WARNINGS'. Verifique se as opções SET estão corretas para uso com exibições indexadas e/ou índices em colunas computadas e/ou índices filtrados e/ou notificações de consulta e/ou métodos de tipo de dados XML e/ou operações de índice espacial.
Eu sei que isso está acontecendo porque estou tendo um índice filtrado na tabela do cliente e isso requer SET ANSI_WARNINGS ON.
Ainda precisamos ter algumas opções ANSI que precisam ser cuidadas ao criar índice filtrado e proc armazenado. Eu lidei com essas coisas.
E consertei o problema definindo ansi_warning em proc1, que é a solução ideal.
Mas minha pergunta é, mesmo depois de definir todas as opções ANSI necessárias no proc2, por que estou recebendo esse erro? Qualquer ideia?
Abaixo está o meu código de exemplo:
create Customers
(
id int,
name varchar(100),
[Stats] BIT NOT NULL DEFAULT 1,
)
go
CREATE NONCLUSTERED INDEX [IX_Customers_Stats]
ON [dbo].[Customers]([Stats])
WHERE [Stats] = 0
go
CREATE PROC proc1
as
BEGIN
SET ANSI_WARNINGS OFF;
SET NOCOUNT ON;
....
...
.. some code .....
....
...
EXEC proc2 @customerId
END
go
createPROCEDURE [dbo].[proc2 ]
@customerId INT
AS
BEGIN
SET ANSI_WARNINGS ON;
SET ANSI_NULLS ON;
SET ANSI_PADDING ON;
SET ARITHABORT ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET NUMERIC_ROUNDABORT ON;
SET QUOTED_IDENTIFIER ON;
UPDATE dbo.Customers set Stats = 0 where id = @CustomerId
END