可以从索引,集群或散列集群中受益的查询

时间:2015-09-29 23:45:31

标签: sql oracle query-optimization database-performance

当我在数据上使用索引,群集或散列群集结构时,我试图找到显示性能提升的等连接查询。我最初需要首先对非结构化数据运行查询,并且执行时间应该很长,以便我可以看到3种结构中的任何一种的性能提升。我遇到的问题是,如果我使用一个使用索引列的查询,搜索太窄,所以我返回的行太少,然后我的基线查询的执行时间太快,所以我可以“#”; t以后测量时间。

似乎唯一对我的基线查询执行时间产生任何重大影响的查询是导致对具有最多行的表进行全表扫描的那些查询,但这会使得使用索引结构无用,因为它赢得了“'使用索引。集群或散列集群是否可以从全表扫描中受益 - 通常我不知道哪些查询会从集群/散列集群中受益。

我的表有500,000多行和我尝试过的一些查询:

SELECT c.Cust_name, s.total_price
  FROM Sales s, Customer c
 WHERE s.Cust_id = c.Cust_id
 ORDER BY c.Cust_name;


SELECT count(*)
  FROM Sales s, Customer c 
 WHERE s.Cust_id < 500
   AND s.Cust_id = c.Cust_id;


SELECT c.Cust_name, s.total_price
 FROM Sales s, Customer c
WHERE s.Cust_id = c.Cust_id
  AND c.Cust_name LIKE '%A';

1 个答案:

答案 0 :(得分:0)

有意义的数据库性能测试需要多次运行,在不同方法之间交替,删除异常值,并对剩余值求平均值。这是避免缓存和服务器负载波动引起的差异所必需的。

这样的东西可以在SQL * Plus中使用。它可以在PL / SQL中更自动化,但需要更多代码。

set timing on;

--Run #1:
declare
    v_count number;
begin
    for i in 1 .. 100 loop
        SELECT count(*) into v_count
        from Sales s, Customer c
        WHERE s.Cust_id < 500 AND s.Cust_id = c.Cust_id;
    end loop;
end;
/

--Run #2:
alter table ... (changesomething here)

declare
    v_count number;
begin
    for i in 1 .. 100 loop
        SELECT count(*) into v_count
        from Sales s, Customer c
        WHERE s.Cust_id < 500 AND s.Cust_id = c.Cust_id;
    end loop;
end;
/

--Run #1:
...

如果您确实需要使用单次运行的查询来演示这些差异,那么您需要使数据更大并使查询更具选择性。索引范围扫描通常仅在从表中选择一小部分数据时才有用。神奇的数字取决于很多因素,例如硬件上的单块与多块I / O有多快,索引的有序性(索引聚类因子)等等。

我对哈希群集的体验是disappointing。我认为这个功能仅用于历史目的;我几乎从未在Oracle性能调优资源中讨论过它们。没有人有时间弄清完全他们的数据如何适应块。