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

GROUP BY を使用し、順序が指定されていない場合、SQL Server 2008 が順序付けを行うのはなぜですか?

    この質問に答えるには、両方で作成されたクエリ プランを見てください。

    最初の SELECT は単純なテーブル スキャンです。つまり、割り当て順に行が生成されます。これは新しいテーブルであるため、レコードを挿入した順序と一致します。

    2 番目の SELECT は GROUP BY を追加します。推定行数が非常に少ないため、SQL Server は個別の並べ替えを介して実装します。行を増やしたり、SELECT に集計を追加したりした場合、この演算子は変更される可能性があります。

    たとえば、次を試してください:

    CREATE TABLE #Values ( FieldValue varchar(50) )
    
    ;WITH FieldValues AS
    (
        SELECT '4' FieldValue UNION ALL
        SELECT '3' FieldValue UNION ALL
        SELECT '2' FieldValue UNION ALL
        SELECT '1' FieldValue
    )
    INSERT INTO #Values ( FieldValue )
    SELECT
        A.FieldValue
    FROM FieldValues A
    CROSS JOIN FieldValues B
    CROSS JOIN FieldValues C
    CROSS JOIN FieldValues D
    CROSS JOIN FieldValues E
    CROSS JOIN FieldValues F
    
    SELECT
        FieldValue
    FROM #Values
    GROUP BY
        FieldValue
    
    DROP TABLE #Values
    

    行数が原因で、これはハッシュ集計に変更され、現在、クエリ プランには並べ替えがありません。

    ORDER BY がない場合、SQL Server は任意の順序で結果を返すことができ、結果が返される順序は、データを最も迅速に返すことができると考える方法の副作用です。



    1. 範囲基準を使用した結合テーブルでのMySQLの最適化

    2. HSQLDBROWNUMとOracleの互換性

    3. PostgreSQL 9.3:1つの列を複数に分割

    4. SQL Serverの日付と時刻のODBCスカラー関数(T-SQLの例)