创建用于缓存记录的视图或新表

时间:2015-05-24 09:37:15

标签: sql-server-2008 caching database-performance

我在一个遗留应用程序中遇到了巨大的性能问题。

有一个搜索表单,用户可以在其中搜索具有给定值的记录。 结果行包含10列。然后SP返回任何包含任何列的值的行。

此SP使用8个表,其中一些有大约百万个记录。我每分钟都会得到一张新纪录。该SP也进行寻呼。 执行此SP有时需要大约40秒。

我做的是,我创建了一个新表,并使用来自此SP的查询将所有记录放在那里,但没有条件。 当其中一个源表中有新的更新或更新时,我使用触发器并更新这个新的“缓存”表。 现在等待这个新表的结果只需1-3秒。

有人遇到过类似的事吗?

我的一位同事说我最好使用视图,但每次我都会制作JOINS

你怎么看?还有另一种方式吗?

3 个答案:

答案 0 :(得分:3)

临时表通常可以帮助您解决性能问题。一种方法可能是只收集您需要考虑的记录到临时表中,然后从连接到您未过滤的任何其他表的临时表中创建最终的select语句。

例如,假设您要搜索的其中一个字段是field1中的table1。首先,只在表#table1中插入您要查找的值为field1的记录:

select PrimaryKeyTable1, Field1, Field2, Field3, etc...
into #table1
from table1
where Field1 = 'Whatever you are looking for'

即使是大表,这也应该非常快,特别是如果你有Field1的索引。您可以为包含搜索字段的每个表执行此操作,以收集具有相关记录的所有记录。

然后,您还需要确保将任何记录插入到临时表中,这些记录可能具有对任何其他临时表的外键引用。因此,假设您还使用上述方法构建了一个表#table2,该表具有table1的外键,称为PrimaryKeyTable1。您可以插入以下记录:

Insert into #table1
    (PrimaryKeyTable1, Field1, Field2, Field3, etc...)
select table1.PrimaryKeyTable1, table1.Field1, table1.Field2, table1.Field3, etc...
from table1
join #table2
on table1.PrimaryKeyTable1 = table2.PrimaryKeyTable1
where table1.PrimaryKeyTable1 not in
    (Select PrimaryKeyTable1 from #table1)

现在,#table1中的任何记录都会与#table2中包含与搜索条件匹配的记录的记录匹配。您对具有相关外键的所有临时表执行此操作。您执行插入的顺序很重要;在收集外键引用记录时,请确保在最后一个insert语句之后才引用任何临时表。

然后,您可以简单地执行最终的select语句,将实际表替换为您构建的临时表,并删除搜索字段数据的所有过滤器。根据查询的结构,可能还有其他优化,但这是一般的想法。

如果您已经探索了所有索引选项,但这仍然无济于事,那么MS SQL Server具有“更改跟踪”功能,可能对您构建缓存表有用。您启用数据库以进行更改跟踪并配置要跟踪的表。然后,SQL Server会在每次更新时创建更改记录,在表上插入,删除,然后让您查询自上次检查以来所做记录的更改。这对于同步更改非常有用,并且比使用触发器更有效。它比管理自己的跟踪表更容易管理。这是自SQL Server 2005以来的一项功能。

How to: Use SQL Server Change Tracking

更改跟踪仅捕获表的主键,让您查询哪些字段可能已被修改。然后,您可以查询这些表上的表连接以获取当前数据。如果您希望它捕获数据,您也可以使用Change Capture,但它需要更多的开销,至少需要SQL Server 2008企业版。

Change Data Capture

答案 1 :(得分:2)

您的解决方案是在Oracle中执行Microsoft SQL Server中的“索引视图”或“物化视图”的强大方法。

基本上你是对的 - 导航单个索引表然后是十几个不断更新的表更快。

你应该尝试创建一个索引视图(有些从这里开始https://technet.microsoft.com/en-us/library/dd171921(v=sql.100).aspx),它可能会解决你所有的性能问题。

答案 2 :(得分:1)

您可以使用架构绑定在view.it上查看和创建集群索引将物理存储您的视图数据。但在创建架构绑定视图后,您无法更改表格。