行存储与列存储
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
假设数据库中已经填充了数据,并且以下每个 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