如何提高MonetDB中单个节点的查询性能?

时间:2017-10-04 07:01:47

标签: database performance monetdb

我已经在Windows 2012 Server上安装了最新的(MonetDB 5服务器v11v.27.5和#34; Jul2017-SP1"),并且我试图查询大表中的14亿行合理的时间2-3s。

MonetDB甚至可以实现这一点吗?我该怎么做才能提高性能?

到目前为止我所做的详细描述:

  1. 创建表:

    CREATE TABLE t939ba ( id INT, xa INT, xb INT, ya INT, yb INT, a1 TINYINT, a2 TINYINT, a3 TINYINT, a4 TINYINT, a5 TINYINT, a6 TINYINT, a7 TINYINT, a8 TINYINT, a9 TINYINT);
    
  2. 加载数据:

    COPY 1450000000 OFFSET 2 RECORDS INTO tbl FROM 'D:\\es_export\\file.csv'
    USING DELIMITERS ',' NULL AS '' LOCKED;
    
  3. 运行查询:

    SELECT COUNT(DISTINCT id) FROM tbl WHERE a1=22
    AND xb>=143455 AND yb>=90911 AND xa<=143615 AND ya<=91007
    AND a2 IN (2, 3, 4) AND a3 IN (0, 1, 2, 3, 4) AND a4 IN (0, 1, 2)
    AND a5 IN (-1, 1, 2, 3, 4, 5, 6, 7) AND a6 IN (-1, 11, 12, 13, 14);
    
  4. 当我第一次运行查询时( 14m 52s ),第二次运行相同的查询( 3m 23s ),第三次连续运行相同的查询花了( 14s )并稍微重新安排了一个查询( 3m 11s )。

2 个答案:

答案 0 :(得分:1)

托马斯

感谢您的计划和追踪。 我看到你使用了带有范围谓词而不是IN谓词的修订查询,而且这个查询现在运行在&#34;仅仅是#34; 〜39 s(与~15 min相比)---或者是因为范围谓词的评估比IN谓词更有效,或者因为正如Martin指出的那样,后来的查询运行会受益于MonetDB自动构建的索引。评估第一个查询,或两者兼而有之。

在任何情况下,不止一次运行/ each查询(-version)是一个好主意,看看自动构建索引的可能影响。

此外,我看到你确实拥有一台34芯机器,或者你的机器只有#34;而且#34;每个核心2 GB RAM - 考虑到你有一个~42 GB的数据集,并不是太多,每个列的大小约为1.5 GB到6 GB ......

因此,查询运行速度不超过~39秒的主要原因可能是I / O活动,因为&#34;缺乏&#34;记忆。

最佳,

的Stefan

PS:
您可以检查是否针对此特定查询,减少(甚至避免)多核并行有助于减少I / O抖动:
禁用MonetDB&#34;有丝分裂&#34;后尝试运行查询优化器使用

set optimizer='no_mitosis_pipe';

您可以使用

重新启用完整的多核并行性
set optimzer='default_pipe';

最佳,
斯蒂芬

答案 1 :(得分:0)

托马斯

总的来说,我认为这应该是可能的。鉴于这些信息很少,为什么不在你的情况下很难说。 你能否分享(部分)以下信息:

  • 硬件特性:CPU(类型,#cores,clockspeed),RAM量,I / O系统类型(单个HDD,HDD RAID,SSD,NVMe ......)

此外,要了解时间的流逝,需要了解MonetDB生成和使用的查询计划,并对查询进行概要分析。

您是否可以生成查询的PLAN(逻辑计划),EXPLAIN(物理计划)和TRACE(执行时间分析)(有关详细信息,请参阅https://www.monetdb.org/Documentation/Manuals/SQLreference/Runtime),并分享它们(如果不是,请通过电子邮件发送) )?

您可以尝试在非Windows(首选Linux)系统上运行吗?我们没有关于Windows性能的最佳体验......

谢谢!

的Stefan

PS:

您还可以尝试稍微修改您的查询,并查看是否有帮助:

SELECT COUNT(DISTINCT id) FROM tbl WHERE
            a1=22
        AND xb>=143455
        AND yb>=90911
        AND xa<=143615
        AND ya<=91007
        AND a2 between 2 and 4
        AND a3 between 0 and 4
        AND a4 between 0 and 2
        AND a5 IN (-1, 1, 2, 3, 4, 5, 6, 7)
        AND a6 IN (-1, 11, 12, 13, 14)
;

甚至

SELECT COUNT(DISTINCT id) FROM tbl WHERE
            a1=22
        AND xb>=143455
        AND yb>=90911
        AND xa<=143615
        AND ya<=91007
        AND a2 between 2 and 4
        AND a3 between 0 and 4
        AND a4 between 0 and 2
        AND (a5 = -1 or a5 between 1 and 7)
        AND (a6 = -1 or a6 between 11 and 14)
;

此外,您是否可以检查并分享以下数据统计信息:

select
        count(*),
        count(id), count(distinct id),
        count(xa), count(distinct xa),
        count(xb), count(distinct xb),
        count(ya), count(distinct ya),
        count(yb), count(distinct yb),
        count(a1), count(distinct a1),
        count(a2), count(distinct a2),
        count(a3), count(distinct a3),
        count(a4), count(distinct a4),
        count(a5), count(distinct a5),
        count(a6), count(distinct a6),
        count(a7), count(distinct a7),
        count(a8), count(distinct a8),
        count(a9), count(distinct a9)
from tbl
;

select count(*) from tbl where a1=22;
select count(*) from tbl where xb>=143455;
select count(*) from tbl where yb>=90911;
select count(*) from tbl where xa<=143615;
select count(*) from tbl where ya<=91007;
select count(*) from tbl where a2 IN (2, 3, 4);
select count(*) from tbl where a3 IN (0, 1, 2, 3, 4);
select count(*) from tbl where a4 IN (0, 1, 2);
select count(*) from tbl where a5 IN (-1, 1, 2, 3, 4, 5, 6, 7);
select count(*) from tbl where a6 IN (-1, 11, 12, 13, 14);