我有下表
EVENT_LOG:
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
我们一直在创建报告,发现性能很糟糕。除了聚簇索引之外,没有任何其他索引。我们可以创建它们,但是由于该表的写入内容超出了读取的范围,因此存在对性能的权衡问题。对于报告,我倾向于在每个列上放置索引,因为需要在源和描述列中搜索子字符串。
我们想知道是否可以选择索引视图(又名实体化视图),其中索引视图将包含EVENT_LOG表中的所有列,但在视图上创建了适当的索引。这会为我们带来报告的性能,同时又不影响对EVENT_LOG表的写入吗?
索引视图将导致与列上索引相同的问题,因为索引视图require with schemabinding,将其直接绑定到表,从而使您无法以任何方式,形状或形式更改/更改该表的架构。这包括调整列的大小(例如,从-varchar(50)到varchar(255)),更改列的数据类型(例如-从-double到decimal(18,5))等。由于这一事实,我已经看到它们会引起很多意想不到的麻烦。
with schemabinding
varchar(50)
varchar(255)
double
decimal(18,5)
我的建议是设置一个存储过程或SSIS包,它将为您创建一个每小时运行一次的报告表。这样,您可以从中索引不断变化的地狱,并享受其所产生的所有性能优势。我不赞成从实时的正在进行的系统中进行报告。实际上,我还没有看到需要这样做的情况。出于报告目的,通常需要数小时的信息才能完成工作。