表索引和视图索引之间有什么区别?

时间:2010-04-07 19:03:13

标签: sql-server indexing

我对表上的索引和视图上的索引(索引视图)之间的区别感到很困惑。请澄清一下。

3 个答案:

答案 0 :(得分:4)

确实没有。表格或视图上的索引基本上可以加快搜索速度。

主要是:视图通常没有索引。当您向视图添加聚集索引时,您基本上将该视图“物化”为系统维护的,始终自动更新的“伪表”,它存在于磁盘上,使用磁盘空间就像一个表,并且因为它确实是几乎已经是一个表,你也可以在索引视图中添加其他索引。

所以真的 - 在表和索引视图之间,没有什么区别 - 并且表上的索引和索引视图之间几乎没有任何区别。

答案 1 :(得分:0)

视图上的索引有一些限制,因为视图可以基于表和视图的各种组合。

在任何一种情况下,它们都是相似的,并且随着基础数据的变化,索引可能需要或不需要更新。

通常总是使用表上的索引 - 通常您将至少有一个唯一索引(主键),并且可能已经识别了要聚类的索引之一。

视图上的索引通常仅作为优化技术应用,因为视图读取变得很重,视图上的索引可以使用视图提高性能。

答案 2 :(得分:0)

我使用索引视图极大地提高了查询的性能,在这些查询中,我想按字段的唯一组合进行分组,并可能计算一些汇总SUM或依靠它们。

例如,考虑一个包含客户,卡车,距离,日期(加上我现在不想查询的其他30个性能列)的表。我有数百个客户,他们每个人都有数百辆卡车,每辆卡车每天报告5次距离和其他数据。如果要查询在哪些月份报告哪些卡车的列表,请创建如下视图:

CREATE VIEW dbo.vw_DistinctUnitMonths
    WITH SCHEMABINDING
AS
SELECT CustomerGroup,
       CustomerId,
       Vehicle,
       CAST(DATEADD(MONTH, DATEDIFF(MONTH, 0, Date), 0) AS DATE) AS Month, --Converts Date to First of the Month
       SUM(CASE WHEN Miles > 0 THEN Miles ELSE 0 END)            AS Miles,
       COUNT_BIG(*)                                              AS Count
FROM dbo.PerformanceData
GROUP BY CustomerGroup, CustomerId, Vehicle, CAST(DATEADD(MONTH, DATEDIFF(MONTH, 0, Date), 0) AS DATE)

GO

CREATE UNIQUE CLUSTERED INDEX IX_DistinctUnitMonths ON vw_DistinctUnitMonths (CustomerGroup, CustomerId, Vehicle, Month)

GO

这是一个不使用视图的慢查询:

--Can Be Very Slow!
SELECT CustomerGroup,
       CustomerId,
       Vehicle,
       CAST(DATEADD(MONTH, DATEDIFF(MONTH, 0, Date), 0) AS DATE) AS Month
FROM PerformanceData
WHERE Month >= '2020-01-01'
  AND Month < '2020-02-01'
GROUP BY Vehicle, ClientID, ClientGroupId, CAST(DATEADD(MONTH, DATEDIFF(MONTH, 0, Date), 0) AS DATE)

由于索引视图的存在,这是运行速度更快的一个。

--Much Faster
SELECT CustomerGroup,
       CustomerId,
       Vehicle,
       Month
FROM vw_DistinctUnitMonths WITH (NOEXPAND)
WHERE Month >= '2020-01-01'
  AND Month < '2020-04-01'
GROUP BY Vehicle, ClientID, ClientGroupId, Month

由于索引视图仅在客户,组,车辆和月份的唯一组合上创建索引,因此该视图的磁盘空间比在索引源表中的那些列时要小得多。对视图的查询更快,因为视图中的数据集中到几十兆字节,而不是源表占用的数百兆字节。

另请参阅MSFT Docs: Create Indexed Views