-1

我有两条潜在的道路可以解决以下问题,由于服务器上的负载不断变化,因此尝试并查看方法不会为该解决方案带来回报。我有两种方法如下:

select *  
from  
  (  
      select foo.a,bar.b,baz.c  
      from foo,bar,baz
      -- updated for clarity sake  
      where foo.a=b.bar  
      and  b.bar=baz.c  
  )  
group by a,b,c

create table results as
select foo.a,bar.b,baz.c  
from foo,bar,baz  
where foo.a=b.bar  
and  b.bar=baz.c ;  

create index results_spanning on results(a,b,c);  

select * from results group by a,b,c;

所以万一不清楚。顶部查询直接针对多表选择执行分组,从而阻止我使用索引。第二个查询允许我创建一个存储查询结果的新表,继续创建一个跨越索引,然后按查询完成分组以利用索引。

这两种方法的复杂性差异是什么,即它们如何扩展以及在大量数据的情况下哪种方法更可取。此外,主要问题是整体选择的性能,所以这就是我试图在这里解决的问题。

注释

你真的在三个表上做一个 CROSS JOIN 吗?这三列是否单独编入索引?您希望多久运行一次提供最终结果的查询?

1) 不。
2) 是的,为了讨论而省略了 where 子句,因为这显然是一个非常微不足道的例子
3) 没关系。

第二次更新

这是一个临时表,因为它只在短时间内有效,所以是的,这个表只会被查询一次。

4

2 回答 2

0

那么问题来了,哪个更快?

  1. 运行一次查询并对结果集进行排序?

  2. 运行一次查询构建表,然后构建索引,然后再次运行查询并对结果集进行排序?

嗯。棘手的一个。

临时表的用例在 Oracle 中非常少见。它们通常仅在我们需要冻结结果集时才适用,然后我们将重复查询该结果集。这显然不是这里的情况。

因此,请采用第一个选项,并在必要时调整查询。


答案是,就像调优问题经常出现的情况一样,这取决于。

你为什么首先做一个 GROUP BY 。您发布的查询不会进行任何聚合,因此执行 GROUP BY 的唯一原因是消除重复行,即 DISTINCT 操作。如果确实是这种情况,那么您执行某种形式的笛卡尔连接并且调整查询将是修复 WHERE 子句,使其仅返回离散记录。

于 2013-01-25T16:14:27.867 回答
0

如果您的查询经常执行并且速度慢得令人无法接受,您可以考虑创建物化视图来预先计算结果。这为您提供了可索引“表”的好处,而无需每次都创建表的开销。

您需要刷新物化视图(fast如果表很大)on commit或者on demand. 关于如何在提交时创建快速可刷新视图有一些限制,它们会稍微增加提交时间处理,但它们总是给出与运行基本查询相同的结果。随着基础数据的变化,按需 MV 将变得陈旧,直到这些数据被刷新。您需要确定这是否可以接受。

于 2013-01-25T16:36:39.160 回答