2016-09-22 12 views
1

を手順を実行していない示して私はSQLデータウェアハウス https://azure.microsoft.com/en-us/documentation/articles/sql-data-warehouse-develop-concurrency/ にAzureの同時実行性とワークロード管理を読んで、もう1つは、スケールに基づいて使用することができます同時クエリの数には限界を理解しています、私は理解できないので、ここで問題を提起することは、文書の状態をテストするとき、私は結果を得ることができませんAzureの主張は真実です。同時にクエリを実行することは、それを連続して実行するのと同じくらい長くかかります。テストAzureのSQL DW同時実行が内部アズールが同時に

例についてはここにテスト例があります。 私は5つのストアドプロシージャを持っていますが、個々に実行するとそれぞれ約1秒かかることがあります。だから私は5つの連続したすべてを実行すると5秒ぐらいかかりますが、これは期待していますが、同時に5つのsprocsを同時に実行すると、1秒間に完了すると思いますが、完了するまでには約4.5〜4.7秒かかります。

何人かのAzureのエキスパートが何が起こっているのか説明できますか?

私はそれがリソースの競合かもしれないと思っていましたが、sys.dm_pdw_resource_waitsは5つのsprocsが実行されている間はブロックされていません。

sys.dm_pdw_exec_requestsを実行すると、5つのexec sprocクエリがすべて数ミリ秒で提出されています。 Start_timeとEnd_compile_timeについても同じです。すべての5つのsprocsのend_timeは再び数ミリ秒以内ですが、Total_elapsed_timeは予想される1000ミリ秒の代わりに5000ミリ秒に近くなります。 sprocを単独で実行すると、持続時間は約1000 msになります。同時実行性の場合と同じように、同時に5つのsprocsが起動しますが、内部的にはキューに入れられて順番に実行されます。私はもともと私の5 sprocsのために十分でなければならない8つのスロットを持っているDW200でテストしていた。安全のために私はDW1000にスケールアウトしました。これは32個の同時クエリ(私はsmallrcを使用しています)を許可しますが、それはこの問題を助けませんでした。ここで

