我使用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数据库设计(最佳实践)?
不幸的是,跟踪日志是很长的附加方式!
感谢您的帮助!