[Video] Assista às consultas de gravação de Brent

[Video] Assista às consultas de gravação de Brent

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br


Esta manhã, eu queria escrever algumas novas consultas de “ruído de fundo” para minhas aulas de Mastering. Nessas aulas, os alunos executam cargas de trabalho ao vivo no banco de dados Stack Overflow e solucionam problemas de desempenho, e quanto mais uma carga de trabalho variada eu estiver executando, mais realista ela parecerá. Para esta sessão, eu especificamente queria escrever rápido consultas – consultas que produziriam dados de estilo do mundo real em alguns segundos, no estilo que um usuário realmente os escreveria.

Eu transmiti a coisa toda ao vivo no Twitch, e você pode assistir.

Assista às consultas OLTP do Brent Design com dados de estouro de pilha do BrentOzar em www.twitch.tv

Se você quiser pular para diferentes partes do vídeo, aqui estão os pontos principais em que iniciei novas consultas:

  • 7min: 33sec in: apresento o tópico do que estou tentando fazer. A primeira consulta busca as tags nas quais o usuário trabalha com mais frequência e mostra suas pontuações. Por acaso, encontrei Gordon Linoff, um atendente prolífico.
  • 26m: 08s: deixo que me digam quais consultas você deseja que eu escreva e depois começo a trabalhar para encontrar as principais tags em um período.
  • 34m: 54sec: explico por que amo COALESCE e como um amigo meu acabou colocando uma pílula de enjoo na bunda.
  • 42m: 30seg: codifico um cabeçalho das principais perguntas com mais respostas.
  • 1h: 04m: Recebo uma ótima pergunta sobre detecção de parâmetros nas instruções de atualização, por isso codifico uma demonstração mostrando ao vivo.
  • 1h: 41m: encontro as respostas mais recentes das 10 pessoas mais ativas e explico por que você precisa usar datas codificadas em vez de GETDATE () ao trabalhar com exportações mais antigas do Stack Overflow.
  • 1h: 57m: escrevo uma consulta para encontrar tempos médios de resposta para um determinado período e tag e construí-la no topo de uma exibição para simular o que os usuários fariam e, em seguida, escrevo outro proc no topo dessa exibição para encontrar as respostas mais rápidas em uma data alcance.
Leia Também  Usando a transformação de junção de mesclagem em pacotes SSIS

Gostou desta sessão? Siga-me no Twitch, YouTube, Facebook ou Mixer para ser alertado sempre que eu estiver transmitindo.

Aqui estão os scripts da demonstração:

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br
CREATE OR ALTER PROC dbo.usp_GetTagsForUser @UserId INT AS
BEGIN
	SELECT TOP 10 COALESCE(p.Tags, pQ.Tags) AS Tag,
		SUM(p.Score) AS TotalScore,
		COUNT(*) AS TotalPosts
	  FROM dbo.Users u
	  INNER JOIN dbo.Posts p ON u.Id = p.OwnerUserId
	  LEFT OUTER JOIN dbo.Posts pQ ON p.ParentId = pQ.Id
	  WHERE u.Id = @UserId
	  GROUP BY COALESCE(p.Tags, pQ.Tags)
	  ORDER BY SUM(p.Score) DESC;
END
GO

/* 
Mehow - top tags
AbusedSysadmin question w/most answers
DavidHooey - how many of my questions have been answered
DamnTank - last 10 posts by the top 10 posters
Bilbo - average answer response time
Gdonufrio - fastest answer
*/

CREATE OR ALTER PROC dbo.usp_RptTopTags 
	@StartDate DATETIME, @EndDate DATETIME, @SortOrder NVARCHAR(20)= 'Quantity' AS
