O script abaixo consultará a tabela de resultados da solução de manutenção da Ola (CommandLog) e apresentará uma comparação da duração bi-semanal do exec de reindexação, nas últimas 4 semanas.
Do jeito que está agora, é um truque rápido para me ajudar a ajustar as janelas de manutenção. Mas eu gostaria de remover a codificação de data, para que eu não precise adicionar manualmente todo fim de semana futuro como um novo JOIN.
Por favor, forneça uma reescrita completa (SQL dinâmico?) ou apenas algumas dicas sobre como conseguir isso ou alguns outros recursos úteis a serem incluídos. Ok para alterar o sproc e adicionar saída extra à tabela. Usando o SQL 2016. Se já houver um script por aí que atenda ao propósito, será um prazer usar esse.
WITH t0 AS
(
SELECT ObjectName, IndexName, IndexType
FROM Tools.dbo.CommandLog
WHERE 1=1
AND DatabaseName = 'testdb'
AND CommandType = 'ALTER_INDEX'
GROUP BY ObjectName, IndexName, IndexType
)
SELECT
t0.ObjectName
,t0.IndexName
,t0.IndexType
,DATEDIFF(ss,t1.StartTime,t1.EndTime) as '20-40 01-06'
,DATEDIFF(ss,t2.StartTime,t2.EndTime) as '5-40 01-07'
,DATEDIFF(ss,t3.StartTime,t3.EndTime) as '20-40 01-13'
,DATEDIFF(ss,t4.StartTime,t4.EndTime) as '5-40 01-14'
,DATEDIFF(ss,t5.StartTime,t5.EndTime) as '20-40 01-20'
,DATEDIFF(ss,t6.StartTime,t6.EndTime) as '5-40 01-21'
,DATEDIFF(ss,t7.StartTime,t7.EndTime) as '20-40 01-27'
,DATEDIFF(ss,t8.StartTime,t8.EndTime) as '5-40 01-28'
FROM t0
LEFT JOIN Tools.dbo.CommandLog as t1 ON t0.ObjectName = t1.ObjectName AND t0.IndexName = t1.IndexName AND t1.StartTime BETWEEN '2018-01-06 00:30:00' AND '2018-01-06 23:59:59'
LEFT JOIN Tools.dbo.CommandLog as t2 ON t0.ObjectName = t2.ObjectName AND t0.IndexName = t2.IndexName AND t2.StartTime BETWEEN '2018-01-07 00:30:00' AND '2018-01-07 23:59:59'
LEFT JOIN Tools.dbo.CommandLog as t3 ON t0.ObjectName = t3.ObjectName AND t0.IndexName = t3.IndexName AND t3.StartTime BETWEEN '2018-01-13 00:30:00' AND '2018-01-13 23:59:59'
LEFT JOIN Tools.dbo.CommandLog as t4 ON t0.ObjectName = t4.ObjectName AND t0.IndexName = t4.IndexName AND t4.StartTime BETWEEN '2018-01-14 00:30:00' AND '2018-01-14 23:59:59'
LEFT JOIN Tools.dbo.CommandLog as t5 ON t0.ObjectName = t5.ObjectName AND t0.IndexName = t5.IndexName AND t5.StartTime BETWEEN '2018-01-20 00:30:00' AND '2018-01-20 23:59:59'
LEFT JOIN Tools.dbo.CommandLog as t6 ON t0.ObjectName = t6.ObjectName AND t0.IndexName = t6.IndexName AND t6.StartTime BETWEEN '2018-01-21 00:30:00' AND '2018-01-21 23:59:59'
LEFT JOIN Tools.dbo.CommandLog as t7 ON t0.ObjectName = t7.ObjectName AND t0.IndexName = t7.IndexName AND t7.StartTime BETWEEN '2018-01-27 00:30:00' AND '2018-01-27 23:59:59'
LEFT JOIN Tools.dbo.CommandLog as t8 ON t0.ObjectName = t8.ObjectName AND t0.IndexName = t8.IndexName AND t8.StartTime BETWEEN '2018-01-28 00:30:00' AND '2018-01-28 23:59:59'
WHERE 1=1
ORDER BY
t0.ObjectName
,t0.IndexName
,t0.IndexType
Tabela de calendário
Como LowlyDBA e Anti-weakpasswords apontaram em seus comentários, você pode encontrar mais de um método para gerar uma tabela de calendário:
Por causa da pergunta vou gerar uma tabela de calendário (básica) apenas para mostrar como usá-la com seus dados, você encontrará exemplos on-line que usam campos mais detalhados (segundos, dia do ano, trimestres, etc)
De acordo com sua consulta, parece que você está interessado em obter resultados apenas para sábado e domingo. Nesse caso, você deve filtrar
Calendar
a tabela porday name
ou porday of week
. Dê uma olhada em SET DATEFIRST se você quiser filtrar porday of week
.Preenchendo a tabela CommandLog com dados aleatórios
Agora deixe-me simular uma tabela CommandLog e preenchê-la com 1.000 datas aleatórias entre Jan-01 e Jan-31.
Formatando dados
Ok, até aí tudo bem, eu escolhi uma solução PIVOT neste caso, mas primeiro preciso formatar os dados de origem para que isso seja possível. Os registros podem ser filtrados ou agrupados usando a
Calendar
tabela.Consulta PIVOT
Bem, esta é a consulta PIVOT que estou tentando simular. Lembre-se de que as consultas PIVOT exigem um número bem conhecido de colunas e geralmente você deve gerá-lo dinamicamente.
Gerando consulta dinâmica
Você pode usar a função STUFF para gerar nomes de colunas dinamicamente. E então simplesmente concatene as strings.
Resultado final
Agrupar por solução
Ok, é sábado à tarde e não tenho mais nada para fazer do que ler um livro interessante. Dando uma olhada em sua consulta, acho que você poderia substituir todas essas junções de tabela por uma única consulta GROUP BY + SUM(CASE...
Calendar
tabela.Semelhante a este:
Esta consulta também pode ser gerada dinamicamente:
dbfiddle aqui