Dav*_*ili 5 java sql-server jdbc
我在sql server上的JDBC Delete语句中遇到性能问题.表Config包含大约700万行,表详细信息:
列:
索引:TERMINAL_ID和ATTRIBUTE上的 群集唯一索引
代码看起来像这样,其中属性长度为1500,并且该程序需要大约1小时才能完成,这对于删除来说非常慢:
PreparedStatement statement = null;
String sql = "DELETE FROM Config WHERE TERMINAL_ID = ? AND ATTRIBUTE = ?");
for (String attribute : attributes) {
if (statement == null) {
statement = connection.prepareStatement(sqlDelete);
}
statement.setString(1, terminalId);
statement.setString(2, attribute);
statement.executeUpdate();
}
Run Code Online (Sandbox Code Playgroud)
当我在Management Studio中运行此查询1500次时,只需几秒钟即可删除.执行计划如下所示:
当行数很小时,问题就会消失.
当我使用createStatement而不是prepareStatement时,问题就出现了.
任何的想法 ?
我已经找到问题并解决了。问题出在方法preparedStatement.setString()中,该方法生成不同的查询并且执行计划不同。
我打开了运行查询的 SQL Server 活动监视器
从配置中删除,其中 TERMINAL_ID = @P0 且属性 = @P1
所以我右键单击查询并打开执行计划,如下所示:

正如我猜测的那样,SQL Server 正在为每一行调用 CONVERT_IMPLICIT 函数,并且正在聚集索引中进行扫描。这个软件是第三方的,所以我不得不将列更改为 nvarchar,问题就消失了。
| 归档时间: |
|
| 查看次数: |
1373 次 |
| 最近记录: |