行存储与列存储

Row Stores vs Column Stores

假设数据库中已经填充了数据,并且以下每个 SQL 语句都是应用程序将执行的唯一查询,为什么最好使用按行或按列- 用于以下查询的明智记录存储?...

1) SELECT * FROM Person

2) SELECT * FROM Person WHERE id=5

3) SELECT AVG(YEAR(DateOfBirth)) FROM Person

4) INSERT INTO Person (ID,DateOfBirth,Name,Surname) VALUES(2e25,’1990-05-01’,’Ute’,’Muller’)

在这些示例中,Person.id 是主键。

文章Row Store and Column Store Databases对此进行了一般性的讨论,但我特别关注上面的四个问题。

我不知道你在问什么。你有这个声明:

INSERT INTO Person (ID, DateOfBirth, Name, Surname) 
    VALUES('2e25', '1990-05-01', 'Ute', 'Muller');

这表明您有一个包含四列的 table,其中一列是一个 ID。每个人都存储在他们自己的列中。

然后您有三个查询。第一个无法优化。第二个是优化的,假设 id 是主键(一个合理的假设)。第三个需要完整的 table 扫描——尽管这可以通过仅在 DateOfBirth.

上建立索引来改善

如果数据已经是这种格式,为什么要更改它?

这是一个非常简单的数据结构。四个查询示例中的三个访问所有列。我看不出您 使用常规行存储 table 结构的原因。

SELECT * FROM ...查询更适合行存储,因为它必须访问大量文件。

列存储适用于对大量日期进行聚合,或者当您的查询只需要来自广泛 table 的几个字段时。

因此:

第一个查询:row-wise

第二次查询:row-wise

第三次查询:column-wise

第 4 个查询:row-wise