在Unix shell中分组数据或在Oracle中分组

时间:2014-02-02 17:22:09

标签: sql oracle shell unix

根据多列数据分组的最佳和最优化方法是什么?

需要执行操作的数据是400 x 1000万行或行。 我乘以十,因为我们有10个分区或10个文件,每个分区有大约400 M行

问题: 从临时表中的oracle(10列)中获取列之后 或者通过假脱机来在临时文件中。在获取的数据中,我需要按某些列进行分组并添加(求和)一些列。

选项:

  1. 我可以通过查询使用同一查询中的group by子句来实现 而不是创建一个临时表。 :下方我也得到了参考快照 老。
  2. 我在临时表中获取数据,并确保表分区 是这样,小组变得快。
  3. 我在文件中获取数据并使用awk或。进行数据分组 unix / perl命令。
  4. 查询:

    select /*+ parallel (a,10) */
      customer_type, customer_sub_type, charge_code, cycle,month,
      sum(amount),sum(final_amount)
    from htg_customer_data a
    where cycle=1
    and month=1
    and sys_creation_date < to_date('20140131235959', yyyymmddhh24miss)
    group by customer_type, customer_sub_type, charge_code, cycle, month
    

    表按周期和月份分区,并且有10个分区。每行4亿行。以上使用的字段都没有索引。提取中不需要索引列。

1 个答案:

答案 0 :(得分:3)

您不会提供大量信息。

通常,在数据库中执行操作比将数据移动到另一个环境要快。这有几个原因:

  • 数据库服务器通常比应用程序服务器更强大。
  • 数据库引擎可以利用网格计算(多个处理器,多个磁盘)
  • 数据库引擎可以“智能地”优化查询
  • 数据库引擎可以实现比聚合的“排序和循环”更好的技术

所有这些都适用于Oracle,它具有复杂的算法和良好的优化程序。

我会立即排除(3)因为只是从数据库中移出如此大量的数据将是一个漫长的过程。然后你必须处理一个非常大的文件来做你真正想做的事情。

很可能,(1)是最好的方法。在某些情况下,临时表可以提供额外的性能提升。