Tag Archives: 2005

T-SQL Tuesday #18 – CTEs

Bom,,, para este mês o Sr. Bob Pusateri (twitter | Blog) escolheu o tópico Common Table Expressions (CTE).

Você não sabe o que é? Não faz ideia? Isso é mais comum do que você imagina,,, vejo muitos códigos por ai onde o pessoal de dev poderia utilizar este recurso, mas como ainda estão presos em conceitos antigos do SQL 2000 ou as vezes até mais velhos não fazem ideia de alguns novos recursos interessantes…

Para uma leitura interessante sobre este assunto acesse:

Você vai achar muita coisa voltada pra dev… mas,,, como sou mais um cada de infra,,, achei interessante este código no Site do Sr. Paul Randal (twitter | Blog) sobre wait statistics usando a sys.dm_os_wait_stats, nada muito complexo.

 1: WITH Waits AS
 2:     (SELECT
 3:         wait_type,
 4:         wait_time_ms / 1000.0 AS WaitS,
 5:         (wait_time_ms - signal_wait_time_ms) / 1000.0 AS ResourceS,
 6:         signal_wait_time_ms / 1000.0 AS SignalS,
 7:         waiting_tasks_count AS WaitCount,
 8:         100.0 * wait_time_ms / SUM (wait_time_ms) OVER() AS Percentage,
 9:         ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS RowNum
 10:     FROM sys.dm_os_wait_stats
 11:     WHERE wait_type NOT IN (
 12:         'CLR_SEMAPHORE', 'LAZYWRITER_SLEEP', 'RESOURCE_QUEUE', 'SLEEP_TASK',
 13:         'SLEEP_SYSTEMTASK', 'SQLTRACE_BUFFER_FLUSH', 'WAITFOR', 'LOGMGR_QUEUE',
 14:         'CHECKPOINT_QUEUE', 'REQUEST_FOR_DEADLOCK_SEARCH', 'XE_TIMER_EVENT', 'BROKER_TO_FLUSH',
 15:         'BROKER_TASK_STOP', 'CLR_MANUAL_EVENT', 'CLR_AUTO_EVENT', 'DISPATCHER_QUEUE_SEMAPHORE',
 16:         'FT_IFTS_SCHEDULER_IDLE_WAIT', 'XE_DISPATCHER_WAIT', 'XE_DISPATCHER_JOIN', 'BROKER_EVENTHANDLER',
 17:         'TRACEWRITE', 'FT_IFTSHC_MUTEX', 'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',
 18:         'BROKER_RECEIVE_WAITFOR', 'ONDEMAND_TASK_QUEUE', 'DBMIRROR_EVENTS_QUEUE',
 19:         'DBMIRRORING_CMD', 'BROKER_TRANSMITTER', 'SQLTRACE_WAIT_ENTRIES',
 20:         'SLEEP_BPOOL_FLUSH', 'SQLTRACE_LOCK')
 21:     )
 22: SELECT
 23:     W1.wait_type AS WaitType,
 24:     CAST (W1.WaitS AS DECIMAL(14, 2)) AS Wait_S,
 25:     CAST (W1.ResourceS AS DECIMAL(14, 2)) AS Resource_S,
 26:     CAST (W1.SignalS AS DECIMAL(14, 2)) AS Signal_S,
 27:     W1.WaitCount AS WaitCount,
 28:     CAST (W1.Percentage AS DECIMAL(4, 2)) AS Percentage,
 29:     CAST ((W1.WaitS / W1.WaitCount) AS DECIMAL (14, 4)) AS AvgWait_S,
 30:     CAST ((W1.ResourceS / W1.WaitCount) AS DECIMAL (14, 4)) AS AvgRes_S,
 31:     CAST ((W1.SignalS / W1.WaitCount) AS DECIMAL (14, 4)) AS AvgSig_S
 32: FROM Waits AS W1
 33:     INNER JOIN Waits AS W2 ON W2.RowNum <= W1.RowNum
 34: GROUP BY W1.RowNum, W1.wait_type, W1.WaitS, W1.ResourceS, W1.SignalS, W1.WaitCount, W1.Percentage
 35: HAVING SUM (W2.Percentage) - W1.Percentage < 95;
 36: GO

T-SQL Tuesday #17–Apply

O tópico deste mês para o T-SQL Tuesday é o operador apply,,,

Caso você não faça ideia de pra que serve o apply leia aqui.

Para este post vou coloca um script simples usando o apply.

Ele não faz nada muito importante, apenas mostra as 20 querys que mais gerão stress de disco:

