问题标签 [indexed-view]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3049 浏览

sql - SQL Server 性能和索引视图

使用 SQL Server 2008。

(对不起,如果这是一篇文章,但我试图提供尽可能多的信息。)

我有多个位置,每个位置都包含多个部门,每个部门都包含多个可以进行零到多次扫描的项目。每次扫描都与可能有也可能没有截止时间的特定操作相关。每个项目也属于一个特定的包,属于一个特定的工作,属于一个特定的项目,属于一个特定的客户。每个作业包含一个或多个包,其中包含一个或多个项目。

items 表中大约有 24,000,000 条记录,scans 表中大约有 48,000,000 条记录。新项目全天偶尔批量插入到数据库中,通常一次插入数以万计。每小时都会批量插入新的扫描,从几百到几十万不等。

这些表被大量查询、切片和切块。我正在编写非常具体的存储过程,但它变成了维护的噩梦,因为我正处于一百个存储过程的边缘,并且在站点中没有尽头(例如,类似于 ScansGetDistinctCountByProjectIDByDepartmentIDGroupedByLocationID、ScansGetDistinctCountByPackageIDByDepartmentIDGroupedByLocationID 等) 幸运的是,要求几乎每天都更改(感觉如何),每次我必须更改/添加/删除一列时,嗯......我最终在酒吧。

所以我创建了一个索引视图和一些带有参数的通用存储过程来确定过滤和分组。不幸的是,性能下降了马桶。 我想第一个问题是,既然选择性能是最重要的,我是否应该坚持使用特定方法并通过对基础表的更改进行斗争?或者,可以做些什么来加快索引视图/通用查询方法?除了缓解维护噩梦之外,我实际上还希望索引视图也能提高性能。

这是生成视图的代码:

和聚集索引:

这是通用存储过程之一。它获取已扫描并具有截止值的项目的计数:

第一次运行查询并查看实际执行计划时,我创建了它建议的缺失索引:

创建索引将执行时间缩短到大约 5 秒,但这仍然是不可接受的(查询的“特定”版本运行亚秒级。)我尝试向索引添加不同的列,而不是仅仅包括它们而没有性能提升(在这一点上我不知道我在做什么并没有真正的帮助。)

这是查询计划:

查询计划

以下是第一次索引查找的详细信息(它似乎返回了视图中 Cutoff IS NOT NULL 的所有行):

手术

0 投票
1 回答
2276 浏览

sql-server - 在 SQL Server 上索引 rowversion/timestamp 列的后果

与我之前关于没有临时漏洞的序列(保证读者可见的数字始终在增加)的问题相关,请在此处输入链接描述,我想问一下我设计的解决方案是否有意义。

我创建了一个带有rowversion列的表。如果我正确理解这一点,SQL Server 保证这些值将始终递增。因为这只是一堆字节,所以像WHERE RowVer > 1567这样的查询需要强制转换,因此会导致表扫描。

所以我创建了一个可以进行强制转换的索引视图,我正在查询该视图。从表面上看,它可以工作(查询计划显示索引搜索),但我不确定如果我通过索引,始终递增的保证是否仍然适用。请帮忙。

编辑
它在调试时似乎工作正常,但插入到我的表中会阻止任何针对它的选择。需要调查持有什么样的锁。

0 投票
2 回答
3631 浏览

sql - SQL Server 2008 R2 上的索引视图

我有一个 SQL Server 2008 R2 数据库,其中包含我们用于报告的非常大的表。每天晚上大约有 40,000 条记录被插入到表中。我在许多文章中读到索引视图适用于 OLAP 或 Warehouse 数据库,而不适用于事务表。

我的目标不是查询整个表,而是查询一个子集,比如最近 3 个月的数据。不想使用触发器来创建子集。索引视图是否适合我的场景?如果没有,有更好的想法吗?

0 投票
1 回答
83 浏览

sql - 这些是按小时/天/月分组的排行榜的索引视图的正确索引吗?

这是创建按小时分组的索引视图的脚本示例。我还有另外 2 个用于日和月。每当向用户授予积分时,表 UserPoints 都会存储一条记录,其中包含名为 CreationDate 的确切日期时间时间戳。

我正在尝试确保我有正确的索引来查询此索引视图以获得排行榜,该排行榜将根据 PointType 和总和对用户进行排名。

例如,如果我想要一个基于用户在过去 3 小时内获得的分数的排行榜,我的排行榜查询看起来像这样。(或任何其他时间窗口)。

我担心的是,当我运行该查询时,我看不到执行计划窗口显示它正在使用IX_HourlyPoints_PointTypeId_Points_Hour索引。不应该吗?

0 投票
1 回答
3139 浏览

sql-server - 刚刚创建的视图上的非聚集索引,但得到警告列错过统计信息

显然,我对索引统计有一些不明白的地方。

我有一个包含数百万行的表用于记录目的。为了提高性能,我创建了一个视图和一个唯一的聚集索引(必须这样做,因为第一个索引必须是唯一的聚集索引)以及一个非聚集索引,以便能够在索引中包含更多列。

现在我比较一些有和没有这些索引和视图的查询的性能;我确实从中获得了更快的速度,并且读取和 CPU 使用率似乎也更低。

