1

したがって、DLのCRUDメソッドには、写真のブロブを戻す次のものがあります。

    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;
                    }
                }
            }

これは、ManagementStudioから直接実行する場合よりも約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)

読者がブロブを読んでそれを戻すのに時間がかかるからなのか、それとも何なのかわかりません。それが問題である場合、これをどのようにスピードアップしますか?DBでその瞬間、私はそのクエリを実行し、それはミリ秒の結果タイミングです。

アップデート:

より詳しい情報; テーブルのフィールドタイプは、そのBLOBのSQLサーバーのタイプ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);
}
4

2 に答える 2

1

選択が間違っています。string.Formatを使用せず、に変更 WHERE t.customerID = @{0}WHERE t.customerID = @customerIDます。

次に、コメントアウトしてphoto.LoadFromDataReader(reader);テストを実行します。時間がManagementStudioに近い場合、問題はLoadFromDataReaderメソッドにあります。

于 2012-11-08T06:07:41.723 に答える
1

画像のブロブを返しています。SSMSは、実際にはすべてのデータを取得するわけではありません。通常、これらの結果を直接使用しないため、、、、およびの大きな値[n][text]を切り捨てます。したがって、これは帯域幅の問題のようです。ブロブのサイズを確認してください-それがめちゃくちゃ大きい場合、これは可能性があります。[n][varchar](max)imagevarbinary(max)

異常なパフォーマンスのその他の可能性:

  • 異なる分離レベル
  • さまざまなSETオプション
  • パラメータスニッフィング

また、-についてのコメントstring.Formatは正しいです。はありませんが、有用な目的も果たしていません。@customerID個人的には、クエリに直接書き込むだけです。それ以外の場合は次のようになりstring.Format("this and {0}", "that")ます-を使用する方がよいでしょう"this and that"

また、クライアントでの画像の処理が遅い可能性もあります。これを直接比較するには、データを(たとえば)aとして取得する必要がありますbyte[]。SSMSの比較では、データはPhotoオブジェクトに処理されません。これは遅い操作である可能性があるので、プロファイルを作成しますphoto.LoadFromDataReader(reader)

于 2012-11-08T07:22:45.903 に答える