sql - SQL 2005 索引 View 的缓慢

标签 sql sql-server sql-server-2005 indexed-view

假设我有一个很长的表(约 3500 万行),称为 TimeCard,只有 5 列(tableID、CompanyID、UserID、ProjectID、DailyHoursWorked、entryDate)。这是一个非常简单的表格,记录了每个公司每个项目的员工每天的工作时间。

我现在需要生成一份报告,以找出任何给定公司每个项目的员工每月总工作时间。而不是在报表运行时执行所需的聚合,我想构建一个类似表格的数据结构,它已经将所有公司/项目/用户数据按月聚合,因此当报表运行时,我可以直接查询该数据结构无需执行任何运行时聚合,因为大约 3500 万条记录可能需要几分钟。

所以我有两种不同的方式。创建一个额外的物理表(公司 ID、用户 ID、项目 ID、MonthlyHoursWorked、Month)作为我的列,然后在 TimeCard 表中使用触发器来修改额外表中的值。或者我可以创建一个索引 View 。所以我两个都试了。我首先使用以下代码尝试了索引 View :

CREATE VIEW [dbo].[vw_myView] WITH SCHEMABINDING AS
SELECT 
 JobID,
 ProjectID,
 Sum(DailyHoursWorked) AS MonthTotal,
 DATEADD( Month, DATEDIFF( Month, 0, entryDate), 0 ) AS entryMonth,
 CompanyID,
 COUNT_BIG(*) AS Counter
FROM
 dbo.TimeCard 
Group By DATEADD( Month, DATEDIFF( Month, 0, entryDate ), 0 ), JobID, ProjectID, CompanyID

Go
CREATE UNIQUE CLUSTERED INDEX [IX_someIndex] ON [dbo].[vw_myView] 
(
 [CompanyID] ASC,
 [entryMonth] ASC,
 [UserID] ASC,
 [ProjectID] ASC
)

索引 View 创建正确,总计约 500 万行。

但是,每次如果我清除 SQL 缓存,并运行以下查询: *select * from vw_myView where companyID = 1* ,大约需要3分钟。如果我使用上面提到的额外表路由,清除缓存,大约需要 4 秒。

我的问题是,索引 View 对于这个特定场景是一个糟糕的选择吗?我特别想知道每次更改基础表 (TimeCard) 或针对它运行查询时,是否会重新计算/重新聚合整个索引 View ?

谢谢!

最佳答案

如果您没有使用企业版或开发者版,那么您需要使用 with (noexpand)暗示:

select * 
from vw_myView with (noexpand)
where companyID = 1

当底层数据发生变化时, View 只会更新与变化数据相关的行,而不是整个表。这可能会对具有大量插入的 OLTP 数据库产生不利影响,但如果使用量适中,则不应造成性能问题。

tip from Microsoft :

As a general recommendation, any modifications or updates to the view or the base tables underlying the view should be performed in batches if possible, rather than singleton operations. This may reduce some overhead in the view maintenance.

关于sql - SQL 2005 索引 View 的缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2419986/

相关文章:

mysql - 输出SQL中的特定列

sql - Nvarchar 与逻辑运算符一起工作?

java - SQL2005 的方言

sql-server - 如果我在插入失败后选择 SCOPE_IDENTITY() 会发生什么(SQL Server 2005)

php - 日期范围搜索

sql - postgresql 将数组聚合成一个包含所有元素并集的数组

ios - 如何将多个客户端与非特定平台的云数据库同步

sql - 排名超过切碎的 xml

python - 需要 Django 外键吗?

sql-server - SQL Server 授权/安全问题