最新消息:ww12345678 的部落格重装上线,希望大家继续支持。

[转]Microsoft Dynamics AX中 的ForcePlaceHolders与ForceLiterals关键字

网络文摘 William 3349浏览 0评论

作者:Junevoful

正如我初学AX的时候一样,我相信许多朋友也会遇到与我同样的疑问,很多预留字符根本找不到文档来解释。譬如说,下面这两个SQL 关键字forcePlaceHolders和 forceLiterals,就有许多朋友觉得解释不清。

从浅显一点来说,forcePlaceHolders就等于是解方程题Y=3*X+5,把式子列出来,每次计算的时候,只要代进变量就可以了。而使用forceLiterals的话,就是每次都需要把式子从头到尾列出来,再进行计算。

对于AX来说,就是说,假如你在AX里面指定使用了forcePlaceHolders的话,数据库SQL Server就会将SQL statement编译到执行计划(Execution plan )里面去,然后每次需要执行的时候,再把相应的值代入到SQL statement里面去,也就是说SQL statement里面的Column值都是以参数来代替的(WHERE ((Column1=@P1)),这样的好处就是每次执行类似SQL statement的时候,SQL Server都不需要再重新编译执行计划了,省下了系统开销。

所以我们可见,假如是需要这个SQL Statement需要读取数据库比较多次的话,那么就需要指定forcePlaceHolders。譬如说While select forcePlaceHolders …

另一方面来说,forceLiterals刚好是相反的,SQL Server每次接收到这个SQL Statement的时候,立刻把它编译到执行计划中,并立刻执行。但是就不能被重用,每次都需要重新编译。假如SQL Statement只是执行一次的话,那么使用forceLiterals是会比forcePlaceHolders要划算,因为和数据库通讯只要一个来回,就可以直接执行.

除了数据库执行效率的差异外,这两个关键字还对数据库优化存取有影响,因为优化器会根据SQL Statement的判断条件,进行存储优化.那么在这一点上,forceLiterals要比forcePlaceHolders要有优势,因为数据库会知道具体的判断条件的值,这样优化出来的Query plan会更准确,相比之下,forcePlaceHolders条件下的SQL Statement,Column值都是不清楚的,所以Query plan会在某些情况下不如人意.所以在AX当中,假如是大表之间的联合查询,都会默认使用forceLiterals关键字来进行查找.什么是大表呢,AX认为属于以下几种table group的表都为大数据量的表:Miscellaneous, Main, Transaction, Worksheet Header, Worksheet Line.这也就是为什么table group也是相对比较重要的原因了.

转载请注明:ww12345678 的部落格 | AX Helper » [转]Microsoft Dynamics AX中 的ForcePlaceHolders与ForceLiterals关键字

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址