BEGIN
/* Changelog:
	2020/05/28 Mehow - I needed a quick report for the sales team.
*/
SELECT TOP 250 pQ.Tags, COUNT(*) AS TotalPosts,
	SUM(pQ.Score + COALESCE(pA.Score, 0)) AS TotalScore,
	SUM(pQ.ViewCount) AS TotalViewCount
  FROM dbo.Posts pQ
  LEFT OUTER JOIN dbo.Posts pA ON pQ.Id = pA.ParentId /* Answers join up to questions on this */
  WHERE pQ.CreationDate >= @StartDate
    AND pQ.CreationDate < @EndDate
	AND pQ.PostTypeId = 1
  GROUP BY pQ.Tags
  ORDER BY CASE WHEN @SortOrder = 'Quantity' THEN COUNT(*)
				WHEN @SortOrder = 'Score' THEN SUM(pQ.Score + pA.Score)
				WHEN @SortOrder = 'ViewCount' THEN SUM(pQ.ViewCount)
				ELSE COUNT(*)
			END DESC;
END
GO

EXEC usp_RptTopTags @StartDate = '2010-11-10', @EndDate = '2010-11-11';
GO

CREATE OR ALTER PROC dbo.usp_RptPostLeaderboard 
	@StartDate DATETIME, @EndDate DATETIME, @PostTypeName VARCHAR(50)  AS
BEGIN
/* Changelog:
	2020/05/29 Jonathan9375 - make it work for multiple PostTypes
	2020/05/28 AbusedSysadmin - New social media project to display viral questions.
*/
SELECT TOP 250 *
  FROM dbo.PostTypes pt 
  INNER JOIN dbo.Posts p ON pt.Id = p.PostTypeId
  WHERE p.CreationDate >= @StartDate
    AND p.CreationDate < @EndDate
	AND pt.Type = @PostTypeName
  ORDER BY AnswerCount DESC;
END
GO

EXEC usp_RptPostLeaderboard @StartDate = '2010/05/01', @EndDate = '2010/05/02', @PostTypeName = 'Question'
GO

CREATE OR ALTER PROC dbo.usp_RptQuestionsAnsweredForUser @UserId INT AS
BEGIN
/* Changelog:
	2020/05/29 David Hooey - PM also wants to show a percentage
	2020/05/28 David Hooey - Product manager wants to show each user's number of questions
*/
WITH MyQuestions AS (
	SELECT pQ.Id AS QuestionId, pQ.AnswerCount
	  FROM dbo.Users u
	  INNER JOIN dbo.Posts pQ ON u.Id = pQ.OwnerUserId /* My questions */
	  INNER JOIN dbo.PostTypes pt ON pQ.PostTypeId = pt.Id AND pt.Type = 'Question'
	  WHERE u.Id = @UserId
),
MyAggregates AS (
SELECT COUNT(*) AS MyQuestions,
	SUM(CASE WHEN AnswerCount > 0 THEN 1 ELSE 0 END) AS Answered
	FROM MyQuestions
)
SELECT MyQuestions, Answered, 100.0 * Answered / MyQuestions AS AnsweredPercent
  FROM MyAggregates
END
GO
EXEC usp_RptQuestionsAnsweredForUser @UserId = 26837;
EXEC usp_RptQuestionsAnsweredForUser @UserId = 9527192;
GO


CREATE OR ALTER PROC dbo.usp_DashboardFromTopUsers @AsOf DATETIME = '2018-06-03' AS
BEGIN
/* Changelog:
	2020/05/28 DamnTank - last 10 posts by the top 10 posters
*/
CREATE TABLE #RecentlyActiveUsers (Id INT, DisplayName NVARCHAR(40), Location NVARCHAR(100));

INSERT INTO #RecentlyActiveUsers
SELECT TOP 10 u.Id, u.DisplayName, u.Location
  FROM dbo.Users u
  WHERE EXISTS (SELECT * 
					FROM dbo.Posts 
					WHERE OwnerUserId = u.Id
					  AND CreationDate >= DATEADD(DAY, -7, @AsOf))
  ORDER BY u.Reputation DESC;

SELECT TOP 100 u.DisplayName, u.Location, pAnswer.Body, pAnswer.Score, pAnswer.CreationDate
	FROM #RecentlyActiveUsers u
	INNER JOIN dbo.Posts pAnswer ON u.Id = pAnswer.OwnerUserId
	WHERE pAnswer.CreationDate >= DATEADD(DAY, -7, @AsOf) 
	ORDER BY pAnswer.CreationDate DESC;

END
GO

EXEC usp_DashboardFromTopUsers
GO


