Jod*_*aka 6 sql visual-studio-2010 sql-server-2008 conjunctive-normal-form
所以我在Visual Studio 2010中编写了一个查询(我的意思是我打开了服务器资源管理器,右键单击了服务器并选择了New Query).查询包括条件
A AND B AND C AND D AND E AND F AND (G OR H)
Run Code Online (Sandbox Code Playgroud)
这是联合正常形式(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
Run Code Online (Sandbox Code Playgroud)
这是析取正常形式(DNF).
从我在网上找到的小东西看来,似乎DNF允许SQL分别运行连接并在最后联合它们.
然而,对于像这样的事情,有这么多重复的条件,DNF实际上是否优于CNF?如果没有,我如何强制优化器按原样处理条件?如果是这样,我应该在我的应用程序代码中以CNF格式编写查询,因为它更短更整洁或以DNF形式,因为它为优化器节省了时间?
我不知道DNF/CNF在这种情况下的相对优势,甚至不知道如何以这种方式强制优化器。
一般来说,您不想强制优化器采用您的“感知”、“当前”优化而不是它将生成的优化(也有例外,但通常很少见)。这很大程度上与以下事实有关:“最佳”优化可能会随着时间的推移而改变,作为其他操作(例如添加索引)的副作用。如果您强制优化器采用特定的优化,则您会将其锁定在该路径中,即使新的优化可能会表现更好。
鉴于此,您应该以最容易阅读和维护的形式(CNF)编写查询,并在必要时让优化器更改它 - 这就是 SQL 作为声明性语言的全部要点,以允许优化器处理必要的事情。