2010-11-02 49 views

回答

11

它通常的工作是这样的:

 
    SQL String ---[Optimizer]---> Execution Plan ---[Execution]---> Result 

我个人希望看到优化(查询规划)非常类似的东西编译。它将SQL语句转换成更容易执行的东西。但是,芯片上不是可执行的。这个“编译”相当昂贵 - 就像编译C++代码一样。这是评估不同执行变体的部分;连接顺序,使用哪个索引等等。通过使用绑定参数,尽可能避免这种情况是一种很好的做法。

执行计划,然后由数据库吸收以便执行。但是,该战略已经确定。执行只是在做。这部分是解释执行计划,而不是SQL。

毕竟,这是,在某种程度上,类似于Java或.NET其中汇编接通的源代码转换成可以被更容易地解释的二进制形式。如果我们忽略JIT这个参数,Java程序的执行就是解释这个元代码。


我用这种方式来解释我的free eBook "Use The Index, Luke"using bind parameters for (Oracle) performance利益。

+0

如果我错了,请纠正我的错误:您可能想补充说,Optimizer可以使用缓存来执行计划,这将解释绑定参数的优势。 – bvh 2017-10-28 13:29:08

0

在现代SQL环境中,它是一个分阶段的方法,你在工作流程的一定水平作出决定你是否要重新使用和现有的编译块,或者如果你得到一个更好的计划再次启动各阶段参数的某种组合。

我认为这是关之间(再次)的编译时和执行时间(然后编译成可执行代码)结果的报酬。根据查询的复杂性,如果现有代码的执行时间,因为可预见的最小的资源消耗已经很低应用的给定的参数细节在运行时重新编译可能不值得的努力(例如读取两行并返回)。

由于更高的查询复杂性和估计的资源消耗(涉及许多巨大的表,关键的索引选择,可能的表扫描),统计信息的粒度发挥作用。即如果您有选择性,异常值,范围选择性,平均值。字段大小,物理地图大小等,优化器可能会以不同的参数集得出非常不同的结论。

计算为25联接语句与10个++可变参数的最佳方案可能需要时间和资源。如果结果比一对多的版本更快更高效,那么这是值得的。特别是它给定的一组参数可能包含游戏更换器,并且查询将被频繁地重新执行。

最后,您的里程可能会因供应商而异;)