非结构化查询的性能优于集群、散列集群和索引?

Posted

技术标签:

【中文标题】非结构化查询的性能优于集群、散列集群和索引?【英文标题】:Non-structured Query performs better than on clustered, hash-clustered and indexed? 【发布时间】:2015-09-29 04:11:14 【问题描述】:

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

查询:

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_id 和 Customer.Cust_id 上添加了索引:

将两个表都添加到集群索引为 Cust_id 的集群中:

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

【问题讨论】:

不要使用逗号语法,使用 JOIN 代替:SELECT Cust_name, price FROM Customer c JOIN Sales s ON s.Cust_id = c.Cust_id WHERE price > 1000 AND num_sold > 10; 运行这些查询没有异常,以这种方式构造查询在性能上有什么不同吗? 您是否尝试过使用parallel 提示执行查询? 之后我会这样做,但我只是想看看哪种结构最有效 【参考方案1】:

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

【讨论】:

您能对查询提出任何改进建议吗?或者我可以使用什么作为可以与任何结构一起使用的典型基线查询? 无法回答您的问题。一切都取决于规格。如果您的用户将始终选择 70% 的数据(您的基线?),那么您不需要任何结构。但是,如果您的用户通常会选择 0.001% 的数据,那么您可以定义一些有效的结构等。 我的意思是一般来说,我的基线查询的目的是获得一个应该很慢的初始读数(以便我以后可以看到改进),以便我可以更改结构并应用相同的查询应该至少有一个结构具有更好的性能。该问题询问我是否可以使用更好的基线查询(即计数、获取单行、更多/更少过滤),因为正如您在我当前的查询中看到的那样,所有结构都更糟 从用户那里获取典型的查询。没有人会猜到。每个结构都对其他东西有好处 - 没有解决方案 evrything :) 如果有一个结构适合 evrything 那么只会存在一个。【参考方案2】:

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

    根据 price、num_sold 或两者对 sales 表进行范围分区。 使用物化视图预连接表,和/或限制所需的列,和/或限制所需的行。 对 sales 表使用一种压缩形式(这可能仅在您使用直接路径批量插入 sales 时才有价值)。 也许可以尝试在您使用的销售表的列上使用压缩索引,也可以在客户(cust_id、cust_name)上使用索引,并希望快速进行全索引扫描。

【讨论】:

以上是关于非结构化查询的性能优于集群、散列集群和索引?的主要内容,如果未能解决你的问题,请参考以下文章

python Redis散列集的python

散列集实现使用动态分配的链接列表实现数组

在优于 O(K*lg N) 的运行时间内反转保序最小完美散列函数

数据库系统概念笔记——第十一章:索引与散列

redis集群redis-cluster搭建

哈希表 - 为啥它比数组快?