SQL 查询计划序列
SQL query plan sequence
上下文(不是真的有必要回答这个问题)
我们正在尝试针对 SQL 查询优化 SPARQL 的数据结构,并希望避免使用 N-Triples 以外的数据格式对连接操作进行不必要的比较。我们要过滤掉与 result/joins 无关的数据。连接的大小对运行时至关重要,因此我们必须知道 WHERE 子句中的表达式是否在实际连接之前得到评估。推测是真的,但我们需要确定。
tl;dr
什么时候计算 WHERE 子句?标准是否完全指定了这一点,还是留给实施?我阅读了有关使用 ON 子句强制执行它的信息。如果有人可以通过适当的来源引用它,我将不胜感激。
SQL 是一种描述正在生成的 结果 的语言。它没有描述生产它们的具体步骤。也就是说,SQL 不是过程语言。
SQL 引擎的一个非常重要的部分是优化器。这将 SQL 语句变成了一系列步骤,通常最好理解为数据流。这些步骤可能涉及复杂的算法(例如并行内存不足哈希表)或支持结构(例如索引)。即使是简单的 SQL 语句也可以有优化器考虑的许多不同的替代执行计划。
因此,您的问题没有答案,因为 SQL 语句的执行并非专门基于子句。当然,这取决于底层数据库。一些数据库,例如 MySQL 和 MS Access,具有相当简单的优化器,这些优化器通常很容易预测。其他如 Postgres、Oracle、SQL Server、Teradata 和 DB2 具有更复杂的优化器。
此外,我建议,如果您使用联接,请始终使用显式 JOIN
运算符和 ON
子句。
上下文(不是真的有必要回答这个问题)
我们正在尝试针对 SQL 查询优化 SPARQL 的数据结构,并希望避免使用 N-Triples 以外的数据格式对连接操作进行不必要的比较。我们要过滤掉与 result/joins 无关的数据。连接的大小对运行时至关重要,因此我们必须知道 WHERE 子句中的表达式是否在实际连接之前得到评估。推测是真的,但我们需要确定。
tl;dr
什么时候计算 WHERE 子句?标准是否完全指定了这一点,还是留给实施?我阅读了有关使用 ON 子句强制执行它的信息。如果有人可以通过适当的来源引用它,我将不胜感激。
SQL 是一种描述正在生成的 结果 的语言。它没有描述生产它们的具体步骤。也就是说,SQL 不是过程语言。
SQL 引擎的一个非常重要的部分是优化器。这将 SQL 语句变成了一系列步骤,通常最好理解为数据流。这些步骤可能涉及复杂的算法(例如并行内存不足哈希表)或支持结构(例如索引)。即使是简单的 SQL 语句也可以有优化器考虑的许多不同的替代执行计划。
因此,您的问题没有答案,因为 SQL 语句的执行并非专门基于子句。当然,这取决于底层数据库。一些数据库,例如 MySQL 和 MS Access,具有相当简单的优化器,这些优化器通常很容易预测。其他如 Postgres、Oracle、SQL Server、Teradata 和 DB2 具有更复杂的优化器。
此外,我建议,如果您使用联接,请始终使用显式 JOIN
运算符和 ON
子句。