代码之家  ›  专栏  ›  技术社区  ›  TtT23

Powerbuilder Embedded/Datawindow SQL生成具有错误数据类型的SQL

  •  0
  • TtT23  · 技术社区  · 10 年前

    我正在使用powerbuilder 10.2

    我有一个简单的select语句,它从一个有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生成sql类型 varchar 而不是 nvarchar ?

    编辑:

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

    编辑2:

    深入研究这个问题, SQL Server's sp_executesql 只接受unicode类型(ntext、nchar、nvarchar)作为参数,这就是为什么我假设powerbuilder默认为nvarchar。所以我想我现在的问题是如何防止powerbuilder使用sp_executesql,并使用EXECUTE(@SQL)之类的其他东西。或者任何其他想法都会受到赞赏。

    1 回复  |  直到 10 年前
        1
  •  1
  •   TtT23    10 年前

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

    太长,读不下去了Powerbuilder错误。更准确地说,平台的巨大局限性。在数据库连接字符串中设置DisableBind=1

    长答案:

    在数据库连接字符串中,有一个名为 禁用绑定 将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正在慢慢扼杀它。