【问题标题】:Powerbuilder Embedded / Datawindow SQL generates SQL with wrong datatypesPowerbuilder Embedded / Datawindow SQL 生成带有错误数据类型的 SQL
【发布时间】:2015-02-04 21:28:52
【问题描述】:

我正在使用 powerbuilder 10.2

我有一个简单的选择语句,它从一个有 300 万行的表中返回一个结果。

SELECT SOME_DATA
INTO :ls_data
FROM SOME_TABLE
WHERE PARAM1 = :ls_param
AND PARAM2 = :ls_param2;

当我在应用程序中运行查询时,大约需要 2 秒,但当我在 SSMS 中运行它时,结果会在不到 100 毫秒内返回。当我使用 SQL 分析器捕获从 powerbuilder 应用程序运行的查询时,我有了一个非常有趣的发现:

exec sp_executesql N'SELECT SOME_DATA FROM SOME_TABLE WHERE PARAM1 =@P1 AND PARAM2 =@P2 ',N'@P1 nvarchar(10),@P2 nvarchar(3)',N'112223',N'44252525'

where 子句PARAM1 和PARAM2 被定义为VARCHAR 类型,但powerbuilder 不知何故认为它是NVARCHAR 列。这导致了我们的性能瓶颈。

有没有办法强制 powerbuilder 生成 varchar 类型的 sql 而不是 nvarchar?

编辑:

我尝试在数据存储区中运行上述查询,看看是否有任何不同。它生成几乎相同的查询,但仍然遇到同样的问题。我猜这个问题不仅限于嵌入式 SQL

编辑2:

深入研究这个问题,SQL Server's sp_executesql 只接受 unicode 类型 (ntext,nchar,nvarchar) 作为参数,这就是我假设 powerbuilder 默认为 nvarchar 的原因。所以我想我的问题现在变成了如何防止 powerbuilder 使用 sp_executesql 并使用其他东西,比如 EXECUTE(@SQL)。或者任何其他想法将不胜感激。

【问题讨论】:

    标签: sql sql-server powerbuilder


    【解决方案1】:

    好吧,经过长时间的分析,我终于发现了问题所在。

    tldr; Powerbuilder 错误。好吧,更准确地说,平台的巨大限制。在你的数据库连接字符串中设置 DisableBind=1

    长答案:

    在数据库连接字符串中,有一个称为 DisableBind 的选项可将 SQL 语句中的变量绑定到其支持的数据类型。 Detailed information can be found in the documentation。总之,当 disablebind 设置为 0 时,程序提供的所有带有 WHERE 子句的 SQL 查询都包装在 sp_executesql 中。不幸的是,Powerbuilder 没有一种简洁的方法来确定是否将参数包装为 VARCHAR 或 NVARCHAR,因此如果打开 Unicode 选项,Powerbuilder 在生成 sp_executesql 语句时默认为 NVARCHAR。

    启用 disablebind 选项后,所有查询都将通过 sp_executesql 本地执行,因此不会发生上述问题。不幸的是,对于我们的应用程序,启用此选项会带来一些重大变化,因此我们最终将数据库数据类型从 varchar 更改为 nvarchar 以解决该问题。这将我们应用程序的性能提高了至少 20%,在某些情况下提高了 70% 以上。

    希望这对可能遇到此晦涩问题的其他人有所帮助。或者更好的是,不惜一切代价避免使用 Powerbuilder。这件事就像癌症。我很高兴 SAP 正在慢慢扼杀它。

    【讨论】:

      猜你喜欢
      • 2011-06-28
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      相关资源
      最近更新 更多