- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要一个真正的 DBA 的意见。 Postgres 8.3 在我的 Macbook Pro 上执行此查询需要 200 毫秒,而 Java 和 Python 执行相同的计算不到 20 毫秒(350,000 行):
SELECT count(id), avg(a), avg(b), avg(c), avg(d) FROM tuples;
这是使用 SQL 数据库时的正常行为吗?
架构(表格包含对调查的回复):
CREATE TABLE tuples (id integer primary key, a integer, b integer, c integer, d integer);
\copy tuples from '350,000 responses.csv' delimiter as ','
我用 Java 和 Python 为上下文编写了一些测试,它们压垮了 SQL(纯 Python 除外):
java 1.5 threads ~ 7 ms
java 1.5 ~ 10 ms
python 2.5 numpy ~ 18 ms
python 2.5 ~ 370 ms
即使 sqlite3 与 Postgres 竞争,尽管它假设所有列都是字符串(相比之下:即使仅使用数字列而不是 Postgres 中的整数也会导致 10 倍的减速)
我试过但没有成功的调整包括(盲目地遵循一些网络建议):
increased the shared memory available to Postgres to 256MB
increased the working memory to 2MB
disabled connection and statement logging
used a stored procedure via CREATE FUNCTION ... LANGUAGE SQL
所以我的问题是,我在这里的体验是否正常,这是我在使用 SQL 数据库时可以期待的吗?我能理解 ACID 必须付出代价,但在我看来这有点疯狂。我不是要求实时游戏速度,但由于 Java 可以在 20 毫秒内处理数百万次 double ,我感到有点嫉妒。
有没有更好的方法来以低廉的成本(在金钱和服务器复杂性方面)进行简单的 OLAP?我研究了 Mondrian 和 Pig + Hadoop,但对维护另一个服务器应用程序并不太兴奋,不确定它们是否能提供帮助。
可以这么说,没有 Python 代码和 Java 代码在内部完成所有工作。我只是生成 4 个数组,每个数组有 350,000 个随机值,然后取平均值。我没有在计时中包括生成,只有平均步骤。 Java 线程计时使用 4 个线程(每个数组平均一个线程),有点矫枉过正,但它绝对是最快的。
sqlite3 时序由 Python 程序驱动,从磁盘运行(不是 :memory:)
我意识到 Postgres 在幕后做了更多工作,但大部分工作对我来说并不重要,因为这是只读数据。
Postgres 查询不会更改后续运行的时间。
我已经重新运行 Python 测试以包括将其从磁盘假脱机。时间大大减慢到近 4 秒。但我猜 Python 的文件处理代码几乎都是用 C 编写的(尽管可能不是 csv 库?)所以这向我表明 Postgres 也不是从磁盘流式传输的(或者你是对的,我应该鞠躬在编写存储层的人之前!)
最佳答案
我会说你的测试方案并不是很有用。为了完成数据库查询,数据库服务器经过几个步骤:
因此,在 Python 中创建数组并获取平均值基本上会跳过所有这些步骤,只剩下最后一个。由于磁盘 I/O 是程序必须执行的最昂贵的操作之一,这是测试中的一个主要缺陷(另请参阅我之前在这里问过的 this question 的答案)。即使您在其他测试中从磁盘读取数据,过程也完全不同,并且很难判断结果的相关性。
要获得有关 Postgres 花费时间的更多信息,我建议进行以下测试:
要加快查询速度,请先减少磁盘访问。我非常怀疑是聚合耗费了时间。
有几种方法可以做到这一点:
更新:
我刚刚意识到您似乎对上述查询没有使用索引,而且很可能也没有使用任何索引,所以我对索引的建议可能没有帮助。对不起。尽管如此,我还是要说聚合不是问题,但磁盘访问才是问题。索引的东西我会留下来,反正它可能还有一些用处。
关于python - 为什么 SQL 聚合函数比 Python 和 Java(或穷人的 OLAP)慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51553/
在 Excel 数据透视表中,您可以请求生成离线 OLAP 多维数据集:即扩展名为 .cub 的文件。有没有人知道或有任何关于这种文件格式的指针? 谢谢,_马克 最佳答案 我认为创建它们所需的所有信息
我需要一个心理过程来设计一个 OLAP 数据库...... 基本上对于标准关系它会是(松散地): Identify Entities Identify Relationships Identify P
类似于 NoSQL 数据库,但适用于 OLAP。当然是开源的:) 编辑: OLAP 引擎在幕后使用关系数据库。例如 SAPBW 可以使用 Oracle 等。我的意思是一个没有这个底层关系数据库的 OL
在大多数情况下,维度内层次结构的每个级别代表不同的概念(即国家->地区->城市、年->月->日),这很简单,可以在多维数据集中使用。 我感兴趣的是可变深度层次结构,它往往由相同概念的实例组成,即计算机
在 BigQuery 文档中提到它使用 OLAP 函数。但是开发人员文档没有提到 MDX 查询语言、维度或事实表。 BQ 中有哪些 OLAP 功能(如果有)以及它们如何使用 最佳答案 BigQuery
背景:我正在分析通话详细记录 (CDR) 数据,以便根据通话时长、通话时间(节假日通话或非节假日通话、商务通话)对客户进行分割或非商务电话)、用户年龄组和性别。数据来自两个表名cdr(包括card_n
我正在尝试在 Snowflake 中重建一个 Cognos Transformer 多维数据集。1. 我们是否可以选择在 Snowflake(如 SSAS、Cognos Transformer)中构建
我正在对一个应用程序进行一些规划,该应用程序使用 Mondrian OLAP 引擎和 Olap4j,并且应该向用户呈现/显示数据。我了解所有后端内容,但我不确定应该如何在 View 层中显示数据。 例
我正在尝试在 Snowflake 中重建一个 Cognos Transformer 多维数据集。1. 我们是否可以选择在 Snowflake(如 SSAS、Cognos Transformer)中构建
我对如何将BI与数据挖掘连接感到困惑。可以将BI称为某种形式的数据挖掘的体现吗? BI分析工具(如Microsoft Analysis Services)与数据挖掘工具(如Weka)有何不同? 我猜想
OrientDB 对更高级结构(例如立方体单元、维度、OLAP/BI)的支持情况如何?分析函数/窗口函数?这些在高端数据库(Oracle、MSSQL、Postgres)中很常见。谢谢。 最佳答案 我也
我正在 SQL Server Analysis Services 2005 中制作一个多维数据集,并且有一个关于多对多关系的问题。 我有两个实体之间的多对多关系,其中包含一个附加的描述性列作为关系的一
我一直在努力让聚合表发挥作用。这是我的事实表的样子: employment_date_id dimension1_id dimension2_id dimension3_id dimension4 d
我们使用 Azure Analysis Services 来托管我们的多维数据集。我们在通过EXCEL读取数据时遇到了问题。 问题在于总计(和小计)计算不正确。最初,我们在EXCEL中发现了这个问题。
我是新手,找不到如何为这种结构定义维度: invoices:--------idid_companydateinvoices_data:-------------idid_invoiceid_prod
我们不希望在未选择某些强制尺寸时执行后处理器。例如,我们有称为风险类型、敏感曲线、期限、货币 1 和显示货币的维度。我们还有称为 Rate.Move 的后处理措施 - 它实现了 doLeafEvalu
有什么方法可以用它在 HBase 或 OLAP 中创建 CUBE DIMENSIONS 吗?我想使用我的 HBASE 或 HIVE 创建 CUBE DIMENSIONS 类型的应用程序并将其与 SSA
首先,我对 OLAP 一点都不熟悉,所以如果术语不正确,请随时提供更正。 我正在阅读有关 OLAP 的文章,它似乎完全是关于以空间换取速度,您可以在其中预先计算(或按需计算)并存储有关数据的聚合,并以
一些背景知识,我们有一个 OLAP 系统,长期以来一直愉快地为客户处理它的多维数据集。然后最近它开始失败。这与主要开发人员意外结婚并使自己无法联系在一起。所以显然我不能去纠缠他。 我们有一个在年、月、
我有一个用于销售的多维 OLAP 多维数据集。但是我有一个巨大的数据库。首先我完成了 olap 多维数据集的完整处理。但是每次它都会完成,所以需要很多时间。我必须进行增量处理。但我没有这个主题有任何过
我是一名优秀的程序员,十分优秀!