所以我在Visual Studio 2010中编写了一个查询(我的意思是我打开了服务器资源管理器,右键单击了服务器并选择了New Query)。查询包括条件
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形式,因为它节省了优化器的时间?
答案 0 :(得分:2)
我不知道DNF / CNF在这种情况下的相对优势,甚至不知道如何以这种方式强制优化器。
一般来说,您不希望强制优化器对您将生成的优化器进行“感知”,“当前”优化(对此有例外,但这些通常很少见)。这主要与“最佳”优化可能随时间变化这一事实有关,这是其他行为的副作用(如添加索引)。如果您强制优化器采用特定优化,则将其锁定在该路径中,即使新的路径可能表现更好。
鉴于此,您应该以最容易阅读和维护的形式(CNF)编写查询,并让优化器在必要时更改它 - 这就是SQL作为声明性语言,允许优化器根据需要进行处理。
答案 1 :(得分:0)
在我的头顶,我想知道关于G或H的索引。如果G被索引,但H不是......也许一个析取会更有意义。
无论如何,您可以自己运行perfmance分析仪,以查看性能的净差异。
除此之外,如果你想深入研究,你可以进行一些研究:Reserach Material:http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=842265&abstractAccess=no&userType=inst