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

SQLServerGUIDの並べ替えアルゴリズム。なんで?

    アルゴリズムは、SQLServerの担当者によってここに文書化されています。SQLServer2005でGUIDはどのように比較されますか?ここで引用します(これは古い記事であり、数年で永久になくなる可能性があるため)

    一般に、平等の比較は、一意の識別子の値で多くの意味があります。ただし、一般的な順序付けが必要な場合は、間違ったデータ型を調べている可能性があり、代わりにさまざまな整数型を検討する必要があります。

    慎重に検討した後、uniqueidentifiercolumnで注文することにした場合、戻ってきたものに驚かれるかもしれません。

    これらの2つのuniqueidentifier値が与えられた場合:

    @ g1 ='55666BEE-B3A0-4BF5-81A7-86FF976E763F' @ g2 ='8DD5BCA5-6ABE-4F73-B4B7-393AE6BBB849'

    '55666BEE'は確かに'8DD5BCA5'よりも小さいため、多くの人は@g1は@g2よりも小さいと考えています。ただし、これはSQLServer2005がuniqueidentifier値を比較する方法ではありません。

    比較は、バイト「グループ」内の右から左、および左から右のバイト「グループ」を調べることによって行われます。バイトグループは、「-」文字で区切られたものです。より技術的には、最初にバイト{10から15}、次に{8-9}、次に{6-7}、次に{4-5}、最後に{0から3}を調べます。

    この特定の例では、「86FF976E763F」と「393AE6BBB849」を比較することから始めます。すぐに、@g2が実際に@g1よりも大きいことがわかります。

    .NET言語では、Guid値のデフォルトの並べ替え順序がSQLServerとは異なることに注意してください。 SQL Serverの比較セマンティクスを使用してGuidの配列またはリストを注文する必要がある場合は、代わりにSqlGuidの配列またはリストを使用できます。これにより、SQLServerのセマンティクスと一致するIComparableが実装されます。

    さらに、ソートはバイトグループのエンディアンに従います(ここを参照:グローバルに一意の識別子)。グループ10〜15および8〜9はビッグエンディアン(ウィキペディアの記事のData4に対応)として保存されるため、ビッグエンディアンとして比較されます。他のグループはリトルエンディアンを使用して比較されます。



    1. PostgreSQLで大規模な非ブロッキング更新を行うにはどうすればよいですか?

    2. プリペアドステートメントから自動インクリメントIDを取得する方法はありますか

    3. 非常に大きなテーブルでの(列ストア)圧縮の楽しみ–パート2

    4. JDBCとSpringの操作