4

如何提高针对具有数百个高基数列和数百万条记录的表的即席查询的性能?

在我的例子中,我有一个表,其中包含一个索引DATESDATE、一VARCHAR2NE和 750 个数字列,其中大部分是高基数列,其值在0 to 100. 该表几乎20000每小时都会更新一次新记录。针对此表的查询如下所示:

SELECT * FROM TAB WHERE SDATE BETWEEN :SDATE AND :EDATE AND V1 > :V1 AND V3 < :V3

或者

SELECT * FROM TAB WHERE SDATE BETWEEN :SDATE AND :EDATE AND NE = :NE AND V4 > :V4

等等

到目前为止,我一直建议用户不要输入大间隔日期,以限制日期索引访问路径产生的记录数;但是,有时需要指定更大的间隔。

如果V1, V2, ..., V750都是低基数列,我将能够利用位图索引。不幸的是,他们不是。

对此有何建议?我应该如何解决这个问题?

谢谢。

4

2 回答 2

1

我假设您对设计感到困惑,所以我可能会考虑一些想法-

1)使用分区 - 如果你有分区选项

2) 使用一些触发器对查询表进行非规范化(或在这种情况下进行规范化),该查询表更适合查询使用

3)制作一些快照

4)查看有一个当前表或一组表,其中包含天记录(或一些合适的子集),并将它们滚动到一个大表以存储历史。

这取决于使用模式和系统具有的所有其他约束 - 这可能会让您入门,如果您有更多详细信息,可能会有更好的解决方案。

于 2012-09-25T01:56:06.677 回答
1

我认为最大的问题是插入。您在 sdate 上有一个索引,它可以减慢插入速度并加快选择速度。但是,回到你的问题:

如果用户指定的时间间隔很大(比如说 >5%),最好让表按 sdate 以每天、每周或每月的方式进行分区。 Oracle 分区文档

(如果您对表进行分区,请不要忘记对索引也进行分区。如果您想实时进行,请使用exchange partition)。

此外,作为解决方法,如果您有一台功能强大的机器,您可以使用并行查询。 Oracle 并行文档

于 2012-09-25T05:56:32.540 回答