Sql Server 2014 的"Hekaton"编译存储过程是否解决了参数探查问题?



SQL Server 2014的"Hekaton"内存表优化宣称,"存储过程中业务逻辑的本地编译"。然而,由于SQL Server 2012及更早版本中的"参数嗅探"(请参阅此处和此处)存在问题,我一直被迫用OPTIMIZE FOR UNKNOWN(或其等效版本)设计大多数存储过程。这有效地防止了查询计划被缓存,并迫使SQL Server在每次运行查询时重新编译/重新优化查询。Hekaton的性能提升很大一部分来自于对本机编译查询的重用,SQL Server 2014是否做了任何事情来解决参数嗅探问题,以便我能够真正使用编译查询?

解释的Transact-SQL存储过程在第一次执行时编译,而本机编译(又名Hekaton)存储过程在创建时编译(因此,查询执行计划在创建时确定)。在调用时编译解释存储过程时,优化器在生成执行计划时会使用为该调用提供的参数值。这种在编译过程中使用参数的行为称为参数嗅探。

参数探查不用于编译本机编译的存储过程。存储过程的所有参数都被认为具有UNKNOWN值。

作为一种解决方法,可以使用OPTIMIZE FOR指示查询优化器在编译过程时为变量/参数使用特定值。

据我所知,当您创建"本机"存储过程时,它将立即编译为本机代码,并且不会通过Query Optimizer。所以我不认为"参数嗅探"问题会成为一个问题。

最新更新