我正在寻找我们在应用程序中使用的存储过程的一些注释。它被称为很多,我认为还有改进的空间。我还希望看看是否向Team和Opp添加索引将有助于SP。存储过程/表索引改进
我们正在Azure数据库上运行此操作。
该表的架构如下:
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]);
该表格将获得百万行。目前它在12万左右。
我为每个团队添加了2条记录到TeamHistoryMatchUps中,结果为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中)将是更好的方法。
这个问题确实属于采用https: //codereview.stackexchange。com/ – Jens
道歉应该删除和报告? – userStack