优化搜索查询的一种可能方法是(a)将保留与不同关系/表对应的数据的记录存储在(b)相同文件→相同页面上。这样,可以更快地执行连接。
我用谷歌搜索了“共同聚类”,结果出人意料地很少。例如,我在 MySQL 上一无所获。有迹象表明甲骨文在 10 年前就提供了它。联合集群仍然是优化的有效选择吗?
例如,您有两个关系/表:
Employee (id, name, age, did)
Department (did, location)
您优化的典型查询可能如下所示:
SELECT E.name,
E.age
FROM Employee E,
Department D
WHERE E.age = 25
AND E.did = D.did;
如果您有 1,000,000 名员工并且他们都在 25 到 27 之间,那么最好的连接方法可能是排序合并连接或哈希连接 - 两者都需要多次扫描。
现在,如果您将多个关系/表的元组/行存储在同一页面上,您可以使用一种物理结构,将具有某个特定的部门与did
具有相同的员工一起存储did
。请注意,这种连接需要更少的 IO。
当然,如果您的 DBMS 提供它,它是一个有效的优化选项。正如 David Browne 在评论中提到的那样,只有 Oracle 这样做(在某种程度上,它告诉你这个特性有多实用)。
正如您所指出的,它在非常有限的场景中很有用,但不利于更广泛的查询。在可能从表共集群中受益的情况下,您可以采用替代优化技术,例如物化(索引)视图或按列组织的表,它们提供类似的性能优势,同时更广泛可用。
还要考虑到今天 SSD 存储的普遍使用、数据库服务器上大量廉价 RAM 以及更好的查询优化器,以可能的负面影响和额外的数据库维护开销为代价,降低了物理 I/O 边际减少的价值。
TLDR:不要打扰。