但是,当我查看 sql server 应用的执行计划时,我发现该非聚集索引上的 Index Seek 上有一个警告,即某些列缺少统计信息;这些列也确实出现在我的 where 子句中,所以我认为这里可能仍有一些性能需要改进。执行计划有两列抱怨没有统计信息;其中一个在非聚集索引内,另一个在该索引的包含子句内。无论如何,我不明白这些统计数据是如何丢失的。

例如这里http://msdn.microsoft.com/en-us/library/ms190397.aspx它声明“查询优化器在创建索引时为表或视图上的索引创建统计信息。”。好吧,我只是创建了这些索引,从那时起没有更新或插入任何行。我还检查并确保启用了 AUTO_UPDATE_STATISTICS 和 AUTO_CREATE_STATISTICS,我在这里缺少什么?

我还通过 SQL Server Management Studio 查看了该索引的统计信息:(展开视图,然后右键单击统计信息下的非聚集索引,然后选择属性)在统计信息列下可以看到提到的两个列之一(那个不在 include 子句中)。

我怎样才能摆脱这个警告,即创建/强制这些统计数据存在?

0 投票
3 回答
1441 浏览

sql - 查看聚集索引查找超过 50 万行需要 7 分钟

看看这个执行计划:http
://sdrv.ms/1agLg7K 不是估计的,是实际的。从大约30 分钟的实际执行中。

选择第二条语句(占用总执行时间的 47.8%——大约 15 分钟)。
查看该语句中的顶部操作 – View Clustered Index Seek over _Security_Tuple4。该操作花费了语句的 51.2%——大约 7 分钟。

该视图包含大约 0.5M 行(作为参考,log2(0.5M) ~= 19 - 考虑到索引树节点大小为 2,仅 19 步,实际上可能更高)。
该运算符的结果是零行(与估计不匹配,但暂时不要介意)。
实际执行 - 零。

所以问题是:哔哔声怎么可能需要七分钟?!(当然,我该如何解决?)


编辑关于我在这里问的一些澄清
我对一般性能相关的建议感兴趣,例如“查看索引”、“查看大小”、“参数嗅探”、“不同数据的不同执行计划”等。
我已经知道了所有这些,我可以做到所有这些分析我自己。

我真正需要的是知道什么会导致一个特定的聚集索引搜索如此缓慢,然后我可以做些什么来加快它

不是整个查询。
不是查询的任何部分。
只是一个特定的索引搜索。
结束编辑


还要注意第二个和第三个最昂贵的操作是如何分别在 _Security_Tuple3 和 _Security_Tuple2 上查找的,它们只需要 7.5% 和 3.7% 的时间。同时,_Security_Tuple3 包含大约 280 万行,是 _Security_Tuple4 的六倍。

另外,一些背景:

  1. 这是该项目中唯一一个行为不端的数据库。有几十个相同模式的其他数据库,它们都没有出现这个问题。
  2. 第一次发现这个问题时,发现索引99%是碎片化的。重建索引确实加快了速度,但并不显着:整个查询在重建前用了 45 分钟,在重建后用了 30 分钟。
  3. 在使用数据库时,我注意到像“select count(*) from _Security_Tuple4”这样的简单查询需要几分钟时间。怎么回事?!
  4. 然而,他们在第一次运行时只用了几分钟,然后就瞬间完成了。
  5. 问题连接到特定的服务器,也不连接到特定的 SQL Server 实例:如果我备份数据库然后在另一台计算机上恢复它,行为保持不变。
0 投票
1 回答
336 浏览

sql-server-2008 - 非空日期如何在视图中变为可空

我在一个名为的表中有一个日期时间字段dbo.Traffic

我正在尝试按天汇总流量数据。我计划创建一个模式绑定视图并添加一个索引。

在基表中,CreateDate 不可为空。但是,一旦我创建了一个视图并将其转换为日期,它就可以为空。

在此处输入图像描述

0 投票
3 回答
4827 浏览

sql-server - 为什么查询优化器完全忽略索引视图索引?

SQL Fiddle:http ://sqlfiddle.com/#!6/d4496/ 1(为您的实验预先生成数据)

有明显的表:

和观点:

其中实体字段 Classificator1ID..Classificator5ID 解析为分类器值 Code1..Code5

这个视图上有很多索引:

但 QO 从不使用它们!尝试这个:

为什么?尤其是“包含”索引有什么问题?已创建索引,具有所有字段但仍未使用...

补充:这只是测试!请不要这么生气,也不要逼我分析那些索引维护问题。

在我的真实项目中,我无法解释为什么 QO 会忽略索引视图(非常有用的索引视图)。但有时我看到它在其他地方使用它们。我创建了这个 db 片段来试验索引公式,但可能我应该做更多的事情:以某种方式调整 statistcs 吗?

0 投票
2 回答
837 浏览

sql-server - 无法创建索引视图

我正在尝试在视图上放置索引,但一直遇到出现错误的问题

因为视图的选择列表包含聚合函数或分组列的结果表达式。考虑从选择列表中删除聚合函数或分组列的结果表达式。

代码:

0 投票
1 回答
2949 浏览

sql-server - 索引视图何时更新?

我正在使用 SQL Server 2000,我犹豫是否开始使用索引视图(我有一个包含每日性能值的表,我需要用许多数学函数对它们进行评分)。

如果我创建一个索引视图(使用我的性能表),然后在我的性能表中添加一个新行,我的视图索引是立即更新,还是在视图的第一个用户请求时更新?