CREATE OR ALTER VIEW dbo.AverageAnswerResponseTime AS
SELECT pQ.Id, pQ.Tags, pQ.CreationDate AS QuestionDate, 
	DATEDIFF(SECOND, pQ.CreationDate, pA.CreationDate) AS ResponseTimeSeconds
FROM dbo.Posts pQ
INNER JOIN dbo.Posts pA ON pQ.AcceptedAnswerId = pA.Id
WHERE pQ.PostTypeId = 1;
GO



CREATE OR ALTER PROC dbo.usp_RptAvgAnswerTimeByTag
	@StartDate DATETIME, @EndDate DATETIME, @Tag NVARCHAR(50) AS
BEGIN
/* Changelog:
	2020/05/29 James Randell - fixing bugs left over from Bilbo
	2020/05/28 Bilbo Baggins - find out when fast answers are coming in
*/

SELECT TOP 100 YEAR(QuestionDate) AS QuestionYear,
	MONTH(QuestionDate) AS QuestionMonth,
	AVG(ResponseTimeSeconds * 1.0) AS AverageResponseTimeSeconds
	FROM dbo.AverageAnswerResponseTime r
	WHERE r.QuestionDate >= @StartDate
	  AND r.QuestionDate < @EndDate
	  AND r.Tags = @Tag
	GROUP BY YEAR(QuestionDate), MONTH(QuestionDate)
	ORDER BY YEAR(QuestionDate), MONTH(QuestionDate);

END
GO

EXEC usp_RptAvgAnswerTimeByTag @StartDate = '2013-01-01', @EndDate = '2013-01-08', @Tag = ''
GO


CREATE OR ALTER PROC dbo.usp_RptFastestAnswers
	@StartDate DATETIME, @EndDate DATETIME, @Tag NVARCHAR(50) AS
BEGIN
/* Changelog:
	2020/05/28 Gabriele D'Onufrio - looking for the fastest answer fingers in the West, possibly fraud
*/
SELECT TOP 10 r.ResponseTimeSeconds, pQuestion.Title, pQuestion.CreationDate, pQuestion.Body,
	uQuestion.DisplayName AS Questioner_DisplayName, uQuestion.Reputation AS Questioner_Reputation,
	pAnswer.Body AS Answer_Body, pAnswer.Score AS Answer_Score,
	uAnswer.DisplayName AS Answerer_DisplayName, uAnswer.Reputation AS Answerer_Reputation
	FROM dbo.AverageAnswerResponseTime r
	INNER JOIN dbo.Posts pQuestion ON r.Id = pQuestion.Id
	INNER JOIN dbo.Users uQuestion ON pQuestion.OwnerUserId = uQuestion.Id
	INNER JOIN dbo.Posts pAnswer ON pQuestion.AcceptedAnswerId = pAnswer.Id
	INNER JOIN dbo.Users uAnswer ON pAnswer.OwnerUserId = uAnswer.Id
	WHERE r.QuestionDate >= @StartDate
	  AND r.QuestionDate < @EndDate
	  AND r.Tags = @Tag
	ORDER BY r.ResponseTimeSeconds ASC;
END
GO
EXEC usp_RptFastestAnswers @StartDate = '2013-01-01', 
@EndDate = '2014-01-08', @Tag = ''
GO

/*
License: Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
More info: https://creativecommons.org/licenses/by-sa/4.0/

You are free to:
* Share - copy and redistribute the material in any medium or format
* Adapt - remix, transform, and build upon the material for any purpose, even 
  commercially

Under the following terms:
* Attribution - You must give appropriate credit, provide a link to the license, 
  and indicate if changes were made. You may do so in any reasonable manner, 
  but not in any way that suggests the licensor endorses you or your use.
* ShareAlike - If you remix, transform, or build upon the material, you must
  distribute your contributions under the same license as the original.
*/

Patrocinador da semana: minhas novas aulas de Fundamentos de detecção de parâmetros e masterização de detecção de parâmetros estão abertas para inscrição. Se você possui um Season Pass do Live Class, veja como participar.

*As fotos exibidas neste post pertencem ao post www.brentozar.com

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br