针对高基数列的即席查询

时间:2012-09-24 22:59:15

标签: sql oracle

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

在我的情况下,我有一个表格,其中包含一个已编入索引的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都是低基数列,我本可以使用位图索引。不幸的是他们不是。

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

感谢。

2 个答案:

答案 0 :(得分:1)

我认为你坚持设计,所以我可能会想到一些想法 -

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

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

3)制作一些快照

4)查看当前表或一组具有日期记录(或某些合适的子集)的表,并将它们滚动到一个大表中以存储数据。

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

答案 1 :(得分:1)

我认为最大的问题是插入物。你有一个关于sdate的索引,它会减慢插入速度并加快选择速度。但是,回到你的问题:

如果用户指定的间隔很大(比如说> 5%),那么让sdate以每日或每周或每月的方式对表进行分区是更好的。 Oracle partitioning docs

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

此外,作为解决方法,如果您有一台功能强大的计算机,则可以使用并行查询。 Oracle Parallel docs