sql >> データベース >  >> RDS >> Sqlserver

テーブル変数を読み取るクエリは、SQL Server 2008 で並列実行プランを生成できますか?

    OK、並列選択がありますが、ありません テーブル変数

    私はそれを匿名化し、

    • BigParallelTable は 90 万行で幅が広い
    • 従来の理由により、BigParallelTable は部分的に非正規化されています (後で修正します、約束します)
    • BigParallelTable は、理想的ではなく「高価」であるため、並列プランを生成することがよくあります
    • SQL Server 2005 x64、SP3、ビルド 4035、16 コア

    クエリ + プラン:

    DECLARE @FilterList TABLE (bar varchar(100) NOT NULL)INSERT @FilterList (bar)SELECT 'val1' UNION ALL 'val2' UNION ALL 'val3'--snippedSELECT *FROM dbo.BigParallelTable BPT JOIN @ FilterList FL ON BPT.Thing =FL.BarStmtText |--Parallelism(Gather Streams) |--Hash Match(Inner Join, HASH:([FL].[bar])=([BPT].[Thing]), RESIDUAL :(@FilterList.[bar] as [FL].[bar]=[MyDB].[dbo].[BigParallelTable].[Thing] as [BPT].[Thing])) |--Parallelism(Distribute Streams,ブロードキャスト パーティショニング) | |--Table Scan(OBJECT:(@FilterList AS [FL])) |--Clustered Index Scan(OBJECT:([MyDB].[dbo].[BigParallelTable].[PK_BigParallelTable] AS [BPT]))  

    さて、考えてみると、テーブル変数はほとんどの場合テーブル スキャンであり、統計を持たず、1 つの行が "推定行数 =1"、"実際.. =3" であると見なされます。

    テーブル変数が並列で使用されていないことを宣言できますが、それを含むプランは他の場所で並列処理を使用できますか?したがって、BOL は正しく、SQL ストレージの記事は間違っています



    1. SQLで列の値を合計する方法は?

    2. SQLServerID列の値は1ではなく0から始まります

    3. スプレッドシートをmySQLにエクスポートするGoogleAppsScriptは、複数のファイルで実行されます

    4. mysql jdbcドライバーは、複数のステートメントを含むトリガーの区切り文字をサポートしていません