代码之家  ›  专栏  ›  技术社区  ›  TomáÅ¡ Repík

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

  •  3
  • TomáÅ¡ Repík  · 技术社区  · 7 年前

    这在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);
      

    当我第一次运行查询时( 14m 52秒 3m 23秒 ),连续第3次运行同一查询( 14秒 3m 11秒 ).

    2 回复  |  直到 7 年前
        1
  •  1
  •   Stefan Manegold    7 年前

    托马斯,

    谢谢你的计划和跟踪。

    在任何情况下,多次运行每个查询(-版本)都是一个好主意,可以查看自动构建的索引可能产生的影响。

    此外,我发现要么你确实有一台34核的机器,要么你的机器每个核“只有”2 GB RAM——考虑到你有一个约42 GB的数据集,每个列的大小约为1.5 GB到6 GB,这并不算多。。。

    因此,查询运行速度不超过39秒的主要原因可能是内存“不足”导致的I/O活动。

    最好的

    斯特凡

    ps:
    您可以检查对于此特定查询,减少(甚至避免)多核并行是否有助于减少输入/输出抖动:
    使用禁用MonetDB的“有丝分裂”优化器后,尝试运行查询

    set optimizer='no_mitosis_pipe';
    

    您可以使用重新启用全多核并行

    set optimzer='default_pipe';
    

    最好的

        2
  •  0
  •   Stefan Manegold    7 年前

    汤姆,

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

    • 硬件特性:CPU(类型、#内核、时钟速度)、RAM数量、输入/输出系统类型(单硬盘、硬盘RAID、SSD、NVMe等)

    此外,为了理解时间的流逝,需要知道MonetDB生成和使用的查询计划,并分析查询。

    能否生成查询的计划(逻辑计划)、解释(物理计划)和跟踪(执行时间分析)(请参阅 https://www.monetdb.org/Documentation/Manuals/SQLreference/Runtime 详细信息),并分享(如果不在这里,则通过电子邮件)?

    你能试着在非Windows(最好是Linux)系统上运行吗?关于Windows的性能,我们没有最好的体验。。。

    谢谢

    斯特凡

    您还可以尝试按以下方式稍微修改查询,看看这是否有帮助:

    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);