7

所以我在 Visual Studio 2010 中编写了一个查询(我的意思是我打开了服务器资源管理器,右键单击服务器并选择了新查询)。查询包含条件

A AND B AND C AND D AND E AND F AND (G OR H)

这是合取范式(CNF)。当我运行查询(附加到 MSSQL Server 2008)时,它将文本更改为

A AND B AND C AND D AND E AND F AND G OR
A AND B AND C AND D AND E AND F AND H

这是析取范式(DNF)。

从我在网上找到的一点点来看,似乎 DNF 允许 SQL 单独运行连接词并在最后合并它们。

但是,对于这样的事情,有这么多重复的条件,DNF 真的比 CNF 更有优势吗?如果不是,我如何强制优化器按原样接受条件?如果是这样,我应该在我的应用程序代码中以 CNF 形式编写查询,因为它更短更整洁,还是以 DNF 形式编写,因为它可以节省优化器的时间?

4

2 回答 2

2

我不知道 DNF/CNF 在这种情况下的相对优势,甚至不知道如何以这种方式强制优化器。

一般来说,您不想强迫优化器将您的“感知”、“当前”优化超过它将生成的优化(这有例外,但这些通常很少见)。这在很大程度上与“最佳”优化可能会随着时间而改变这一事实有关,这是其他操作(如添加索引)的副作用。如果您强制优化器采用特定的优化,您就是将其锁定在该路径中,即使新的优化器可能会执行得更好。

鉴于此,您应该以最容易阅读和维护 (CNF) 的形式编写查询,并在必要时让优化器更改它 - 这是 SQL 作为声明性语言的全部意义,以允许优化器与必要的事情。

于 2011-07-25T17:01:45.527 回答
0

在我的脑海中,我想知道 G 或 H 上的索引。如果 G 被索引,但 H 不是......也许一个析取词会更有意义。

无论如何,您可以自己运行性能分析器来查看性能的净差异。

除此之外,如果您想深入了解,您可能可以访问以下研究: 研究资料:http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=842265&abstractAccess=no&userType= inst

于 2011-07-25T17:18:45.607 回答