は、私は(DW1000を使用して)これをテストする方法です

  1. 私は、5つの別々のステージテーブル (ステージ1、ステージ2、など。)

    CREATE TABLE dbo.Stage1 
    (
        ShortId bigint NOT NULL 
        ,TestName varchar(50) NOT NULL 
        ,TestValue varchar(50) NOT NULL 
        ,CreateDate DateTime NOT NULL 
    ) 
    WITH 
    (
        DISTRIBUTION = HASH (ShortId) 
    ) 
    
  2. に1000件のレコードをロード私が作成しました5つのファクトテーブル(ファクト1、ファクト2など)。各テーブルは と同じ4つの列を持ち、最初の 列にハッシュを使用して配信されます。私は 段階から実際にデータを挿入する5つのストアドプロシージャを作成しcolumnstore指数(これが唯一の テストであることを覚えている)

    CREATE TABLE dbo.Fact1 
    (
        ShortId bigint NOT NULL 
        ,TestName varchar(50) NOT NULL 
        ,TestValue varchar(50) NOT NULL 
        ,CreateDate DateTime NOT NULL 
    ) 
    WITH 
    (
        DISTRIBUTION = HASH (ShortId) 
    ) 
    
  3. が含まれていませんでした。 C#の

    CREATE PROCEDURE dbo.TestLoad1 
    AS 
    BEGIN 
        INSERT INTO dbo.Fact1 --this is dbo.Fact2 in sproc 2 etc... 
        SELECT 
         stg.ShortId 
         ,stg.PropertyName 
         ,stg.PropertyValue 
         ,stg.AcquistionTime 
        FROM dbo.Stage1 stg 
         WHERE stg.ShortId NOT IN (SELECT ShortId from dbo.Fact1) --Fact2 etc.. 
    END 
    
  4. Iは5つの接続、 コマンドを作成し SPROCを実行するBeginExecuteReader/EndExecuteReaderを使用する簡単なテスト方法を作成しました。このC#のコードをデバッグするとき、私はreader1 = cmd1.EndExecuteReader(結果1)ラインに到達するまで、それぞれの文が< 1msのある

    SqlConnection cnn1 = new SqlConnection("Data Source=<server>;Initial Catalog=<database>;Persist Security Info = True;User ID =<username>;Password = <password>;Pooling = False;MultipleActiveResultSets = False;Connect Timeout = 30;Encrypt = True;TrustServerCertificate = False"); 
    SqlConnection cnn2 = new SqlConnection("Data Source=<server>;Initial Catalog=<database>;Persist Security Info = True;User ID =<username>;Password = <password>;Pooling = False;MultipleActiveResultSets = False;Connect Timeout = 30;Encrypt = True;TrustServerCertificate = False"); 
    SqlConnection cnn3 = new SqlConnection("Data Source=<server>;Initial Catalog=<database>;Persist Security Info = True;User ID =<username>;Password = <password>;Pooling = False;MultipleActiveResultSets = False;Connect Timeout = 30;Encrypt = True;TrustServerCertificate = False"); 
    SqlConnection cnn4 = new SqlConnection("Data Source=<server>;Initial Catalog=<database>;Persist Security Info = True;User ID =<username>;Password = <password>;Pooling = False;MultipleActiveResultSets = False;Connect Timeout = 30;Encrypt = True;TrustServerCertificate = False"); 
    SqlConnection cnn5 = new SqlConnection("Data Source=<server>;Initial Catalog=<database>;Persist Security Info = True;User ID =<username>;Password = <password>;Pooling = False;MultipleActiveResultSets = False;Connect Timeout = 30;Encrypt = True;TrustServerCertificate = False"); 
    
    SqlCommand cmd1; 
    SqlCommand cmd2; 
    SqlCommand cmd3; 
    SqlCommand cmd4; 
    SqlCommand cmd5; 
    IAsyncResult result1; 
    IAsyncResult result2; 
    IAsyncResult result3; 
    IAsyncResult result4; 
    IAsyncResult result5; 
    SqlDataReader reader1; 
    SqlDataReader reader2; 
    SqlDataReader reader3; 
    SqlDataReader reader4; 
    SqlDataReader reader5; 
    
    cnn1.Open(); 
    cnn2.Open(); 
    cnn3.Open(); 
    cnn4.Open(); 
    cnn5.Open(); 
    
    cmd1 = new SqlCommand("dbo.TestLoad1", cnn1); 
    cmd2 = new SqlCommand("dbo.TestLoad2", cnn2); 
    cmd3 = new SqlCommand("dbo.TestLoad3", cnn3); 
    cmd4 = new SqlCommand("dbo.TestLoad4", cnn4); 
    cmd5 = new SqlCommand("dbo.TestLoad5", cnn5); 
    
    cmd1.CommandType = CommandType.StoredProcedure; 
    cmd2.CommandType = CommandType.StoredProcedure; 
    cmd3.CommandType = CommandType.StoredProcedure; 
    cmd4.CommandType = CommandType.StoredProcedure; 
    cmd5.CommandType = CommandType.StoredProcedure; 
    
    result1 = cmd1.BeginExecuteReader(CommandBehavior.SingleRow); 
    result2 = cmd2.BeginExecuteReader(CommandBehavior.SingleRow); 
    result3 = cmd3.BeginExecuteReader(CommandBehavior.SingleRow); 
    result4 = cmd4.BeginExecuteReader(CommandBehavior.SingleRow); 
    result5 = cmd5.BeginExecuteReader(CommandBehavior.SingleRow); 
    
    reader1 = cmd1.EndExecuteReader(result1); //this is where the code waits for 5 seconds 
    reader2 = cmd2.EndExecuteReader(result2); 
    reader3 = cmd3.EndExecuteReader(result3); 
    reader4 = cmd4.EndExecuteReader(result4); 
    reader5 = cmd5.EndExecuteReader(result5); 
    
    reader1.Close(); 
    reader2.Close(); 
    reader3.Close(); 
    reader4.Close(); 
    reader5.Close(); 
    

(これは単なるテストなので、スタイル/コードを許します)。 ここでは4〜5秒待ってから次の行が再び速くなります(< 1ms)。

この遅延の間にsys.dm_pdw_exec_requestsからselect *を実行すると、5つの要求がすべてキューに入れられて実行されていることがわかります。再実行を続けると、クエリの継続時間が長くなり、突然の(約5秒間)すべての5つのクエリが完了したと言います。

私が間違っていることやAzure SQL DWが内部的にやっていることを説明するのに役立つ助けとなるでしょう。

ありがとう

答えて

2

SQLデータウェアハウスは、単一のクエリですべてのCPUやIOを利用する単一のクエリが可能になります。クエリがリソースを完全に利用できる場合、同じリソースに対しても競合する別のクエリを追加すると、両方が遅く実行されることになります。つまり、100%のCPUを使用するクエリがあり、100%を同時に使用する別のクエリを実行すると、両方のクエリの実行時間が2倍になります。これの利点は、単一のクエリができるだけ高速で実行され、異なるリソースを争う2つのクエリもできるだけ高速で実行されることです。すべてのクエリが本質的に同一である上記のようなテストを実行すると、テストを連続的または同時に実行するのに同じ時間がかかることが予想されます。

あなたの結果をさらに調べるには、monitoring articleが有益かもしれません。 sys.dm_pdw_exec_requestsを調べるだけでなく、sys.dm_pdw_request_steps(分散SQLステップの実行時間)を見てみましょう。これは5秒間の大部分とsys.dm_pdw_sql_requests(分散実行の実行時間)。

ところで、上記の説明では、テスト用の列ストアインデックスを追加していないと述べました。 SQL DWではdefault table type is clustered columnstoreです。 、このインデックスを削除し、次のように句を使用しての変更... WITH

( DISTRIBUTION = HASH(ShortId)、HEAP )

したいと考えて、このことができます。

関連する問題