【发布时间】:2012-11-08 05:12:29
【问题描述】:
所以我在我的 DL 中的 CRUD 方法中有以下内容,它带回了一个照片 blob:
public static MemberPhoto RetrievePhoto(string customerID)
{
Database db = DatabaseFactory.CreateDatabase(Config.DbConnectionString);
using (DbCommand cmd = db.GetSqlStringCommand(string.Format(@" SELECT customerID,
p.Photo as PhotoBlob
FROM
SomeTable t
WHERE
t.PhotoID = (SELECT MAX(t.PhotoID) FROM SomeTable t
WHERE t.customerID = @{0}
GROUP BY t.CustomerID)", "customerID")))
{
try
{
db.AddInParameter(cmd, "@customerID", DbType.String, customerID);
using (IDataReader reader = db.ExecuteReader(cmd))
{
if (reader.Read())
{
Photo photo = new Photo();
photo.LoadFromDataReader(reader);
return photo;
}
}
}
所以它比我直接从管理工作室运行慢大约 10 秒:
SELECT customerID,
t.Photo as PhotoBlob
FROM
SomeTable t
WHERE
t.PhotoID = (SELECT MAX(t.PhotoID) FROM SomeTable t
WHERE t.customerID = '0000900595555'
GROUP BY t.CustomerID)
我不知道是不是因为读者需要一段时间才能阅读 blob 并将其带回来还是什么?如果这是问题,你如何加快速度?它在数据库中的瞬间,我运行该查询,这是一个毫秒的结果计时。
更新:
更多信息;表中的字段类型是该 BLOB 的 SQL Sever 中的 Image 类型。
我还运行了我的单元测试,时间相同,即使在它到达我的 LoadFromReader 之后:
[Test]
public void GetMemberPhoto_ByContractNumber_ReturnsAValidMemberPhoto()
{
// Arrange
const string customerID = "0044664176";
// Act
DTO.MemberPhoto memberPhoto = MemberPhotoCRUD.RetrieveMemberPhotoFromBlob(customerID);
//Assert
Assert.IsNotNull(memberPhoto);
Assert.IsTrue(memberPhoto.CustomerID > 0);
Assert.IsNotNull(memberPhoto.PhotoBinary.Length > 0);
}
【问题讨论】:
-
嗯...这真的不是苹果对苹果的比较。即便如此,您确实应该提供一些信息。 (1) 您的数据库列“照片”的数据类型是什么? (2) 您的测试中返回了多少条记录?
-
自从我做 Max 以来,一直只返回一条记录。当我运行相同的查询时,Management Studio 中的时间为毫秒。
-
这个苹果对橘子怎么样?您在谈论查询,因为查询与以任何方式运行的查询完全相同(来自 .NET 或 SQL Management Studio,它正在运行相同的查询)
-
我指的是直接在数据库上运行查询而不是在代码中进行数据库调用。 10 秒的差异并不典型/正常,但在不知道返回数据的大小和类型的情况下,很难猜测瓶颈在哪里。
-
您是否尝试分析您的数据库以查看数据库中查询所消耗的时间是否有任何差异...?这至少可以排除数据库的问题(或确认确实存在问题)。
标签: c# tsql ado.net database-performance