【问题标题】:Query that can benefit from index, cluster or hash-cluster可以从索引、集群或散列集群中受益的查询
【发布时间】:2015-09-29 23:45:31
【问题描述】:

当我对数据使用索引、集群或散列集群结构时,我正在尝试找到表现出不错的性能提升的 equi-join 查询。我最初需要首先对非结构化数据运行查询,并且执行时间应该很长,以便我可以看到 3 种结构中的任何一种都可以提高性能。我遇到的问题是,如果我使用使用索引列的查询,则搜索太窄,所以返回的行太少,然后我的基线查询的执行时间太快,所以我无法测量时间。

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

我的表有 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';

【问题讨论】:

  • 表上有哪些索引?你计算过表格统计数据了吗?

标签: sql oracle query-optimization database-performance


【解决方案1】:

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

类似的东西可以在 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 性能调优资源中看到过它们的讨论。没有人有时间确切地弄清楚他们的数据将如何放入块中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 2015-03-14
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多