MonetDB查询性能 - 多表连接与单表谓词选择

时间:2015-05-26 18:00:19

标签: performance query-performance monetdb

我使用MonetDB执行IR-Tasks,我遇到了以下我不完全理解的问题!

在这个设置中,我创建了两个非常简单的表。

字典表:(3 267 008元组)

CREATE TABLE "ir"."dict" (
    "tid"  INTEGER       NOT NULL,
    "term" VARCHAR(100),
    CONSTRAINT "pk_dict" PRIMARY KEY ("tid")
);

字典历史表:(113 574 247元组)

CREATE TABLE "ir"."dict_histu" (
    "tid"     INTEGER,
    "added"   TIMESTAMP,
    "removed" TIMESTAMP,
    "df"      INTEGER,
    CONSTRAINT "fk_dict_histu" FOREIGN KEY ("tid") REFERENCES "ir"."dict" ("tid")
);

并执行以下查询。

查询1:

SELECT dict_histu.tid, dict_histu.df FROM dict 
    JOIN dict_histu ON dict.tid = dict_histu.tid 
        WHERE dict.tid IN (25,26,27) 
        AND dict_histu.added <= timest 
        AND (dict_histu.removed IS NULL OR dict_histu.removed > timest)
        LIMIT 100;

执行时间(~1,2s)

查询2:

SELECT tid, df FROM dict_histu 
    WHERE dict_histu.added <= %timest% 
    AND (dict_histu.removed is NULL OR dict_histu.removed > %timest%) 
    AND dict_histu.tid IN (25,26,27) 
    LIMIT 100;

执行时间(~4,7s)

直觉上我会假设第二种方法更快 因为只有一个表有关,并且要删除的谓词和候选数量不变。

我的问题:为什么第一个查询的表现优于第二个?幕后发生了什么(文献可用吗?)?这种观察一般如何有助于c-store数据库设计(最佳实践)?

不幸的是,跟踪日志是很长的附加方式!

感谢您的帮助!

0 个答案:

没有答案