代码之家  ›  专栏  ›  技术社区  ›  ManuelSchneid3r

SQL查询计划序列

  •  0
  • ManuelSchneid3r  · 技术社区  · 9 年前

    上下文 (不需要回答这个问题)
    我们正在尝试在SQL查询上优化SPARQL的数据结构,并希望避免使用N-Triples以外的数据格式对连接操作进行不必要的比较。我们希望过滤掉与结果/联接无关的数据。运行时的关键是联接的大小,因此我们必须知道WHERE子句中的表达式是否在实际联接之前得到求值。假设这是真的,但我们需要确定。

    tl;博士
    WHERE子句何时计算?标准是否完全规定了这一点,还是留给实现?我读到了关于使用ON子句强制它的内容。如果有人能从适当的来源引用这一点,我将不胜感激。

    1 回复  |  直到 9 年前
        1
  •  1
  •   Gordon Linoff    9 年前

    SQL是一种描述 后果 正在生产。它没有描述生产它们的具体步骤。也就是说,SQL不是一种过程语言。

    SQL引擎的一个非常重要的部分是优化器。这将SQL语句转换为一系列步骤,通常最好理解为数据流。这些步骤可能涉及复杂的算法(如并行内存外哈希表)或支持结构(如索引)。即使是简单的SQL语句,优化器也可以考虑许多不同的替代执行计划。

    因此,您的问题没有答案,因为SQL语句的执行不是专门基于子句的。当然,这取决于底层数据库。一些数据库,如MySQL和MS Access,有相当简单的优化器,通常很容易预测。其他如Postgres、Oracle、SQL Server、Teradata和DB2都有更复杂的优化器。

    此外,我建议,如果您使用联接,请始终使用显式 JOIN 操作员和 ON 条款