2

「Azure SQL データ ウェアハウス」で非常に単純なクエリ (以下を参照) を実行すると、5 秒かかります。「Azure SQL Server」で同じクエリを実行すると、0 秒かかり、より正常に見えます。(このクエリは、実行すると実行計画からわかるように、基本的には条件のない LEFT JOINS の集まりです。)

これに5秒かかる可能性はありますか?

CREATE TABLE #output(
  val INT
 )

INSERT INTO #output VALUES (1)

SELECT 
 (SELECT val FROM #output),
 (SELECT val FROM #output),
 (SELECT val FROM #output),
 (SELECT val FROM #output),
 (SELECT val FROM #output),
 (SELECT val FROM #output),
 (SELECT val FROM #output),
 (SELECT val FROM #output)
4

1 に答える 1

1

Azure SQL Data Warehouse の命題は、2 桁テラバイトのデータと数十億行です。それが基本的に設計されているため、SQL PaaS データベースに 30 TB をロードしても実行されないのと同じように、特定の小さなクエリ、特定のクエリ パターン、および小さなデータベースでは実行できないことに気付くかもしれません。また。そのような場合、クエリを再考し、そこでそれらのクエリを本当に実行するかどうかを再考する必要があります。たとえば、この場合、UNION クエリとして単純に書き直すだけで、Azure SQL Data Warehouse で 1 秒未満のパフォーマンスが得られました。

SELECT val FROM #output
UNION ALL
SELECT val FROM #output
UNION ALL
SELECT val FROM #output
UNION ALL
SELECT val FROM #output
UNION ALL
SELECT val FROM #output
UNION ALL
SELECT val FROM #output
UNION ALL
SELECT val FROM #output
UNION ALL
SELECT val FROM #output


SELECT *
FROM
    (
    SELECT 'a' s, val FROM #output
    UNION ALL
    SELECT 'b' s, val FROM #output
    UNION ALL
    SELECT 'c' s, val FROM #output
    UNION ALL
    SELECT 'd' s, val FROM #output
    UNION ALL
    SELECT 'e' s, val FROM #output
    UNION ALL
    SELECT 'f' s, val FROM #output
    UNION ALL
    SELECT 'g' s, val FROM #output
    UNION ALL
    SELECT 'h' s, val FROM #output
    ) x
PIVOT ( MAX(val) FOR s In ( [a], [b], [c], [d], [e], [f], [g], [h] ) ) pvt


-- Use CTAS to materialise the pivot view if required
CREATE TABLE #output2
WITH
(
    DISTRIBUTION = ROUND_ROBIN,
    LOCATION = USER_DB,
    HEAP
)
AS
SELECT *
FROM
    (
    SELECT 'a' s, val FROM #output
    UNION ALL
    SELECT 'b' s, val FROM #output
    UNION ALL
    SELECT 'c' s, val FROM #output
    UNION ALL
    SELECT 'd' s, val FROM #output
    UNION ALL
    SELECT 'e' s, val FROM #output
    UNION ALL
    SELECT 'f' s, val FROM #output
    UNION ALL
    SELECT 'g' s, val FROM #output
    UNION ALL
    SELECT 'h' s, val FROM #output
    ) x
PIVOT ( MAX(val) FOR s In ( [a], [b], [c], [d], [e], [f], [g], [h] ) ) pvt

行を列として本当に必要とする場合は、いつでも使用できますPIVOT。最近、大きな数字のテーブルを作成するときに同様の問題が発生しました。元のクエリはループを使用していましたが、これは一般的に悪い習慣ですが、通常の SQL Server では数秒で実行され、1 回限りの操作です。Azure SQL Datawarehouse でのパフォーマンスは最悪だったので、ローカル インスタンスでクエリを実行し、データをコピーしてbcp、数分でウェアハウスに送信しました。(また、数値テーブルを生成するためのよりセットベースの方法を探しました:)

製品のウェアハウス バージョンではまだ利用できない変更データ キャプチャ (CDC) の使用も検討していたので、バニラ SQL Server でステージング領域をホストし、それらのテーブルで CDC を使用して、ウェアハウスに引き渡すことを検討しました。 SSIS と CDC 関数。それ以来、私たちはそれを拒否しましたが、あなたはその考えを理解しています。実行する必要がある本物のクエリがあるが、それらを書き直すことを検討したり、VM に SQL Server の従来のエディションを用意してから、SSIS、Polybase などを介してウェアハウスに引き渡すことさえ検討したりしない場合

HTH

(これはおそらく dba.stackexchange.com に移動する必要があります)

PS 明らかなことを除外するために、このクエリを簡単に記述できることを知っていると仮定し、問題を強調するためにこのように記述しました。

SELECT val, val, val, val, val, val, val
FROM #output

これについてもう少し掘り下げたところ、master データベースに接続していれば、このクエリはうまく高速に実行されることがわかりました。このステートメントを使用して Azure SQL Data Warehouse のデータベース コンテキストを変更することはできませんが、USE何らかのクライアント (SSIS、sqlcmd など) を介して接続している場合は、これが回避策になる可能性があります。特定の少量のクエリ パターンは、このバージョンの製品にはあまり適していないという最初の主張を今でも支持しています。EXPLAINまた、内部で何が起こっているかを理解できるように、一種のクエリプランを提供するキーワードも調べていましたが、それは別の話です...

于 2015-12-09T02:26:11.937 に答える