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