Dapper.netの奇妙なタイムアウトの問題

dapper database-performance sql

質問

パフォーマンスの理由からdapper.netを使い始めました.LINQ To SQLで "ExecuteQuery"を実行するのと比べて、名前付きパラメータ機能が本当に好きです。

ほとんどのクエリでうまく動作しますが、時々、本当に奇妙なタイムアウトが発生します。最も奇妙なことは、このタイムアウトは、SQLがdapperを介して実行されている場合にのみ発生することです。私が実行されたクエリをプロファイラからコピーして、それをManagement Studioで実行すると、その高速で完璧に動作します。そしてそれは単なる一時的な問題ではありません。クエリは常に一貫してタイムアウトし、一貫してManagement Studioで正常に動作します。

exec sp_executesql N'SELECT Item.Name,dbo.PlatformTextAndUrlName(Item.ItemId) As PlatformString,dbo.MetaString(Item.ItemId) As MetaTagString, Item.StartPageRank,Item.ItemRecentViewCount
                    NAME_SRCH.RANK as NameRank,
                    DESC_SRCH.RANK As DescRank, 
                    ALIAS_SRCH.RANK as AliasRank, 
                    Item.itemrecentviewcount,
                    (COALESCE(ALIAS_SRCH.RANK, 0)) + (COALESCE(NAME_SRCH.RANK, 0)) + (COALESCE(DESC_SRCH.RANK, 0) / 20) + Item.itemrecentviewcount / 4 + ((CASE WHEN altrank > 60 THEN 60 ELSE altrank END) * 4) As SuperRank
                    FROM dbo.Item
                    INNER JOIN dbo.License on Item.LicenseId = License.LicenseId

                    LEFT JOIN dbo.Icon on Item.ItemId = Icon.ItemId
                    LEFT OUTER JOIN FREETEXTTABLE(dbo.Item, name, @SearchString) NAME_SRCH ON
                    Item.ItemId = NAME_SRCH.[KEY] 
                    LEFT OUTER JOIN FREETEXTTABLE(dbo.Item, namealiases, @SearchString) ALIAS_SRCH ON
                    Item.ItemId = ALIAS_SRCH.[KEY] 
                    INNER JOIN FREETEXTTABLE(dbo.Item, *, @SearchString) DESC_SRCH ON
                    Item.ItemId = DESC_SRCH.[KEY]
                    ORDER BY SuperRank DESC OFFSET @Skip ROWS FETCH NEXT @Count ROWS ONLY',N'@Count int,@SearchString nvarchar(4000),@Skip int',@Count=12,@SearchString=N'box,com',@Skip=0

それは私がSQLプロファイラから貼り付けたコピーのクエリです。私はこれを私のコードで実行します。

            using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Conn"].ToString())) {
            connection.Open();
            var items = connection.Query<MainItemForList>(query, new { SearchString = searchString, PlatformId = platformId, _LicenseFilter = licenseFilter, Skip = skip, Count = count }, buffered: false);
            return items.ToList();
        }

どこから始めたらいいのかわかりません。私はちょうどコードを実行するときにうまく動作するので、何かがあってはならないと思います。

あなたがこのスクリーンショットで見ることができるように。これは、最初にコード経由で実行され、次にManagement Studioを経由して実行される同じクエリです。

ここに画像の説明を入力

私はまた、これが(私は)2つ以上の単語を持っているときや私は検索文字列に "停止"の文字を持っているときに発生することを追加することができます。だから、完全なテキスト検索で何かがあるかもしれませんが、それは完全にManagement Studioから動作するので、デバッグする方法を理解できません。

さらに問題を悪化させるために、コードとManagement Studioの両方からほぼ同じデータベースを使用してローカルホスト上で正常に動作します。

受け入れられた回答

DapperはADO.NET上のユーティリティラッパーにすぎません。 ADSLの運用方法は変わりません。ここでの問題は「ssmsで動作し、ado.netで失敗する」ということが私には聞こえる。これはユニークではありません。これは時々これを見つけるのがかなり一般的です。候補者候補:

  • "set"オプション:これらはado.netのデフォルトが異なります。特に、計算+永続+索引カラムのようなものがあればパフォーマンスに影響を与える可能性があります - "set"オプションが互換性がない場合、したがって、インデックスではなく、テーブルスキャンして再計算します。他の同様のシナリオがあります。
  • システム負荷/トランザクション分離レベル/ブロッキング。 ssmsで何かを実行しても、その瞬間にシステム負荷全体が再現されるわけではありません
  • キャッシュされたクエリプラン:ダフプランがキャッシュされて使用されることがあります。 ssmsから実行すると、通常、新しい計画が強制されます。これは、テストで使用しているパラメータに対して当然に調整されます。すべてのインデックス統計情報などを更新し、「最適化」クエリヒントを追加することを検討してください

人気のある回答

ADOでは、Management Studio無限大のCommandTimeout 30秒の既定値です。 Query <>を呼び出すためのコマンドのタイムアウトを調整します(以下を参照)。

var param = new { SearchString = searchString, PlatformId = platformId, _LicenseFilter = licenseFilter, Skip = skip, Count = count };
var queryTimeoutInSeconds = 120;
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Conn"].ToString()))
{
    connection.Open();
    var items = connection.Query<MainItemForList>(query, param, commandTimeout: queryTimeoutInSeconds, buffered: false);
    return items.ToList();
}

MSDNのSqlCommand.CommandTimeoutプロパティも参照してください。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow