복붙노트

[SQL] 인덱스가 존재하지 않을 때 추가 최신 행 결정 [중복]

SQL

인덱스가 존재하지 않을 때 추가 최신 행 결정 [중복]

나는 가장 최근에 추가 된 고객을 검색합니다. 나는 행이 추가 된 날짜 / 시간을 저장하는 열이없는, 나의 기본 키가 IDENTITY 열이 아닌 반드시 오름차순으로 입력되지 않는, CUST_ID이다.

이것은 내 테이블, 고객, 그리고 상상 세 개의 행이 순서로 추가되었습니다

Cust_ID       Cust_Name      Cust_Age
-------------------------------------
2             C              23
6             A              25
3             B              22

위의 예에서 나는 마지막 레코드 (B)를 싶어. (오름차순에 의존하지 않고) 테이블의 마지막 행을 반환합니다 SQL Server의 미리 정의 된 기능이 있습니까?

해결법

  1. ==============================

    1.아니, 테이블의 "마지막 행"을 반환합니다 SQL Server의 미리 정의 된 기능이 없습니다.

    아니, 테이블의 "마지막 행"을 반환합니다 SQL Server의 미리 정의 된 기능이 없습니다.

    정의에 의하면, 테이블의 행 순서화 된 집합이다. 당신이 가방에 구슬을 잔뜩 던져 상상 해보세요. 이제 가방을 열고 대리석 첫 번째 또는 마지막에 가서 다른 사람을 부탁드립니다. 이제 바닥에 그들 모두를 던져, 그리고 다른 사람이 방에 올 때, 첫 번째 또는 마지막 바닥에 충돌하는 요청합니다. 가 하락하는 순서에 대해 아무것도 나타내는 추가 정보가 더 있기 때문에 당신은 그것을 할 수 없습니다.

    동일은 SQL Server에서 테이블에 대한 사실이다. 당신이 IDENTITY 열, 또는 날짜 열 또는 트리거를 추가하거나 등 변경 추적, CDC, 감사와 같은 외부 기능을 사용하지 않는 한, SQL 서버가 마지막으로 삽입 된 행 말할 수있는 방법이 없습니다. 당신은 올바른 순서로 데이터를 반환하는 것처럼,이 순수한 우연이 절 외모로 주문하지 않고 테이블에서 해당 단지 선택을 생각할 수 있습니다. 다음은 그 예이다 :

    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 서버에게 데이터를 검색에 더 나은 액세스 경로를 준 이상 추가. 아직 스캔을 사용하지만, 그 인덱스는 (만 페이지에 두 행에 맞게 수) 클러스터 된 인덱스보다 방법 삐쩍이었다.

    그것은 당신의 CUST_ID 열이 오름차순으로 삽입되지 않는 사실에 의해 뒤얽힌 때문에 심지어 인덱스없이, 당신은 아마, 당신이 기대하는 결과를 얻을 수 없다. 그래서 경우 2 ~ 5 삽입보다, 주문 BY없이 선택하면 실제로 (더 좋은 인덱스가 존재하지 않는 가정)이 다음 5가 발생합니다.

    인덱스를 생성 (또는 삭제하거나, 변경 또는 재건) 이외의 다른 것들은 주문 행동의 변화 같은 종류의 원인이 될 수 있습니다. 서비스 팩, CU 또는 핫픽스를 적용; 프로 시저 캐시를 플러시; 다양한 RECOMPILE 옵션을 사용하여; 통계를 갱신하는 단계; 서버를 다시 시작; 추가하거나 추적 플래그를 해제; 서버 옵션 옵션을 변경; 다른 서버로 데이터베이스를 이동; 등 등

    이 정보를 추적 할 경우에 따라서, 당신이 언급 한 다른 답변의 몇 가지로, 어떤 방법으로 스스로를 추가해야합니다.

  2. ==============================

    2.당신도 IDENTITY 또는 테이블에 날짜 시간 열이 없다면 당신은 전까지 마지막 행 삽입을 얻을 수 없습니다.

    당신도 IDENTITY 또는 테이블에 날짜 시간 열이 없다면 당신은 전까지 마지막 행 삽입을 얻을 수 없습니다.

  3. ==============================

    3.당신이 당신의 테이블에 메타 데이터를 사용할 수 있고, 당신이 타임 스탬프 또는 ID 열 중 하나를 감당할 수있는 스키마를 편집 할 수없는 경우에, 당신은 SQL 서버의 메타 데이터 생성 메커니즘에 의존해야한다. 하나는 CDC이다.

    당신이 당신의 테이블에 메타 데이터를 사용할 수 있고, 당신이 타임 스탬프 또는 ID 열 중 하나를 감당할 수있는 스키마를 편집 할 수없는 경우에, 당신은 SQL 서버의 메타 데이터 생성 메커니즘에 의존해야한다. 하나는 CDC이다.

    CDC는 변경 데이터 캡처를 의미하고, 이름의 의미, 그것은 당신이 데이터에 적용된 변화를 이해하는 데 도움이있다. 난 당신이 테이블에 삽입 된 최신 기록이 무엇인지 이해하고,이 메타 데이터를 사용할 수 있다고 생각합니다.

  4. ==============================

    4.어느 한 쪽

    어느 한 쪽

    또는

  5. ==============================

    5.당신이 당신의 테이블 스키마를 변경하지 못할 경우에 당신이 저장 마지막 레코드가 삽입 된 것을 동일한 스키마에 새 테이블을 추가하는 것을 고려 할 수있다,

    당신이 당신의 테이블 스키마를 변경하지 못할 경우에 당신이 저장 마지막 레코드가 삽입 된 것을 동일한 스키마에 새 테이블을 추가하는 것을 고려 할 수있다,

  6. from https://stackoverflow.com/questions/19982804/determine-latest-row-added-when-no-index-is-present by cc-by-sa and MIT license