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

Uniqueidentifier 対 IDENTITY 対 Material Code -- 主キーの最適な選択はどれですか?

    GUID 主キーとしては自然な選択のように思えるかもしれません。本当にそうしなければならない場合は、テーブルの PRIMARY KEY に使用することを主張することもできます。 してはいけないことを強くお勧めします GUID を使用します クラスタリング キーとしての列

    2 つの問題を区別する必要があります:

    <オール> <リ>

    主キー 論理構造 - テーブル内のすべての行を一意かつ確実に識別する候補キーの 1 つです。これは、実際には何でもかまいません - INTGUID 、文字列 - シナリオに最も適したものを選択してください。

    <リ>

    クラスタリング キー (テーブルの「クラスター化インデックス」を定義する列または列) - これは物理 ストレージ関連のものであり、ここでは、小さくて安定した、増え続けるデータ型が最適です - INT または BIGINT デフォルトのオプションとして。

    デフォルトでは、SQL Server テーブルの主キーはクラスタリング キーとしても使用されますが、そうである必要はありません。以前の GUID ベースのプライマリ/クラスター化されたキーを 2 つの個別のキー (GUID のプライマリ (論理) キー) に分割すると、パフォーマンスが大幅に向上するのを個人的に見てきました。 、および別の INT IDENTITY(1,1) のクラスタリング (順序付け) キー 桁。

    キンバリー トリップとして - インデックス作成の女王 - そして他の人が何度も述べている - GUID クラスタリング キーは最適ではないため、そのランダム性により、大量のページとインデックスの断片化が発生し、一般的にパフォーマンスが低下します。

    はい、知っています - newsequentialid() があります SQL Server 2005 以降 - しかし、それでさえ完全にシーケンシャルではないため、GUID と同じ問題が発生します。 - 少しだけ目立たなくなりました。

    次に、考慮すべき別の問題があります。テーブルのクラスター化キーは、テーブルのすべての非クラスター化インデックスのすべてのエントリにも追加されるため、できるだけ小さくする必要があります。通常、INT 大部分のテーブルでは 20 億以上の行で十分なはずです - そして GUID と比較して クラスタリング キーとして使用すると、ディスク上およびサーバー メモリ内に数百メガバイトのストレージを節約できます。

    クイック計算 - INT を使用 対 GUID プライマリ キーおよびクラスタリング キーとして:

    • 1'000'000 行のベース テーブル (3.8 MB 対 15.26 MB)
    • 6 つの非クラスター化インデックス (22.89 MB 対 91.55 MB)

    合計:25 MB 対 106 MB - そしてそれは 1 つのテーブルにあるだけです!

    もう少し考えてみましょう - Kimberly Tripp の優れたもの - 読んで、もう一度読んで、消化してください!これはまさに、SQL Server のインデックス作成の福音です。

    よほどの理由がない限り 、私は INT IDENTITY を使用することを主張します ほぼすべての「実際の」データ テーブルで、主キーのデフォルトとして - 一意であり、安定しており (決して変化しない)、狭く、常に増加しています - すべての 優れたプロパティ SQL Server テーブルの高速で信頼性の高いパフォーマンスのためにクラスタリング キーに含める必要があります!

    これらすべてのプロパティも備えた「自然な」キー値がある場合は、代理キーの代わりにそれを使用することもできます。でも 2 最大の可変長文字列。私の意見では、それぞれ20文字はこれらの要件を満たしていません。



    1. SQLグループごとの既存の列の数に基づいて新しい列の値を作成するにはどうすればよいですか?

    2. PHPを介してクエリ結果をCSVとしてエクスポート

    3. MySQL/MariaDBデータベースをエクスポートします

    4. MySQLには多くのクエリ終了状態があり、すべての接続が数分で使用されます