我正在尋找我們在應用程序中使用的存儲過程的一些註釋。它被稱爲很多,我認爲還有改進的空間。我還希望看看是否向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