【发布时间】:2020-06-07 21:16:24
【问题描述】:
我有一个名为“GameTransactions”的表。表在性能方面运行良好至关重要(当站点将要运行时,表将有数百万条记录)。我想索引它。我用于列的列是:
UserID [int],
TransactionID [nvarchar(50)]
ProviderID [int]
TransactionTimeStamp [datetime]
关于我如何使用表格的一些背景信息。
在 SQL 操作开始时,我检查同一用户的事务 ID 是否存在。
SELECT COUNT(1)
FROM GameTransactions WITH(NOLOCK)
WHERE
UserID=@UserID AND
TransactionID=@TransactionID
AND ProviderID=@ProviderID
AND TransactionTimeStamp>DATEADD(MONTH,-1,GETUTCDATE())
如果数据库中不存在该请求,我将其插入。
我选择使用以下索引
CREATE CLUSTERED INDEX IX_GameTransactions_UserID_TransactionID_ProviderID_TransactionTimeStamp
ON dbo.GameTransactions (UserID,TransactionID,ProviderID,TransactionTimeStamp);
我在这篇文章中读到:
https://sqlstudies.com/2014/12/01/using-a-date-or-int-column-as-the-clustered-index/
将 datetime 作为聚集索引中的一列可以获得良好的性能。我不关心聚集索引要占用的磁盘空间,我更关心速度性能。
我也想过另一种解决方案,
CREATE NONCLUSTERED INDEX IX_GameTransactions_UserID_TransactionID_ProviderID_TransactionTimeStamp
ON dbo.GameTransactions (UserID, Month, Year,ProviderID)
INCLUDE (TransactionID);
我可以添加 2 个额外的列 - 月和年。并使用整数而不是日期。请记住,“TransactionID”字段必须是 nvarchar(50)。没有办法解决它。
我有一个额外的 Id 列,它是自动递增的。这样的解决方案行得通吗?
CONSTRAINT PK_GameTransactions PRIMARY KEY CLUSTERED (
UserID
, TransactionID
, ProviderID
, TransactionTimeStamp
, Id
)
【问题讨论】:
-
所有这些非聚集索引会给我什么?除了更多的扫描时间和存储空间?!
标签: sql sql-server