Sql 非结构化查询的性能优于群集查询、哈希群集查询和索引查询?

Sql 非结构化查询的性能优于群集查询、哈希群集查询和索引查询?,sql,database,oracle,query-optimization,database-performance,Sql,Database,Oracle,Query Optimization,Database Performance,我使用以下查询作为一些非结构化数据(无索引、无群集等)的基线,并且与向联接列添加索引或向群集或哈希群集添加表相比,该查询在非结构化数据上的性能更好。我觉得我的基线查询并不理想,我的任务是进行基线查询并找到一个性能最好的结构,但我尝试过的所有结构的性能都比非结构化的差。我可以对基线查询做些什么,至少找到一种比非结构化查询有显著改进的结构 查询: SELECT Cust_name, price FROM Customer, Sales WHERE price > 1000 AND num_so

我使用以下查询作为一些非结构化数据(无索引、无群集等)的基线,并且与向联接列添加索引或向群集或哈希群集添加表相比,该查询在非结构化数据上的性能更好。我觉得我的基线查询并不理想,我的任务是进行基线查询并找到一个性能最好的结构,但我尝试过的所有结构的性能都比非结构化的差。我可以对基线查询做些什么,至少找到一种比非结构化查询有显著改进的结构

查询:

SELECT Cust_name, price
FROM Customer, Sales
WHERE price > 1000
AND num_sold > 10
AND Sales.Cust_id = Customer.Cust_id;
此查询返回150k行中的108k+行

以下是测试的痕迹:

非结构化:

在连接列Sales.Cust\u id和Customer.Cust\u id上添加索引:

将这两个表添加到集群索引为客户id的集群中:

将这两个表添加到具有10000个键的哈希群集:


您可以选择72%的数据。我认为任何结构都不会对这种情况有很大帮助。非结构化似乎是最好的。

您选择了72%的数据。我认为任何结构都不会对这种情况有很大帮助。非结构化似乎是最好的。

我能想到的唯一改进方法是:

  • 根据价格、售出数量或两者对销售表进行范围分区
  • 使用物化视图预联接表,和/或限制所需的列,和/或限制所需的行
  • 对sales表使用某种形式的压缩(只有在使用direct path批量插入sales时,压缩才有价值)
  • 也许可以尝试在您使用的sales表的列上使用压缩索引,或者在customer(客户id、客户名称)上使用索引,并希望快速进行完整索引扫描

  • 我能想到的唯一改进方法是:

  • 根据价格、售出数量或两者对销售表进行范围分区
  • 使用物化视图预联接表,和/或限制所需的列,和/或限制所需的行
  • 对sales表使用某种形式的压缩(只有在使用direct path批量插入sales时,压缩才有价值)
  • 也许可以尝试在您使用的sales表的列上使用压缩索引,或者在customer(客户id、客户名称)上使用索引,并希望快速进行完整索引扫描

  • 不要使用逗号语法,而是使用JOIN,例如:
    选择客户名称,客户c的价格在s.Cust\u id=c.Cust\u id上加入销售,其中价格>1000,销售数量>10
    运行这些查询时没有异常,以这种方式构造查询在性能上有什么不同吗?您是否尝试过使用
    parallel
    提示执行查询?之后我会这样做,但我只是想看看什么结构最有效不要使用逗号语法,而是使用JOIN,如:
    选择客户名称,来自客户c的价格加入s.Cust_id=c.Cust_id上的销售,其中价格>1000,销售数量>10
    运行这些查询时没有异常,以这种方式构造查询在性能上是否有任何差异?您是否尝试过使用
    parallel
    提示执行查询?之后我会这样做,但我只是想看看哪种结构最有效?您能对查询提出任何改进建议吗?或者我可以用什么作为一个典型的基线查询来处理任何结构?不可能回答您的问题。这一切都取决于规格。如果您的用户总是选择70%的数据(您的基线?),那么您不需要任何结构。但是,如果您的用户通常会选择0.001%的数据,那么您可以定义一些有效的结构,等等。我的意思是,一般来说,我的基线查询的要点是获得一个初始读数,该读数应该非常慢(以便我以后可以看到改进)这样我就可以更改结构并应用相同的查询,并且应该至少有一个结构具有更好的性能。这个问题问我是否有更好的基线查询(即计数、获取单行、更多/更少筛选)可以使用,因为正如您在我当前的查询中看到的,所有结构都是WORSGET用户的典型查询。没人会猜到的。每个结构都适用于其他内容-没有针对evrything的解决方案:)如果存在一个适合evrything的结构,那么将只存在一个。您能建议对查询进行任何改进吗?或者我可以用什么作为一个典型的基线查询来处理任何结构?不可能回答您的问题。这一切都取决于规格。如果您的用户总是选择70%的数据(您的基线?),那么您不需要任何结构。但是,如果您的用户通常会选择0.001%的数据,那么您可以定义一些有效的结构,等等。我的意思是,一般来说,我的基线查询的要点是获得一个初始读数,该读数应该非常慢(以便我以后可以看到改进)这样我就可以更改结构并应用相同的查询,并且应该至少有一个结构具有更好的性能。这个问题问我是否有更好的基线查询(即计数、获取单行、更多/更少筛选)可以使用,因为正如您在我当前的查询中看到的,所有结构都是WORSGET用户的典型查询。没人会猜到的。每一个结构都适用于其他东西-没有任何解决方案适用于每一件事:)如果有一个结构适合每一件事,那么就只存在一个。