列式数据库优化与关系数据库优化有何不同?
How does columnar database optimization differ from relational database optimization?
我有以下数据库结构,存储在关系数据库中:
- 两个事实 table,每个事实约 8000 万行
- 三维 table 具有 300,000 - 500,000 行
- 两个事实 tables 都有 3 个外键用于连接维度 tables
- 一个证券table也有3个外键用于连接维度tables
一位开发人员正在使用我的数据创建一个使用列式数据库的应用程序。他们一直存在性能问题,当我建议向他们的 table 添加索引/键时,他们说索引列式数据库不会提高性能。因此,他们要求我将 tables 与维度 tables.
结合起来
这似乎与我所了解的数据库管理基本原则相矛盾。列式数据库真的不能使用索引来提高性能吗?应采取哪些步骤来优化柱性能?
求高阶资料,为了完整起见,关系型数据库是Teradata,列式数据库是SAP HANA
我不太熟悉 SAP HANA,但一般来说,列存储数据库没有传统关系意义上的索引。相反,每一列都像一个单独的索引。
这种类型的数据库通常适用于分析查询,因为它们通常会读取大量数据。以任何事实 table 为例,其中一个维度的外键之一传统上会有很多重复值(假设维度在行方面比事实 tables 小得多).
如果行被插入 table 按(除其他外)此列排序的事实中,您可能会在 table 中实现出色的压缩级别,因此需要的数量会少很多I/O 从磁盘读取 table.
即:col_fk_to_dim = [1,1,1,1,1,2,2,2,3,3,3,3,3,3,4,5,5,5, 5,5 ...]
可以压缩为 [1x5, 2x3, 3x6, 4x1,5x5, ...]
此外,如果系统分布在几个节点上,您需要考虑分布键以确保每个节点都有相似的数据份额要处理。
如果您遇到性能问题,我首先要检查的是您针对 table 发起的查询。接下来检查它们正在连接的列,看看 table 是否按这些列的排序顺序填充。
您可以从那里进一步排除故障。
关于索引不提供在 SAP HANA 中提高性能的选项的一般说法是不正确的。有明确的案例表明索引何时可以将数据访问提高几个数量级。
与数据库性能一样,需要更多的信息,而不仅仅是“有问题”才能找到性能低下的原因。 SAP HANA 提供了一些特定的开发工件(分析视图和带有星型连接的计算视图)来支持 FACT-DIMENSION 模型查询。
如果这些已被使用,那么下一步将审查 执行计划 的慢速查询。
如果这不能导致提高性能的方法,那么使用 PlanViz 执行跟踪将是下一个最佳选择。这允许查看查询执行的哪一部分实际花费了多少时间。
这就是高级语句可以带您到这里的程度。除此之外的任何内容都需要查看提到的信息和相关查询。
在较高的层次上,关系数据库和列式数据库之间的区别在于数据的存储方式。关系数据库按行存储记录,按列存储记录。
例如:
记录:
Name ID number zip code
smith 4444 98210
jones 1234 10125
RDBMS 按记录存储此块:smith, 4444, 98210
和 jones, 1234, 10125
列式数据库按列将其存储在块中:smith, jones
和 4444, 1234
和 98210, 10125
您可以创建索引。在 HANA 中有 UNIQUE、BTREE、CPBTREE 索引。唯一值上的唯一索引——就像 RDBMS 中的主键一样,BTree 是一个二叉搜索树索引,而 CPBTREE 是压缩前缀 B+ 树索引。
但是,在创建希望修复的索引之前评估性能问题很重要。查看日志,分析数据库并找出导致性能下降的原因。评论 "a developer is using my data to create an application that uses a columnar database" 可能是问题的症结所在。每种数据库类型中存储和检索数据的方式完全不同。 RDBMS 更适合事务性数据。因此,如果这个应用程序利用了列式数据库,那么它更适合在大量数据中高效地搜索特定数据——因为只需要加载受影响的列,而不是整个记录。
由于数据库结构不同,此应用程序可能无法 运行 正确。
我有以下数据库结构,存储在关系数据库中:
- 两个事实 table,每个事实约 8000 万行
- 三维 table 具有 300,000 - 500,000 行
- 两个事实 tables 都有 3 个外键用于连接维度 tables
- 一个证券table也有3个外键用于连接维度tables
一位开发人员正在使用我的数据创建一个使用列式数据库的应用程序。他们一直存在性能问题,当我建议向他们的 table 添加索引/键时,他们说索引列式数据库不会提高性能。因此,他们要求我将 tables 与维度 tables.
结合起来这似乎与我所了解的数据库管理基本原则相矛盾。列式数据库真的不能使用索引来提高性能吗?应采取哪些步骤来优化柱性能?
求高阶资料,为了完整起见,关系型数据库是Teradata,列式数据库是SAP HANA
我不太熟悉 SAP HANA,但一般来说,列存储数据库没有传统关系意义上的索引。相反,每一列都像一个单独的索引。
这种类型的数据库通常适用于分析查询,因为它们通常会读取大量数据。以任何事实 table 为例,其中一个维度的外键之一传统上会有很多重复值(假设维度在行方面比事实 tables 小得多).
如果行被插入 table 按(除其他外)此列排序的事实中,您可能会在 table 中实现出色的压缩级别,因此需要的数量会少很多I/O 从磁盘读取 table.
即:col_fk_to_dim = [1,1,1,1,1,2,2,2,3,3,3,3,3,3,4,5,5,5, 5,5 ...]
可以压缩为 [1x5, 2x3, 3x6, 4x1,5x5, ...]
此外,如果系统分布在几个节点上,您需要考虑分布键以确保每个节点都有相似的数据份额要处理。
如果您遇到性能问题,我首先要检查的是您针对 table 发起的查询。接下来检查它们正在连接的列,看看 table 是否按这些列的排序顺序填充。
您可以从那里进一步排除故障。
关于索引不提供在 SAP HANA 中提高性能的选项的一般说法是不正确的。有明确的案例表明索引何时可以将数据访问提高几个数量级。
与数据库性能一样,需要更多的信息,而不仅仅是“有问题”才能找到性能低下的原因。 SAP HANA 提供了一些特定的开发工件(分析视图和带有星型连接的计算视图)来支持 FACT-DIMENSION 模型查询。 如果这些已被使用,那么下一步将审查 执行计划 的慢速查询。
如果这不能导致提高性能的方法,那么使用 PlanViz 执行跟踪将是下一个最佳选择。这允许查看查询执行的哪一部分实际花费了多少时间。
这就是高级语句可以带您到这里的程度。除此之外的任何内容都需要查看提到的信息和相关查询。
在较高的层次上,关系数据库和列式数据库之间的区别在于数据的存储方式。关系数据库按行存储记录,按列存储记录。
例如: 记录:
Name ID number zip code
smith 4444 98210
jones 1234 10125
RDBMS 按记录存储此块:smith, 4444, 98210
和 jones, 1234, 10125
列式数据库按列将其存储在块中:smith, jones
和 4444, 1234
和 98210, 10125
您可以创建索引。在 HANA 中有 UNIQUE、BTREE、CPBTREE 索引。唯一值上的唯一索引——就像 RDBMS 中的主键一样,BTree 是一个二叉搜索树索引,而 CPBTREE 是压缩前缀 B+ 树索引。
但是,在创建希望修复的索引之前评估性能问题很重要。查看日志,分析数据库并找出导致性能下降的原因。评论 "a developer is using my data to create an application that uses a columnar database" 可能是问题的症结所在。每种数据库类型中存储和检索数据的方式完全不同。 RDBMS 更适合事务性数据。因此,如果这个应用程序利用了列式数据库,那么它更适合在大量数据中高效地搜索特定数据——因为只需要加载受影响的列,而不是整个记录。
由于数据库结构不同,此应用程序可能无法 运行 正确。