【问题标题】:Java mssql-jdbc: retrieving data slow from table with xml columnJava mssql-jdbc:从带有 xml 列的表中检索数据缓慢
【发布时间】:2019-03-25 10:56:15
【问题描述】:

我在 Sql Server 上有一个中等大小的表,大约 4000 万行。 特别是这个表有一个可能很大的 xml 列。

我在使用 last version of mssql-jdbc 从该表中检索数据时遇到了非常糟糕的性能。 我正在寻找提高 Java 端和数据库端性能的方法。

在 java 端,这是获取数据的相关代码:

String connectionUrl = "jdbc:sqlserver://10.10.10.28:1433;databaseName=MYDB;user=MYUSER;password=MYPWD;selectMethod=direct;sendStringParametersAsUnicode=false;responseBuffering=adaptive;";

String query = "SELECT * FROM MYTABLE WHERE DateTimeField > '2019-03-25 00:00:00.0' AND DateTimeField < '2019-03-25 13:00:00.0'";

try (Connection sourceConnection = DriverManager.getConnection(connectionUrl);
    Statement stmt = sourceConnection.createStatement(SQLServerResultSet.TYPE_SS_SERVER_CURSOR_FORWARD_ONLY, SQLServerResultSet.CONCUR_READ_ONLY)   ) {

    stmt.setFetchSize(100); 
    resultSet = stmt.executeQuery(query);

    while (resultSet.next()) {

        // do something

    }

}

我已经将 fetch size 设置为 100 行,因为我注意到如果我将 fetch size 设置得太大会出现问题,可能是因为 xml 列在网络上发送很重。

有没有人有任何建议来提高在这种情况下获取数据的性能?

【问题讨论】:

  • 在DB端使用索引,有助于提升服务器端的性能。在 Java 方面,您可以使用分页来限制页面大小的数据并获取有限的数据。看看这个:stackoverflow.com/questions/22998281/…
  • 嗨@AliAzim,我正在使用 fetchSize 来指定每次检索的行数。是否足够或我可以使用其他参数?
  • 是的,但是您应该对此进行一些研究。顺便说一句,您可以使用缓存来优化性能,而不是查询数据库表,您可以使用存储过程。

标签: java sql sql-server xml jdbc


【解决方案1】:

由于您的过滤器非常狭窄,因此性能问题很可能是由于缺少索引与列大小。

做一个简单的

Select count(*) from ......

并查看性能。很可能这也会很慢,从而消除 XML 列的问题。

【讨论】:

  • 完成选择计数大约需要 20 分钟。那么您是否建议为 DateTimeField 列创建索引?
  • 是的,通过创建索引并且如果选择性好就可以了。记住行数不影响性能它是访问路径
  • 这是一篇关于#rows 本身会影响性能的误解的一般博客文章。 [链接]saadwmsblog.blogspot.com/2014/05/…
猜你喜欢
  • 2017-12-22
  • 2015-02-28
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
相关资源
最近更新 更多