[英]Query runs faster in SQL Server than via ADO.NET command being sent
所以我在我的 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 並將其帶回來還是什么? 如果這是問題,您如何加快速度? 它在數據庫中的瞬間,我運行該查詢,這是一個毫秒的結果計時。
更新:
更多信息; 表中的字段類型是 SQL Sever 中該 BLOB 的類型 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);
}
選擇錯了。 不要使用 string.Format 並將WHERE t.customerID = @{0}
更改為WHERE t.customerID = @customerID
。
現在注釋掉photo.LoadFromDataReader(reader);
並運行您的測試。 如果時間接近管理工作室的時間,那么問題出在您的 LoadFromDataReader 方法中。
您正在返回圖像的 blob。 SSMS 實際上並未獲取所有數據 - 它會截斷[n][text]
、 [n][varchar](max)
、 image
和varbinary(max)
,因為您通常不會直接使用這些結果。 因此,這聽起來像是帶寬問題。 檢查 blob 的大小 - 如果它非常大,這很可能。
異常表現的其他可能性:
SET
選項另外 - 關於string.Format
的評論是正確的; 它不會對你造成任何傷害,但它也沒有任何有用的目的。 就個人而言,我只是將@customerID
直接寫入查詢中。 否則它就像string.Format("this and {0}", "that")
- 你也可以只使用"this and that"
。
也可能是在客戶端處理圖像很慢。 為了將其作為直接比較,您只需將數據作為(例如) byte[]
。 您的 SSMS 比較不會將數據處理為Photo
對象。 這可能是因為這是緩慢的操作,所以我會簡介photo.LoadFromDataReader(reader)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.