2012-10-11 30 views
0

我有一个包含15,000,000条记录的表。这些记录可以基于某些匹配字段(通常是单个组中的最大值3或4)相互关联。每个记录也有一个与之相关的日期,但是这个日期并不一定与它加载到表格中的日期/订单相关。与大型数据集的视图与索引表的性能

这些记录定期用于更新数据库中的其他记录。尽管如此,我只关心最新的唱片,并且在1500万条唱片(正在更新1000万条唱片)上,我想确保我忽略了其他所有内容。如果最新记录已经有“更新”标志,我也想跳过更新。

我一直在使用这样的一个观点,收集各组内的最新记录:

SELECT a, b, c, max(scan.timestamp) AS latest_scan 
FROM scan 
GROUP BY a, b, c; 

然后我用一个WHERE子句中我UPDATE忽略具有更新标志的任何记录。

有了这么多的记录,我可以使用视图吗?我已经看到人们开始创造真正的索引表,以提高性能,但我仍然认为这需要很长时间。这是我可以从中受益吗?

回答

0

大多数情况下,您需要尝试一下,看看表现如何。

关键是视图最终会成为一个子查询的快速标记,它会给出优化器信息。所以,它仍然主要取决于优化器是否可以找到用于您调用数据库的SQL语句的索引。

请注意,您在视图中可能不需要ORDER BY,因为您将在其他一些SQL语句中使用它,然后可以对记录进行排序。如果优化器没有发现它可以跳过顺序,那么当你不需要的时候,你将花费时间进行排序。

我期望你可以使用GROUP BY a,b,c来获得组的最大时间戳。

+0

我的错误 - 它应该是GROUP BY而不是ORDER BY。你说这个视图会被用来给优化器信息 - 当使用视图时,它是否考虑到它基于的表的索引? –

+1

基本上所有的视图是,就查询引擎而言是一个带有名称的查询,所以基本上它把select *从MyView看作select * from(视图中的sql),所以它确实使用了基础表指数。 –