SELECT TOP 20 SUBSTRING(qt.text, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset
END – qs.statement_start_offset)/2)+1),
qs.execution_count,
qs.total_logical_reads, qs.last_logical_reads,
qs.min_logical_reads, qs.max_logical_reads,
qs.total_elapsed_time, qs.last_elapsed_time,
qs.min_elapsed_time, qs.max_elapsed_time,
qs.last_execution_time,
qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
WHERE qt.encrypted=0
ORDER BY qs.total_logical_reads DESC

Sou alguém importante no SQL?

Algumas vezes acontece de você prestar serviço para alguma empresa/usuário/amigo e o pessoal cria um usuário para acesso ao ambiente SQL, como em muitos casos não precisamos de acesso direto no servidor podemos usar o SSMS/Enterprise Manager ou qualquer outra ferramenta que esteja disponível. Apenas precisamos saber qual o nível de acesso do nosso usuário…

Continue reading Sou alguém importante no SQL?

Quanto tempo vai demorar para…

Você já passou por aquela situação de ter que fazer um backup de uma base que não é pequena e não ter ideia de quanto tempo vai demorar? Você fica olhando aquela circulo maldito do SSMS rodando e rodando e nada, quando ele mostra alguma coisa é de 10% em 10%,,, Ou quando executa um script ele também fica nos 10% em 10%,,,

Isso é muito chato,,,

Continue reading Quanto tempo vai demorar para…

Alguns comandos DBCC (não documentos)

ATENÇÃO: apenas para constar que NÃO me responsabilizo se você testar isso em seu ambiente e apresentar problemas

Vamos pelo básico,,,

Para listar os comandos DBCC: DBCC HELP(‘?’)

Para uma ajuda mais específica sobre um comando: DBCC HELP(‘SQLPERF’)

Bom,,, agora vem a parte divertida,,,

Para exibir os não documentados você precisa habilitar um TRACEON: DBCC TRACEON(2588) — O 2588 é para 2005 e 2008, para 7 e 2000 é 2520

Depois de habilitar o traceon execute um: DBCC HELP(‘?’) WITH NO_INFOMSGS

Agora vem um esquema camarada legal,,, Continue reading Alguns comandos DBCC (não documentos)

Qual tipo de driver de conexão está sendo usado?

Recentemente um cliente me pediu ajuda para identificar um problema bem interessante.

O time de desenvolvimento dele havia instalado uma aplicação ERP em 4 servidores, desses 4 servidores apenas 1 estava apresentando lentidão e as vezes erro enquanto executava qualquer tipo de acesso ao servidor SQL. Ele comentou que já havia pedido ao time de SO reinstalar o Windows mas, mesmo depois de reinstalar não fez nenhuma diferença.

Como teste simples, criei um arquivo de 1GB vazio usando o FSUTIL:

fsutil file createnew c:\teste.txt 1073741824

Copiamos esse arquivo para os 4 servidores, em tempos diferentes e ao mesmo tempo, nos testes não notamos diferenças de tempo entre as cópias.

Continue reading Qual tipo de driver de conexão está sendo usado?

Localizando tabelas não usadas

Este script irá retornar uma lista de tabelas do banco que, desde o último restart do SQL, não tiveram um SELECT executado contra elas. Isto pode ser usado para determinar se a tabela é usada ou não.
ATENÇÃO: As estatísticas do SQL são apagadas toda a vez que o serviço do SQL é reiniciado. Então, não é porque o script esta informando que a tabela não teve uso que ela não é importante, ela apenas não teve uso desde o último restart. Então não saia apagando tabelas ao seu bel prazer, vai que uma delas é usada pelo sistema fiscal apenas a vez por mês e você reinicia o SQL a cada Windows Update, você sempre vai ver essa tabela com esse script.

WITH LastActivity (ObjectID, LastAction) AS
(
SELECT object_id AS TableName,
             last_user_seek as LastAction
     FROM sys.dm_db_index_usage_stats u
WHERE database_id = db_id(db_name())
UNION
SELECT object_id AS TableName,
             last_user_scan as LastAction Continue reading Localizando tabelas não usadas

Alterando o Collation do servidor

Todo mundo já percebeu que quando você está instalando o SQL Server, em algum ponto da instalação você tem que escolher qual o collation que será usado para aquela instância,,, Até ai sem problemas,,,

Mas depois você percebe que alguém do time de DEV te manda um print screen com alguma mensagem de erro do tipo:

Cannot resolve collation conflict for equal operation

Ai essa mesma pessoa lhe informa que quando aponta a aplicação X para o banco de DEV e faz a mesma coisa não tem erro. Você acessa a instância Continue reading Alterando o Collation do servidor