none
アプリケーションからSQLServerにアクセスすると特定のテーブルだけ遅い RRS feed

  • 質問

  • お世話になります。

    現在VisualStudio2012、.NetFramework4.5、SQLServer2014Expressの環境にてWindowsFormアプリを作成しているのですが、

    ある1つのテーブルだけselectのレスポンスが遅い現象が発生しています。

    ManageMentStudioから同様のselect文を実行した場合には問題ないようでした。


    該当テーブルの構造ですが、numeric(5,0)型のカラムを主キー、他にカラム数が30ほどのテーブルなのですが、

    600件程度のデータから主キーで1件を取得する際に1秒程かかってしまっています。

    同様の構造の他のテーブル(1000件程度)から同様に取得する場合は、コンマ数秒の瞬間で取得できます。

    EntityFrameWorkを使用して以下の様なコードでアクセスしています。

    using(var context = new DBEntity())
    {
        var data = context.Table1.Where(t => t.Col1 == 1).FirstOrDefault();
    }
    1回目のアクセスのため遅いようではなく、複数回のアクセスでも同様の速度でした。

    また、該当の処理をSqlDataAdapterを使用してADOでのアクセスも試してみたのですが変わらないようでした。


    SelectではなくAnyの場合だとレスポンスに問題はないようでした。

    using(var context = new DBEntity())
    {
        bool exists = context.Table1.Any(t => t.Col1 == 1);
    }

    何かチェックポイント等ございましたらお教え頂けないでしょうか。

    よろしくお願い致します。

    2015年6月11日 0:45

すべての返信

  • どのように時間を計測しているのか、具体的に書いていただけませんか?
    2015年6月11日 0:58
  • ご回答有難うございます。

    以下の様に計測していました。

    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
    sw.Start();
    using(var context = new DBEntity())
    {
        var data = context.Table1.Where(t => t.Col1 == 1).FirstOrDefault();
    }
    sw.Stop();
    MessageBox.Show(sw.Elapsed.ToString());
    

    よろしくお願い致します。

    2015年6月11日 1:09
  • SQL Server Profiler は Express 版だから使えないということなんでしょうか?
    2015年6月11日 1:58
  • こんにちは。

    EntityFrameworkとADOで遅くて、SSMSでは早いのですよね。

    1レコードの残り30カラムに問題がある可能性は無いでしょうか。
    取得項目をSelectで絞った場合はどうですか、遅いでしょうか。

    2015年6月11日 2:13
    モデレータ
  • ご回答有難うございます。

    > SurferOnWwwさん

    トレースしてみたところ、以下の様に、Select自体のレスポンスは問題ないようでした。

    ◯1行目
    【EventClass】
    Audit Login    -- network protocol: TCP/IP

    【TextData】
    set quoted_identifier on
    set arithabort off
    set numeric_roundabort off
    set ansi_warnings on
    set ansi_padding on
    set ansi_nulls on
    set concat_null_yields_null on
    set cursor_close_on_commit off
    set implicit_transactions off
    set language 日本語
    set dateformat ymd
    set datefirst 7
    set transaction isolation level read committed

    【StartTime】
    2015-06-11 11:19:22.953

    ◯2行目
    【EventClass】
    RPC:Completed

    【TextData】
    exec sp_executesql N'SELECT TOP (1)
    1 AS [C1],
    [Extent1].[Col1] AS [Col1],
    [Extent1].[Col2] AS [Col2],
    ・・・
    FROM    [dbo].[Table1] AS [Extent1]
    WHERE [Extent1].[Col1] = @p__linq__0',N'@p__linq__0 decimal(1,0)',@p__linq__0=1    

    【StartTime】
    2015-06-11 11:19:22.950
    【EndTime】
    2015-06-11 11:19:22.950


    > Tak1waさん

    selectのカラム数を絞ったところ問題ない速度になったため、残りのカラムに問題がありそうです。

    実装中の処理では、全カラムの内容が必要なのですが、

    全カラムを取得した場合の速度低下を防ぐ方法は無いのでしょうか?

    nvarchar(50) NULL許可

    varchar(1~10) NULL許可

    numeric(9,0) NULL許可

    のカラムが合計で30程度あります。


    よろしくお願い致します。

    2015年6月11日 2:42
  • ハズレかもしれませんが、Read部分がネックになっているような気がします。
    #これくらいのカラムでネックになるのか怪しいですが…

    ADO.NETやEFへの理解が浅く、すぐ回答出来ないのですが、
    OracleであればFetchSizeというのがありました。

    少し調べてみます。

    (追記)
    特定のカラムのみ遅くなりますか。
    それともカラム数に比例して速度が遅くなる感じでしょうか。

    また、今回だと1行のレコードに絞り込むと思うのですが、どのレコードでも速度は同じでしょうか。
    データの内容によっては速くなりますか。
    2015年6月11日 2:57
    モデレータ
  • お手持ちのSQL Server Management Studioで実行プランが確認できますか? もし確認できるなら、遅くなる場合とそうでない場合とを比較してみて下さい。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年6月11日 5:04
    モデレータ
  • ご回答、ご調査いただきありがとうございます。

    全てのカラムを5カラムづつに分けてselectしてみたところ速度は特に差はないようでしたので、

    カラム数に比例して速度が遅くなっているような感じです。

    また、主キー以外全てnullのレコードと、全項目フル桁をセットしたレコードで試してみたのですが、

    こちらも速度が変わらないようでしたので、どのレコードでも同様の速度のように思われます。

    よろしくお願い致します。

    2015年6月11日 5:06
  • kureru2000さんこんにちは。

    SSMSで速度が出ている場合、テーブル名またはカラム名に予約語が含まれていませんか?

    2015年7月9日 1:52