1

SQL Server 2008 R2 からクライアントに約 7Mb のデータをフェッチするには、約 5 秒かかります。マシンは比較的強力な AMD 12 コア、64Gb RAM、Windows Server 2008、2 枚の 10Gbit カードです。サーバーで選択を実行すると、クライアントから実行するよりもさらに遅くなります。そのサーバーからローカル ワークステーションに 7Mb ファイルをコピーするのに約 500 ミリ秒かかります。

ここに小さな再現機があります:

--create test table for reproducer
CREATE TABLE [dbo].[Test_Speed](
    [ED] [datetime] NULL
) ON [PRIMARY]

  --fill test table with data, insert took 3:51 mins
  declare @r int
  set @r = 1
  while (@r < 830000)
  begin 
  insert into [CDB_ODS].[dbo].[Test_Speed] select getdate()
  set @r = @r+1
  end

  --select all records, roughly 7Mb. 4 secs if run on the client, 5 secs on the server (1.4Mb sec)
  select ed from [dbo].[Test_Speed]


  /*
  SELECT on CLIENT
    SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.
Table 'Test_Speed'. Scan count 1, logical reads 1833, physical reads 0, read-ahead reads 0, 
lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 281 ms,  elapsed time = 4020 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.


   --- SELECT on SERVER 
   SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

(829999 row(s) affected)
Table 'Test_Speed'. Scan count 1, logical reads 1833, physical reads 0, read-ahead reads 0,
 lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 328 ms,  elapsed time = 5369 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

   */
4

2 に答える 2

0

はい、これは私には比較的正常に思えます。7M バイトはかなりの量のデータです。

パフォーマンスはクライアントに大きく依存します。もちろん、ネットワーク速度などにも影響があります。より大きな影響は、途中のさまざまなポイントでのバッファー サイズです。最速のパフォーマンスを得るには、SQL Server が結果の大きなバッチを一度に送信し、アプリケーションにすばやく配置する必要があります。

他のオプションも大きな効果があります。Excel/VBA では、データを取り込むさまざまな方法があります。カーソルを使用する場合は、読み取り専用の前方読み取りカーソルが必要です。それ以外のものは、はるかに遅くなる可能性があります。たとえば、ある種類のカーソルは、一度に 1 行ずつデータを読み取ります。そのため、帯域幅よりもレイテンシがパフォーマンスの支配的な要因になります (これは更新可能なカーソルだと思いますが、私は肯定的ではありません)。

クライアントとデータへのアクセス方法について詳しく説明する必要があります。これはクライアント側の問題である可能性が高く、データベースの問題ではありません。

于 2012-07-25T13:23:18.410 に答える
0

主キー、インデックス シーク、インデックス スキャン、実行計画、これらはあなたの友達です。インデックスの件名については、このリンクを確認してください。このフォーラムの投稿も、主キーと外部キーを理解するのに役立ちます。実行計画の分析と理解については、このリンクをチェックしてください

私が作業しているデータベースでは、数千行の同様の量の情報を取得する作業に 1 秒もかかりませんでした。データベースの設計を考慮し、後でさまざまなアプローチをテストしてクエリを微調整してパフォーマンスを向上させることが非常に重要です。常により多くの CPU/RAM パワーを投入することが最善の方法であるとは限りません。

編集済み

あなたのコメントには皮肉を感じます。希望はあなたの目標ではありません。私が今行った次のテストを使用して、ゲストになりましょう(以前は不可能でした。今は勤務時間外です)。私の場合、100万行近くを挿入するためにはるかに優れたアプローチ(CTE)を使用したため、挿入は約20〜30秒です。時間を比較すると、主キーを使用すると、使用しない場合よりも 1 秒強速くなることがわかります。また、サーバー上では、一般的に 1 秒速くなりました。

CREATE TABLE [dbo].[Test_Speed]([ED] [DATETIME2] NULL) ON [PRIMARY]
CREATE UNIQUE CLUSTERED INDEX Idx1 ON Test_Speed(ED);

DECLARE @firstdate DATETIME2='00010101 00:00:00', 
        @lastdate DATETIME2= '25001231 00:00:00'

;WITH CTE_DatesTable
  AS
  (
    SELECT @FirstDate AS auxDate
    UNION ALL
    SELECT DATEADD(dd, 1, auxDate)
    FROM CTE_DatesTable
    WHERE DATEADD(dd, 1, auxDate) <= @LastDate
  )
  INSERT INTO [dbo].[Test_Speed]
  SELECT auxDate FROM CTE_DatesTable
  OPTION (MAXRECURSION 0);

  SET STATISTICS TIME ON;
  SET STATISTICS IO ON;
  SELECT ED FROM [dbo].[Test_Speed]
  SET STATISTICS TIME OFF;
  SET STATISTICS IO OFF;



/*
    Select on Client with primary key , insertion 21s
    (913106 row(s) affected)
     SQL Server Execution Times:
       CPU time = 0 ms,  elapsed time = 0 ms.
    (913106 row(s) affected)
    Table 'Test_Speed'. Scan count 1, logical reads 1919, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
     SQL Server Execution Times:
       CPU time = 375 ms,  elapsed time = 7790 ms   

    Select on Client without primary key , insertion 31s   
    SQL Server Execution Times:
       CPU time = 0 ms,  elapsed time = 0 ms.
    (913106 row(s) affected)
    Table 'Test_Speed'. Scan count 1, logical reads 1931, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    (1 row(s) affected)
     SQL Server Execution Times:
       CPU time = 405 ms,  elapsed time = 8049 ms.

    ------------------  

    Select on Server with Primary key, insertion 19s
    (913106 row(s) affected)
     SQL Server Execution Times:
       CPU time = 0 ms,  elapsed time = 0 ms.
    (913106 row(s) affected)
    Table 'Test_Speed'. Scan count 1, logical reads 1931, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
     SQL Server Execution Times:
       CPU time = 187 ms,  elapsed time = 6164 ms.   

    Select on Server without Primary key, insertion 25s
     (913106 row(s) affected)
     SQL Server Execution Times:
       CPU time = 0 ms,  elapsed time = 0 ms.
    (913106 row(s) affected)
    Table 'Test_Speed'. Scan count 1, logical reads 1919, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
     SQL Server Execution Times:
       CPU time = 343 ms,  elapsed time = 7407 ms.
*/
于 2012-07-25T13:27:22.810 に答える