我正在寻找有关我们在应用程序中使用的存储过程的一些评论。它被称为很多,我认为还有改进的余地。我也在寻找向团队和 Opp 添加索引是否会对 SP 有所帮助。
我们在 Azure DB 上运行它。
该表的架构如下:
CREATE TABLE [dbo].[TeamHistoryMatchUps] (
[Id] UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL,
[Team] NVARCHAR (100) NOT NULL,
[Opp] NVARCHAR (100) NOT NULL,
[Result] INT NOT NULL,
[MatchResultTime] DATETIME2 (7) DEFAULT (getdate()) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
这是 SP:
CREATE PROCEDURE [dbo].[up_GetTeamPercentagev2]
@Team NVARCHAR(100),
@Opp NVARCHAR(100)
AS
begin
set nocount ON
declare
@TotalResult INT,
@TeamResult INT
--Total Matchups
Set @TotalResult = (SELECT count(*) FROM TeamHistoryMatchUps
WHERE (Team = @Team OR Opp = @Team) AND (Team = @Opp OR Opp = @Opp)
AND Result = 1)
Set @TeamResult = (SELECT COUNT(*) FROM TeamHistoryMatchUps
WHERE Team = @Team and Opp = @Opp
AND Result = 1)
SELECT (@TeamResult * 100 / @TotalResult) AS Percentage
exit_proc:
end
我应该提到,我担心插入,因为就在调用这个 sp 之前,将插入插入到表中,然后调用以获得随着时间的推移在这场比赛中的获胜百分比。
在使用了几次显示执行计划后,我确实添加了两个非聚集索引。
GO
CREATE NONCLUSTERED INDEX [[IX_MatchUps]
ON [dbo].[TeamHistoryMatchUps]([Result] ASC)
INCLUDE([Team], [Opp]);
GO
CREATE NONCLUSTERED INDEX [IX_MatchupsTeamOpp]
ON [dbo].[TeamHistoryMatchUps]([Team] ASC, [Opp] ASC)
INCLUDE([Result], [MatchResultTime], [MatchUpId]);
该表将进入百万行。目前在120k左右。
我在每个团队的 TeamHistoryMatchUps 中添加了 2 条记录,结果为 0 或 1。我试图保持它非常简单,以便可以进行上述查询。
CREATE PROCEDURE [dbo].[up_GetTeamPercentage]
@Team NVARCHAR(100),
@Opp NVARCHAR(100)
AS
SELECT
SUM(SIGN(result)) * 100 / COUNT(*)
AS Percentage
FROM TeamHistoryMatchUps
WHERE Team = @Team AND Opp = @Opp
但是认为更少的写入和更复杂的读取(在 SP 中)会是更好的方法。