を手順を実行していない示して私は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を使用して)これをテストする方法です
私は、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) )
に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) )
が含まれていませんでした。 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
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が内部的にやっていることを説明するのに役立つ助けとなるでしょう。
ありがとう