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

インデックスが存在しない場合に追加された最新の行を特定する

    いいえ、SQL Server には、テーブルの「最後の行」を返す事前定義された関数はありません。

    定義上、テーブルは順序付けされていない一連の行です。ビー玉の束を袋に入れたと想像してください。袋を開けて、他の人にどちらのビー玉が最初に入ったか最後に入ったか聞いてみましょう。次に、それらをすべて床に投げ、他の誰かが部屋に入ってきたら、最初に床にぶつかったか最後に床にぶつかったかを尋ねます。それらが落ちた順序について何かを示す追加情報がないため、それを行うことはできません。

    同じことが SQL Server のテーブルにも当てはまります。 IDENTITY 列、datetime 列、またはトリガーを追加するか、変更追跡、CDC、監査などの外部機能を使用しない限り、SQL Server が最後に挿入された行を通知する方法はありません。 思うかもしれません order by 句なしでテーブルから選択するだけで 見える 正しい順序でデータが返されているように、これはまったくの偶然です。以下に例を示します:

    CREATE TABLE dbo.floobat
    (
      ID INT PRIMARY KEY, 
      n VARCHAR(16), 
      x CHAR(4000) NOT NULL DEFAULT ''
    );
    
    INSERT dbo.floobat(ID,n) VALUES(1,'Sparky');
    INSERT dbo.floobat(ID,n) VALUES(2,'Aaron');
    INSERT dbo.floobat(ID,n) VALUES(3,'Norbert'); -- <-- inserted last
    
    SELECT ID, n FROM dbo.floobat;
      

    わかりましたので、デフォルトでは、これで問題ないようです。結果:

    ID    n
    --    -------
    1     Sparky
    2     Aaron
    3     Norbert -- < yes, this is right
      

    ただし、アプリケーションや上記の順序に依存するその他の要素が認識できないテーブルに変更を加えてみましょう。

    CREATE NONCLUSTERED INDEX x ON dbo.floobat(n);
    
    SELECT ID, n FROM dbo.floobat;
      

    ええとああ!結果:

    ID    n
    --    -------
    2     Aaron
    3     Norbert
    1     Sparky -- < oops, this is no longer right
      

    これを覚えておく必要があります:ORDER BY 句を含めない場合、伝えている 順序を気にしない SQL Server。そのため、データを返す最も効率的な方法を見つけようとしていますが、それによって観察される順序が異なる可能性があります。上記のインデックスを追加すると、SQL Server がデータを取得するためのアクセス パスが改善されます。まだスキャンを使用していましたが、そのインデックスはクラスター化されたインデックス (ページに 2 行しか収まりませんでした) よりもはるかに細身でした。

    Cust_ID 列が昇順で挿入されていません。 5 を挿入すると そして 2 より 、ORDER BYなしで選択すると、実際には 2 になります 次に 5 (より良いインデックスが存在しないと仮定します)。

    インデックスの作成 (または削除、変更、または再構築) 以外のことによって、順序付け動作に同じような変化が生じる可能性があります。サービス パック、CU、または修正プログラムを適用します。プロシージャ キャッシュをフラッシュします。さまざまな RECOMPILE オプションを使用します。統計の更新;サーバーを再起動します。トレース フラグの追加または無効化。サーバー オプション オプションの変更。データベースを別のサーバーに移動します。などなど

    したがって、この情報を追跡したい場合は、他の回答のいくつかが対処しているように、何らかの方法で自分で追加する必要があります.



    1. MySQLクエリから繰り返される結果を削除する

    2. MySQL外部キー制約が消える

    3. ビューを使用する代わりに、単純な選択クエリを作成するにはどうすればよいですか?

    4. OracleからMySQLに移行する