编程后端开发人员

什么是 SQL 中的索引视图(Indexed View),它是如何实现的,用途是什么,以及在使用时有什么潜在的陷阱?

用 Hintsage AI 助手通过面试

答案。

索引视图(Indexed View,具有索引的物化视图)是一个视图(VIEW),它创建了一个聚集唯一索引。这使得可以将查询结果物理地存储在磁盘上,并利用索引加快访问速度。

优点

  • 快速选择聚合或常用数据。
  • 减轻了实时计算的负担。

限制

  • 并不是所有类型的查询都被支持(例如,无法使用 TEXTNTEXTIMAGE 数据类型,某些函数)。
  • 在基础表发生更改时,需要承担额外的索引维护开销。
  • 声明时需要遵循一系列严格的规则。

代码示例

CREATE VIEW dbo.SalesSummary WITH SCHEMABINDING AS SELECT SalesPersonID, COUNT_BIG(*) AS SalesCount, SUM(TotalDue) AS TotalDue FROM dbo.Sales GROUP BY SalesPersonID; GO CREATE UNIQUE CLUSTERED INDEX idx_SalesSummary ON dbo.SalesSummary (SalesPersonID);

误导性问题。

问:所有视图是否都可以创建索引(聚集的)?

**答:**不可以,只有完全符合限制的视图(例如,没有外部引用,聚合函数一致等)才能被索引。否则,创建索引的请求将返回错误。

由于对主题细节的不了解而导致的实际错误示例。


故事

在一个真实的银行系统项目中,需要加快对聚合报告的查询。创建了一个索引视图,但没有分析对表更新的负载。在大量插入操作中,主表的性能由于更新视图索引的显著开销而急剧下降。


故事

专家错误认为可以对具有外部表连接和 GETDATE() 函数的视图进行索引。创建索引的请求导致错误:“无法在包含非确定性函数的视图上创建索引”。为修复设计架构耗费了一整天。


故事

在一个大型电子商务项目中,基础表“Products”的数据更新导致了锁定的出现。原因是当存在大量索引视图时,事务管理不当,聚合影响了数百万行数据。