Axapta中的ForcePlaceHolders与ForceLiterals

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

从浅显一点来说,forcePlaceHolders就等于是解方程题Y=3*X+5,把式子列出来,每次计算的时候,只要代进变量就可以了。而使用forceLiterals的话,就是每次都需要把式子从头到尾列出来,在进行计算。
对于Axapta来说,就是说,假如你在Axapta里面指定使用了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会在某些情况下不如人意.所以在Axapta当中,假如是大表之间的联合查询,都会默认使用forceLiterals关键字来进行查找.什么是大表呢,Axapta认为属于以下几种table group的表都为大数据量的表:Miscellaneous, Main, Transaction, Worksheet Header, Worksheet Line.这也就是为什么table group也是相对比较重要的原因了.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值