【发布时间】:2009-08-06 14:06:49
【问题描述】:
我有一个 Java Web 应用程序,它从表中选择一列(有 600 万行),它需要大量的 CPU 时间。在查询浏览器中执行时,此选择 (SELECT id FROM mytable WHERE filename = 'unique_filename') 花费的时间明显减少。
是什么原因造成的?
我应该从哪里开始寻找瓶颈?
数据库是 MSSQL 2005 标准
Java 容器是 Tomcat 5.5(带有 sqljdbc 1.2)
更多详情:
1.Java代码
ResultSet rs = null;
PreparedStatement stmt = null;
Connection conn = null;
Integer myId=null;
String myVeryUniqueFileName = strFromSomeWhere;
try
{
conn = Database.getConnection();
stmt = conn.prepareStatement("SELECT id FROM mytable WHERE filename = ?");
stmt.setString(1, myVeryUniqueFileName);
rs = stmt.executeQuery();
if (rs.next())
{
myId= new Integer(rs.getInt(1));
} }
if (rs.next())
{
throw new DBException("Duplicate myId: " + myId);
}
return myId;
} catch (Exception e) {
// handle this
}
Database 对象使用 DriverManager 接收连接对象。
2.SQL表大约有30列。
CREATE TABLE [dbo].[calls](
[id] [int] NOT NULL,
...
[filename] [varchar](50) NOT NULL,
...
CONSTRAINT [PK_xxxxxxxxxxxx] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY],
CONSTRAINT [UQ_xxxxxxxxxxxx] UNIQUE NONCLUSTERED
(
[filename] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
filename 列是唯一的,因此结果集始终为 1 或 null。
【问题讨论】:
-
当您说 CPU 时间时,您是指 Java 应用程序使用的 CPU 还是数据库服务器使用的 CPU?它们在两台不同的机器上吗?
-
Tomcat 和 MSSQL 在同一台服务器上?您的 Java 应用程序将这 600 万个 ID 值存储在哪些对象中? Java 和 .NET 需要时间来创建和销毁内存中的每个对象,如果需要创建 600 万个对象,则需要大量时间。
-
这不是一个真正的问题吗?当然,它不是很详细,但 OP 仍然可以解决这个问题。
-
Mark Canlas:CPU 时间是指在 SQL Profiler 中测量的时间与使用 SET STATISTICS TIME ON 的查询浏览器测量的时间。 Bogdan_Ch:Tomcat 和 MSSQL 服务器不在同一台服务器上。我不需要存储所有 600 万个 ID 值,我只需要存储一个 id 值。