2009-08-27 88 views
24

索引我有如下表索引视图VS表

EVENT_LOG

EVENT_ID: pk, int, not null 
TYPEID: fk, int, not null 
CATEGORYID: fk, int, null 
SOURCE: varchar(255), null 
DESCRIPTION: varchar(4000), null 
CREATED: datetime, null 

我们已经创建报告,并发现表现很烂。除了集群之外,没有任何索引。我们可以创建它们,但是因为这个表格的写入量超过了它的读取量,所以存在一个衡量性能问题的重量。对于报告,我倾向于在每列上放置索引,因为需要为子字符串搜索源&描述列。

我们想知道如果indexed view(也称为物化视图)是一个选项,其中索引视图将包含EVENT_LOG表中的所有列,但在视图上创建了适当的索引。这会不会影响写入EVENT_LOG表格的报表性能?

+3

我想你最好用生成表的副本用于报告目的,就像复制副本一样,你可以用日常操作中的变化填充每晚一次,然后你可以有很多指数可以加快报告速度。 – 2009-08-27 19:47:19

+0

您也可以通过反向索引文本列来提高您的子字符串搜索性能。 – Matthew 2011-01-07 18:01:33

回答

25

索引视图将导致与列索引相同的问题,因为索引视图需要with schemabinding,它直接将其与表绑定在一起,不允许您以任何方式更改/更改该表的模式,或形式。这包括调整列的大小(例如 - 从varchar(50)varchar(255)),改变列的数据类型(例如 - 从doubledecimal(18,5))等。我已经看到它们引起许多意想不到的麻烦,因为这个事实。

我的建议是设置一个存储过程或SSIS包,它将为您创建一个每小时运行一次的报告表。通过这种方式,您可以将非常喜欢的地图编入索引,并享受它带来的所有性能优势。我对来自现场直播系统的报道感到害羞。实际上我还没有看到这种情况是必要的。出于报告目的,小时信息通常绝对足以完成工作。

+0

不是说有任何立即计划改变数据类型的相关信息,但一旦完成 - 不会更新统计数据处理事情?我同意你和marc_s的观点,即完全复制到另一张表可能是最好的选择。 – 2009-08-27 19:53:04

+0

看到CQRS模式,Udi Dahan做了很好的工作:http://www.udidahan.com/2009/12/09/clarified-cqrs/ – BlackICE 2010-03-24 19:28:32

3

我认为它仍然会影响性能,因为物化视图上的索引需要在某些时候更新 - 它可能不需要与表写入同步。

就我个人而言,我会将索引放在表格上,并自己测量写入性能。你可以猜测写入索引的速度会有多慢,但直到你真正测量它,你只是猜测。它可能没有明显的差异。

1

如果您经常要写信给您,您可能会遇到这种情况,因为您在实体化视图中具有索引的性能成本。物化视图更适用于不经常更改的数据。

1

我遇到了类似的问题。决定增加多列索引来反对DBA的建议。在我的开发机器和服务器上(具有DBA权限),写入性能提高,报告速度明显快于在单个列上创建索引(17倍)。为什么,我不知道,因为我不是DBA,但我知道基础知识,有时可以帮助您查看森林/树木。因此,我同意Eric Pertroelje的观点,您必须添加索引并衡量写入性能,甚至衡量读取性能。

3

“该人士&描述列需要被搜索的字符串。”

当您搜索的VARCHAR子()列,SQL Server将不会使用任何索引。(即使复制表格并创建索引) 如果在搜索字符串的开头使用了通配符,则不使用索引。

我想,如果您需要在其中搜索子字符串,那么最好在'Source'和'Description'上创建一个全文索引。

所以我的建议是在varchar()列上创建一个全文索引,并将Change-Tracking手动设置为每小时运行一次,当没有DML时...会减少INSERT语句