sql 不同数据库引擎的调优方式总是一样的吗?

Are sql tuning ways always same for different DB engine?

我用了大半年的Oracle,学习了一些sql调优的技巧,但是现在我们的DB正在迁移到greenplum,项目经理建议我们修改一些用Oracle编写的代码sql 因为他们的效率或语法。

我很好奇 sql 不同数据库引擎的调优方式是否相同,比如 oracle,postgresql,mysql 等等?如果是,为什么?任何欢迎提出建议!

有些喜欢:

  1. 在或存在
  2. count(*)count(column)
  3. 是否使用索引
  4. 使用精确的列而不是 select *

要了解它们为何不同的具体细节,需要有人成为 bother 方面的专家才能比较两者。我并没有声称对 greenplum 了解很多。

我希望所有开发人员随着时间的推移学习的基本原则并没有真正改变。但是有 "quirks" 个单独的引擎会产生特定的差异。根据您的问题,我个人预计 1 和 4 将保持不变。

索引确实有所不同。例如,使用两个索引的能力不是(不是吗?)无处不在。我不想猜测哪个 DBMS 可以/不能计算复合索引中第二个字段的列。索引的维护方式在不同的 DBMS 之间也大不相同。

根据我自己的经验,我还发现了以下原因造成的差异: 数据访问路径中的不同功能。例如,一个优化是让 DBMS 创建一个行位图(匹配和不匹配),将多个位图组合成 select 行。具有此功能的 DBMS 可以在单个查询中使用多个索引。没有它就不行。

提示的可用性/提示的缺乏。并非所有 DBMS 都支持它们。我知道它们在 Oracle 中很常见。

不同的锁定策略。这是一个很大的问题,确实会影响更新和插入查询。

在某些情况下,DBMS 对某些类型的数据具有非常特定的功能,例如地理数据或可搜索的自由文本(自然语言)。在这些情况下,不同 DBMS 处理数据的方式完全不同。

在大多数情况下,所使用的语法将保持不变,一个引擎与另一个引擎之间可能存在细微差异,您可以 运行 进入不同的术语以获得一些更具体的输出或做更复杂的任务。为了实现对等,您需要学习这些新术语。

至于调整,这将因系统而异。特别是从 Oracle 到 Greenplum,您正在考虑从数据库迁移,如果经常通过删除数据索引来提高查询效率。 Greenplum 是一个并行执行系统,通过在多个系统之间有效地分布数据并并行查询它们来提高效率。在 Greenplum 中,索引是一个额外的层,通常不会增加好处,只会增加额外的开销。

即使在单个系统中,使用更改存储引擎类型也会导致以不同的方式优化查询。在实践中,查询通常会转移到一个新平台并运行,但远非最佳,因为它们没有利用该平台的优化。我强烈建议您了解新平台,您不应该假设针对一个平台优化的查询是 运行 在另一个平台上优化的最佳方式。