Powerbuilder Embedded / Datawindow SQL 生成 SQL 数据类型错误
Powerbuilder Embedded / Datawindow SQL generates SQL with wrong datatypes
我正在使用 powerbuilder 10.2
我有一个简单的 select 语句,其中 returns 一个结果来自 table 300 万行。
SELECT SOME_DATA
INTO :ls_data
FROM SOME_TABLE
WHERE PARAM1 = :ls_param
AND PARAM2 = :ls_param2;
当我在应用程序中 运行 查询时,大约需要 2 秒,但是当我在 SSMS 中 运行 查询时,结果 returns 不到 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) 的东西。或者任何其他想法将不胜感激。
好的,经过长时间的分析,我终于发现了问题。
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 正在慢慢扼杀它。
我正在使用 powerbuilder 10.2
我有一个简单的 select 语句,其中 returns 一个结果来自 table 300 万行。
SELECT SOME_DATA
INTO :ls_data
FROM SOME_TABLE
WHERE PARAM1 = :ls_param
AND PARAM2 = :ls_param2;
当我在应用程序中 运行 查询时,大约需要 2 秒,但是当我在 SSMS 中 运行 查询时,结果 returns 不到 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) 的东西。或者任何其他想法将不胜感激。
好的,经过长时间的分析,我终于发现了问题。
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 正在慢慢扼杀它。