O relatório no SQL Server Management Studio apresenta a utilização da CPU do sistema dividida por um minuto. Existe uma maneira de especificar o intervalo - talvez por 10 segundos?
AngryHacker's questions
Estou assumindo que as janelas da caixa de ferramentas no SSMS são usadas para armazenar amostras de código. Assim, posso destacar o código no editor e arrastá-lo para a janela Toolbox.
No entanto, se eu quiser usar o exemplo de código e arrastá-lo de volta para o editor (ou clicar duas vezes nele), não posso. Todas as entradas na Caixa de ferramentas estão esmaecidas. E quando eu arrasto uma entrada, ele transforma o cursor do mouse em um sinal de parada.
O que preciso fazer para habilitar essa funcionalidade?
Eu peguei essas duas entradas destacando algum código no editor e arrastando-o para a área em Samples. Primeiro, ele aparece como texto real que você arrastou. Mas você pode clicar com o botão direito do mouse, selecionar Renomear e dar um nome amigável.
Informação adicional:
Usando o SSMS v17.9.1 e o único suplemento instalado no SQL Prompt 8.
A única solução que funciona é clicar na entrada, Ctrl+C, e colá-la no editor.
Para realmente exibir as tarefas do plano de manutenção, você deve clicar com o botão direito do mouse e selecionar Mostrar tudo.
Eu gostaria de encontrar a distância entre 2 conjuntos de coordenadas. Primeiro eu uso a função embutida:
declare @lat1 real = 33.1, @lon1 real =-117.1, @lat1 real = 39.6, @lon1 real =-98.7
declare @source geography = geography::Point(@lat1, @long1, 4326);
declare @target geography = geography::Point(@lat2, @long2, 4326);
select @source.STDistance(@target)
Agora eu uso o cálculo manual para fazer a mesma coisa:
-- Kilometers to Miles: 0.621371, Earth Radius: 6378.137
select 0.621371 * 6378.137 * ACOS(ROUND(
(SIN(PI() * @lat2 /180) * SIN(PI() * @lat1/180))
+ (COS(PI() * @lat2 /180) * COS(PI() * @lat1/180) * COS(PI() * @lon1/180 - PI() * @lon2 /180)), 12))
Em meus testes no SQL Server 2014, a função manual é cerca de 4x mais rápida que a interna. Isso é normal ou estou perdendo algo fundamental?
Nossa TI configurou um SQL Server como uma VM em uma grande caixa VMWare que contém outras VMs. As CPUs são configuradas como compartilhadas. Como resultado, qualquer consulta que possa precisar de várias CPUs demora 30 vezes mais do que se eu a limitasse a uma única CPU. Exemplo:
SELECT TOP 2000 lwa.Message INTO #foo
FROM dbo.LogWidgetsAPI lwa (NOLOCK)
ORDER BY lwa.TimeStamp
vs
SELECT TOP 2000 lwa.Message INTO #foo
FROM dbo.LogWidgetsAPI lwa (NOLOCK)
ORDER BY lwa.TimeStamp
OPTION (MAXDOP 1) ------------- Force it to run on a single CPU
O primeiro exemplo usa paralelismo e leva cerca de 30 segundos ou mais. O segundo força o uso de uma única CPU e demora 20 milissegundos.
Nota: depois de executar a consulta de CPU única, volto à execução da multi-cpu e o tempo e o plano são os mesmos - então não acho que o problema esteja relacionado a "cache frio" versus "cache quente"
Portanto, minha teoria é que, como a primeira consulta usa várias CPUs, ela deve esperar até que todas as CPUs em questão estejam ociosas e, portanto, apenas espera.
Então minha pergunta. As VMs do SQL Server devem ter CPUs dedicadas ou as compartilhadas são normais?
Aqui está o plano que usa paralelismo. Aqui está o plano que força uma única CPU.
Considere as perguntas abaixo. A única diferença é 1.000 vs 2.000 linhas retornadas.
SELECT TOP 1000 lwa.Message INTO #foo
FROM dbo.LogWidgetsAPI lwa (NOLOCK)
ORDER BY lwa.TimeStamp
vs
SELECT TOP 2000 lwa.Message INTO #foo
FROM dbo.LogWidgetsAPI lwa (NOLOCK)
ORDER BY lwa.TimeStamp
No entanto, 1.000 linhas são retornadas em menos de um segundo, enquanto a consulta com 2.000 linhas leva muito mais tempo.
O plano de consulta para a primeira consulta é razoavelmente simples:
mas a segunda consulta está usando paralelização:
O que usaria apenas 1k linhas mais forçaria a paralelização?
PS A tabela contém mais de 6 milhões de registros e a coluna TimeStamp é indexada.
- Vá para uma tabela aleatória no Object Explorer
- Expanda-o para índices
- Clique com o botão direito do mouse em um índice - leva cerca de 10 segundos para aparecer
Se eu tentar criar um DROP & CREATE INDEX
script fora do menu de contexto, levará um tempo semelhante.
Examinei o rastreamento do Profiler e ele tem cerca de 4 páginas de consultas amplamente repetidas. Se eu olhar para a guia Desempenho/Ethernet do Gerenciador de Tarefas, vejo que ele está trazendo informações a uma taxa de 800kb-1mb e enviando cerca de 200kb ou mais.
Isso é um inseto? Característica? Estou perdendo alguma configuração simples?
- Versão do SSMS: 13.0.15900.1.
- SSMS atualizado para 13.0.16000.28 sem efeito.
- Versão do SQL Server: 2016 com atualização cumulativa 2.
- Eu tinha o SQL Prompt 7 instalado. Desinstalei, mas nada mudou.
SELECT COUNT(*) FROM sys.indexes;
retorna 1979.SELECT COUNT(*) FROM sys.partitions;
retorna 1973.
Eu tenho a caixa só para mim, então não há disputa. Além disso, esta caixa é a caixa mais rápida e com as melhores especificações em que já trabalhei. Tudo é rápido nele, exceto esta operação específica.
Eu tenho um aplicativo (serviço do Windows) local para a caixa do SQL Server. Ele chama um procedimento armazenado na caixa do SQL Server que retorna uma tonelada de dados e, portanto, causa a espera ASYNC_NETWORK_IO.
A conexão com o banco de dados é do tipo Shared Memory (verifiquei duas vezes a sanidade). Por que haveria um tipo de espera ASYNC_NETWORK_IO na conexão de memória compartilhada?
Eu pensei que ASYNC_NETWORK_IO tinha a ver com um atraso de rede?
Ao olhar para a lista de procedimentos armazenados que levam muito tempo para serem executados, um se destaca como o que causa mais espera. No entanto, a maior parte dessa espera (81%) é ASYNC_NETWORK_IO e eu sei o porquê: o procedimento armazenado transfere aproximadamente 400 MB de informações.
Na documentação, afirma-se que a causa de ASYNC_NETWORK_IO é que o cliente não consegue acompanhar o fluxo de dados e isso provavelmente é verdade. Não tenho certeza de como fazer o cliente acompanhar, pois tudo o que ele faz é chamar o procedimento armazenado por meio de um ADO.NET e apenas processar o conjunto de dados.
Portanto, com essas informações, devo me preocupar com o tipo de espera ASYNC_NETWORK_IO para esse procedimento? Isso realmente afeta o desempenho do servidor?
Informações adicionais:
- Estou no service pack 2 do SQL Server 2005.
- O aplicativo cliente está na mesma caixa do SQL Server (eu sei, eu sei ... mas não posso fazer nada a respeito).
Pelo que posso dizer, a taxa de ocorrência do cache do procedimento abaixo de 95% é um problema. Na minha caixa, os valores variam de 85 a 95%.
Como faço para corrigir esse problema? O servidor parece ter bastante RAM, então isso não deve ser um problema. O que mais pode ser?
Eu inicio o seguinte comando em meu aplicativo:
WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM MyQueue)
Quando executo `sp_who2 active', obtenho Status=SUSPENDED e Command=DELETE
Observação: movido do StackOverflow.
Na última versão do meu aplicativo, adicionei um comando que diz para esperar quando algo chegar na fila do Service Broker:
WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM MyQueue)
Os DBAs me disseram que, desde a adição, os tamanhos de toras dispararam. Isso pode estar correto? Ou devo procurar em outro lugar?
Eu tenho uma situação em que vários aplicativos cliente enviam mensagens por meio do Service Broker (utilizando procedimentos armazenados). Essas mensagens são captadas por outro aplicativo cliente e processadas. A forma como as mensagens são captadas é que o aplicativo emite a seguinte instrução SQL (pseudocódigo):
LOOP {
WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM SB_ReceiveQ)
ProcessMessage
}
Então, basicamente, o código é bloqueado até que uma mensagem seja recebida. Isso tudo funciona bem.
Minha pergunta é sobre a implicação de emitir um WAITFOR (RECEIVE...
comando que paira sobre algum recurso baseado no corretor de serviços basicamente para sempre. Há algum problema de desempenho associado a esse padrão que eu deva saber?
Para referência, este é o SQL Server 2005.
Com o SQL Server 2005, você pode examinar o Gerenciador de Tarefas e, pelo menos, dar uma olhada superficial na quantidade de memória alocada para o SQL Server.
Com o SQL Server 2008, o conjunto de trabalho ou tamanho de confirmação nunca ultrapassa 500 MB, mesmo que o contador de desempenho SQLServer:Memory Manager/Total Server Memory (KB) indique 16.732.760.
Existe uma configuração em que ele realmente mostrará a memória do servidor no Gerenciador de Tarefas? Ou é o resultado deles mudando como a memória é usada no SQL Server
Eu tenho tabela Inventory_Break
particionada em IR_ID
(int). Também criei um índice não clusterizado para IR_ID
on the table.
Quando eu executo o seguinte:
SELECT *
FROM dbo.INVENTORY_BREAK
WHERE IR_ID IN ( 100, 101, 102 )
Eu recebo o seguinte plano de execução:
Indica Table Scan (HEAP). Não tenho certeza do que significa no contexto de uma tabela particionada. Eu também não vejo que ele usa qualquer tipo de índice. E, no entanto, deve, porque a consulta volta bastante rápido (por exemplo, a tabela tem 6 milhões de linhas).
Então, minhas perguntas são:
- O que significa Table Scan (HEAP) para uma tabela particionada?
- Ele realmente usa um índice, talvez nos bastidores?
- Existe alguma coisa que eu preciso fazer para melhorar a eficiência?
Estou particionando uma tabela com base em uma coluna que não é uma chave primária? Eu li algumas informações conflitantes hoje sobre se a coluna de partição deve fazer parte da chave primária. Meu instinto diz que não, mas não tenho 100% de certeza. Então perguntas...
- A coluna de partição deve fazer parte do primário? É recomendado de uma forma ou de outra?
- Devo criar um índice para a chave de partição ou o DBMS faz isso automaticamente por conta própria?
Imagine a seguinte estrutura hipotética de banco de dados. Basicamente é uma estrutura de cima para baixo (Country tem Orders, Order tem OrderLines, OrderLine tem ShipLines, etc...).
Desejo particionar meu banco de dados SQL Server 2008 por CountryID. Como você pode ver, CountryID está apenas nas 2 primeiras tabelas (por exemplo, amCountries e amOrders). Dado que (pelo que entendi) esse particionamento é feito no nível da tabela, preciso adicionar CountryID às tabelas restantes para poder particioná-las? Ou existe algum tipo de cascata disponível no SQL Server que me permitirá pular a adição de CountryID a tudo?
No momento, tenho uma caixa SQL 2005 Standard. Gostaria de atualizá-lo para o SQL 2012 Enterprise in-loco. Quando digo no local, quero dizer uma instalação semelhante ao Office 2010, por exemplo, remove a versão mais antiga (Office 2007), vincula-se a extensões que já foram mantidas por seu antecessor e mantém todas as configurações também.
Isso é possível?
Se não, qual deve ser o procedimento? Até agora, eu tenho isso.
- Faça backup dos bancos de dados
- Anote todas as configurações.
- Desinstale o SQL 2005.
- Instale o SQL 2012 Enterprise.
- Restaurar configurações
- Restaure os bancos de dados.
Desejo mover todos os índices para um disco rígido separado. Para esse efeito, criei um novo grupo de arquivos e adicionei um novo arquivo a ele (por exemplo, alter database foo add file(...) to FileGroup
).
Agora quero mover todos os índices para este novo grupo de arquivos. Acontece que não posso usar ALTER INDEX
para mover um índice entre grupos de arquivos. E também não posso mover os índices PK ou Unique, para não querer mover a própria tabela (o que não faço), então eles estão fora. Então, pelo menos, gostaria de mover o restante dos índices.
Estou lutando para encontrar um método para mover todos os índices elegíveis de um grupo de arquivos para outro. Existe uma maneira automatizada razoável de fazer isso?
Eu tenho um banco de dados transacional bastante grande (100 GB) com muitos usuários. O acesso ao banco de dados é exclusivamente por meio de procedimentos armazenados que fazem uso intenso de tabelas temporárias, variáveis de tabela, cursores e outras coisas divertidas.
Estou testando em uma nova caixa em um esforço para aumentar o desempenho. A nova caixa tem 5 discos rígidos físicos separados. Estou lutando para encontrar uma configuração ideal (principalmente por ignorância, sou ac # dev normalmente). Até agora, consegui o seguinte:
Drive C: OS, SQL install, TempDB log
Drive D: Database data
Drive E: Database log
Drive F: TempDB data
Drive G: Databases indexes
Estou indo pelo caminho certo? Algum erro gritante?