【问题标题】:Fetch metadata on SQL Server 2008 - extremely slow在 SQL Server 2008 上获取元数据 - 速度极慢
【发布时间】:2010-11-18 00:45:36
【问题描述】:

今年早些时候,我们从 SQL Server 2005 迁移到了 2008,升级后我们注意到在 2008 年获取表和视图的元数据以及它们各自的列需要大约 15 分钟,而过去几乎是即时的2005 年。

简而言之,这是需要 15 分钟才能完成的基本 Java 代码,它使我们的服务器利用率接近 100%。架构变量是对包含从该查询返回的信息的内部对象的引用。

Connection con = db.open();
DatabaseMetaData metaData = con.getMetaData();
String types[] = { "TABLE", "VIEW" };
ResultSet resultSet = metaData.getTables(null, null, "%", types);
while (resultSet.next())
{
   schema.addTable(tableName);

   ResultSet columnSet = metaData.getColumns(null, null, tableName, "%");
   while (columnSet.next())
      schema.addColumn(tableName, columnSet.getString(4));
   columnSet.close();
}
resultSet.close();

我们在谷歌上搜索了很多关于这个问题的信息,似乎 2008 R2 版本应该解决一些模式加载性能问题。除了支付昂贵的升级费用,还有其他人对如何提高此查询的性能有任何好的想法吗?

仅供参考 - 我们正在使用最新的 jTDS 驱动程序。在使用 Microsoft 的 Java 驱动程序时,我们也注意到了类似的性能。

【问题讨论】:

  • 您是否查看过数据库日志以了解它在数据库端做了什么?您还可以让驱动程序准确地输出它正在尝试做的事情吗?
  • 是的,在 DB 端调用 sp_columns 每个表平均需要 0.7 秒。我们有 1,354 个表和视图,大约需要 15.79 分钟。所以 sp_columns 调用是问题所在。我们可以编写自己的存储过程,通过从 INFORMATION_SCHEMA.COLUMNS 中获取来更快地完成这项工作,但是以这种方式调用它的想法是保持我们的产品数据库不可知。如有必要,我们将使用存储过程的路线。

标签: java sql-server-2008 schema metadata performance


【解决方案1】:

请参阅this post 并尝试将 SQL Server 2008 的数据库兼容性级别切换为 100。也许如果您将数据库从 2005 年移至 2008 年,性能损失来自那里。

【讨论】:

    猜你喜欢
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多