【发布时间】: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