簡體   English   中英

查詢在 SQL Server 中的運行速度比通過 ADO.NET 命令發送的速度更快

[英]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)imagevarbinary(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM