性能优化 - 在MS SQL 2008上获得BigInt的Max()添加索引



与MS SQL Server 2008一起工作。我有一个没有索引的堆表,并且数据量很大。我需要获得bigint的max((值。什么会占用最少的交易日志/磁盘空间,但让我不必进行表扫描而获得结果?

触发。

如果这是一个仅插入表,则可以在插入触发器上创建一个在另一个表中更新一个存储最大int的值的值。

CREATE TRIGGER MaxValue ON Sales.Customer
AFTER INSERT
AS 
DECLARE @NewMax BIGINT;
SELECT @NewMax = Max(ImportantColumn) FROM Inserted;
UPDATE Sales.CustomerMax SET MaxValue = CASE WHEN @NewMax > MaxValue THEN @NewMax ELSE MaxValue END

GO

当您只关心一个值时,这将比保持整个索引要便宜得多。但是,如果您经常从表中更新或删除它,则它将不起作用,因为这需要执行昂贵扫描以找到下一个最高价值的触发器。

假设您正在执行更新和删除。但是您也知道:

  • 在5%的记录中,重要的column> x
  • 在95%的记录中,重要的column< = x

然后您可以使用过滤索引:

CREATE INDEX IX_MaxValue ON Sales.Customer (ImportantColumn) WHERE ImportantColumn > X

这将消除索引中95%的记录,这意味着您需要的索引需要少得多的RAM,甚至大多数更新都不会触及它。

您将必须保姆,随着时间的推移调整X。

最新更新