我们的软件部署在他们遇到性能问题的客户站点,他们聘请了一位 SQL 顾问来查看数据库并了解他们的瓶颈在哪里。
顾问发现的一件事是,我们的许多陈述都转换为nvarchar
. 经过一番调查,我发现它是PreparedStatement
这样做的。
给你举个例子:
PreparedStatement query = connection.prepareStatement("SELECT * FROM sys.tables WHERE"
+ " name LIKE ?");
query.setString(1, "%%");
变成
declare @p1 int
set @p1=1
exec sp_prepexec @p1 output,N'@P0 nvarchar(4000)',N'SELECT * FROM sys.tables WHERE name LIKE @P0 ',N'%%'
select @p1
另一方面,adhoc executeQuery 方法只是通过发送 SQL
ResultSet rs = connection.createStatement().executeQuery("SELECT * FROM sys.tables WHERE name LIKE '%%'");
变成
SELECT * FROM sys.tables WHERE name LIKE '%%'
我正在努力解决的是这实际上有多糟糕。准备好的语句在我们的整个应用程序中都使用,因为它们的使用应该比即席查询更有效(如果执行多次)。
此外,我看不出微软的人会在他们的驱动程序中加入一些他们知道会导致性能问题的东西。
这是我们真正应该研究的问题,还是顾问正在寻找根本不存在的问题?