【发布时间】:2018-06-15 14:29:03
【问题描述】:
我正在处理三部分数据路径:客户端应用程序、主机集成服务器、数据库服务器。客户端应用程序(MS Mashup Engine)正在生成通过 MS SQL Server 传递到旧版 IBM iSeries DB 后端的查询。
我遇到了客户端生成类似查询的问题
select * from x where numericValue = 1.46510+003
我正在 SQL Server 上检查这些的执行计划,它们会导致完整的数据加载,比较发生在 SQL Server(充当主机集成服务器)上。
相比之下,人工生成的查询
select * from x where numericValue = 1465.1
无需扫描,性能提高两个数量级。
我曾尝试使用客户端应用程序来强制它生成类似于人类生成的查询的内容,但我没有运气。
我不确定是否可以通过使用列数据类型来调整 SQL Server 中查询计划的生成方式。 IE。使用显式定义的数据类型公开后端数据库的视图。或者以其他方式强制生成查询计划?
有什么想法吗?
【问题讨论】:
-
动态 SQL 更有可能有各种动态执行计划。您可以尝试将您的逻辑放入一个存储过程中,该过程(通常)将有计划重用并从那里开始。
-
这将是有问题的,除非您可以强制使用正确的数字文字。 SQL Server 会将浮点文字解释为实数或浮点数据类型,它具有higher data type precedence than numeric。因此,即使列上存在索引,也需要进行全面扫描。
-
@sniperd 我不相信 Power Query 可以针对存储过程,因为它会动态生成自己的查询,所以创建一个可以容纳所有可能查询广度的存储过程是有问题的应用程序生成。
-
@DanGuzman 我猜这就是正在发生的事情。我现在的希望是我可以将列显式转换为数字类型,以强制 Power Query 生成不同的本机 SQL。没有那个,......我可能不走运
-
@AlexanderToptygin 您绝对可以从 Power Query 执行存储过程。我必须这样做很多次,我将参数传递给它,然后它传回一个表。
标签: sql-server powerbi powerquery db2-400