programing

Oracle의 행과 동등SQL Server의 ID

cafebook 2023. 4. 13. 21:10
반응형

Oracle의 행과 동등SQL Server의 ID

Oracle의 Row와 동등한 것은 무엇입니까?SQL Server의 ID?

Oracle 문서에서

ROWID 유사 초콜릿

데이터베이스 내의 각 행에 대해 ROWID 의사 초콜릿은 행의 주소를 반환합니다.Oracle Database rowid 값에는 행을 찾는 데 필요한 정보가 포함되어 있습니다.

  • 개체의 데이터 개체 번호
  • 행이 있는 데이터 파일의 데이터 블록
  • 데이터 블록에서 행의 위치(첫 번째 행은 0)
  • 행이 상주하는 데이터 파일(첫 번째 파일은 1).파일 번호는 테이블스페이스에 상대적입니다.

Server입니다.rid 가지 되어 있습니다.File:Page:Slot.

되지 않는SQL Server 2008 을 할 수 .%%physloc%%합니다.virtual column을 클릭합니다.됩니다.binary(8)페이지 ID의 첫 번째 4바이트, 파일 ID의 2바이트, 페이지의 슬롯 위치의 2바이트 순으로 값을 지정합니다.

" " "sys.fn_PhysLocFormatter ★★★sys.fn_PhysLocCrackerTVF를 사용하여 보다 읽기 쉬운 형식으로 변환할 수 있습니다.

CREATE TABLE T(X INT);

INSERT INTO T VALUES(1),(2)

SELECT %%physloc%% AS [%%physloc%%],
       sys.fn_PhysLocFormatter(%%physloc%%) AS [File:Page:Slot]
FROM T

출력 예

+--------------------+----------------+
|    %%physloc%%     | File:Page:Slot |
+--------------------+----------------+
| 0x2926020001000000 | (1:140841:0)   |
| 0x2926020001000100 | (1:140841:1)   |
+--------------------+----------------+

이 기능은 쿼리 프로세서에 의해 이용되지 않습니다.이 기능을 사용하는 것은 가능하지만,WHERE 삭제

SELECT *
FROM T
WHERE %%physloc%% = 0x2926020001000100 

SQL Server는 지정된 행을 직접 검색하지 않습니다.대신 전체 테이블 검색을 수행합니다.%%physloc%%각 행에 대해 일치하는 행을 반환합니다(있는 경우).

, ""를 ""binary(8)파일, 페이지, 슬롯.

DECLARE @FileId int = 1,
        @PageId int = 338,
        @Slot   int = 3

SELECT CAST(REVERSE(CAST(@PageId AS BINARY(4))) AS BINARY(4)) +
       CAST(REVERSE(CAST(@FileId AS BINARY(2))) AS BINARY(2)) +
       CAST(REVERSE(CAST(@Slot   AS BINARY(2))) AS BINARY(2))

컬럼이 많고 속도가 중요한 매우 큰 테이블을 추론해야 합니다.따라서 이 방법을 사용하여 모든 테이블에 사용할 수 있습니다.

delete T from 
(select Row_Number() Over(Partition By BINARY_CHECKSUM(*) order by %%physloc%% ) As RowNumber, * From MyTable) T
Where T.RowNumber > 1

결과 세트가 아닌 테이블 내의 행을 일의로 식별하려면 IDENTY 컬럼 등의 사용을 검토해야 합니다.SQL Server 도움말에서 "IDENTY 속성"을 참조하십시오.SQL Server는 Oracle과 달리 테이블의 각 행에 대한 ID를 자동으로 생성하지 않으므로 자체 ID 열을 만들고 쿼리로 명시적으로 가져와야 합니다.

편집: 결과 집합 행의 동적인 번호 부여에 대해서는, 이하를 참조해 주세요.단, Oracle의 ROWNUM과 동등할 것으로 생각되며, 페이지상의 모든 코멘트를 보면, 상기의 내용이 필요한 것을 알 수 있습니다.SQL Server 2005 이후에서는 새로운 순위 함수를 사용하여 행의 동적 번호를 지정할 수 있습니다.

예를 들어, 저는 다음과 같은 질문을 합니다.

select row_number() over (order by rn_execution_date asc) as 'Row Number', rn_execution_date as 'Execution Date', count(*) as 'Count'
from td.run
where rn_execution_date >= '2009-05-19'
group by rn_execution_date
order by rn_execution_date asc

제공 내용:

Row Number  Execution Date           Count
----------  -----------------        -----
1          2009-05-19 00:00:00.000  280
2          2009-05-20 00:00:00.000  269
3          2009-05-21 00:00:00.000  279

행의 동적 번호 부여에 관한 기사도 support.microsoft.com에 게재되어 있습니다.

새로운 ROW_NUMBER 함수를 확인합니다.다음과 같이 동작합니다.

SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE

위의 답변 중 몇 가지는 특정 행을 직접 참조하지 않아도 되지만 의 다른 이 변경되면 작동하지 않습니다.그것은 기술적으로 답이 부족한 나의 기준이다.

Oracle의 ROWID는 일반적으로 행을 선택하고 나중에 행으로 돌아가 처리(업데이트 등)하는 안정적인 방법을 제공합니다.행을 검색하는 방법(복잡한 결합, 전체 텍스트 검색 또는 행별 참조 및 데이터에 대한 절차 테스트 적용)은 UPDATE 문을 검증하는 데 쉽고 안전하게 재사용되지 않을 수 있습니다.

SQL Server RID는 동일한 기능을 제공하는 것처럼 보이지만 동일한 성능을 제공하지 않습니다.문제는 이것뿐입니다.불행하게도 ROWID를 유지하는 목적은 예를 들어 매우 큰 테이블에서 행을 찾기 위해 비용이 많이 드는 작업을 반복하는 것을 피하는 것입니다.그럼에도 불구하고, 많은 경우에 대한 성능은 허용됩니다.Microsoft 가 장래의 릴리스로 옵티마이저를 조정하면, 퍼포먼스 문제가 해결될 가능성이 있습니다.

절차 프로그램에서 FOR UPDATE를 사용하고 커서를 계속 열어둘 수도 있습니다.그러나 이는 대규모 또는 복잡한 배치 처리에서는 비용이 많이 들 수 있습니다.

주의: 예를 들어 SELECT와 UPDATE 사이의 DBA가 데이터베이스를 재구축하는 경우 Oracle의 ROWID도 물리적 행 식별자이기 때문에 안정적이지 않습니다.따라서 ROWID 디바이스는 적절한 범위의 작업 내에서만 사용해야 합니다.

표의 행에 영구 번호를 매기려면 SQL Server용 RID 솔루션을 사용하지 마십시오.오래된 386의 Access보다 성능이 떨어집니다.SQL Server의 경우 ID 열을 만들고 해당 열을 클러스터화된 기본 키로 사용합니다.이렇게 하면 테이블에 영구적이고 빠른 Integer B-Tree가 배치되며, 더 중요한 것은 모든 비클러스터 인덱스가 이를 사용하여 행을 찾는 것입니다.SQL Server에서 Oracle처럼 개발하려고 하면 성능이 떨어지는 데이터베이스가 생성됩니다.다른 엔진인 척하지 말고 엔진에 맞게 최적화해야 합니다.

또한 기본 키에 GUID를 입력하기 위해 NewID()를 사용하지 마십시오. 삽입 성능이 저하됩니다.GUID를 사용해야 하는 경우 NewSequential을 사용합니다.ID()를 컬럼의 디폴트로 지정합니다.하지만 INT는 여전히 더 빠릅니다.

한편 쿼리에서 생성된 행에 번호를 붙이는 경우 쿼리 열의 하나로 RowNumber Over() 함수를 사용합니다.

작은 데이터 세트에 기본적인 행 번호만 매기고 싶다면, 이와 같은 것은 어떻습니까?

SELECT row_number() OVER (order by getdate()) as ROWID, * FROM Employees

http://vyaskn.tripod.com/programming_faq.htm#q17 에서 :

Oracle에는 행 번호 또는 행 ID를 사용하여 테이블의 행에 액세스할 수 있는 로넘이 있습니다.SQL Server에 이와 동등한 것이 있습니까?또는 SQL Server에서 행 번호를 사용하여 출력을 생성하는 방법은 무엇입니까?

SQL Server에는 Oracle의 Rownum 또는 행 ID와 직접 동등한 항목이 없습니다.엄밀히 말하면 관계형 데이터베이스에서는 테이블 내의 행은 순서가 매겨지지 않으며 행 ID는 의미가 없습니다.그러나 이 기능이 필요한 경우 다음 세 가지 대안을 고려해 보십시오.

  • 를 추가합니다.IDENTITY컬럼을 테이블로 이동합니다.

  • 다음 쿼리를 사용하여 각 행의 행 번호를 생성합니다.다음 쿼리는 pubs 데이터베이스의 작성자 테이블에 있는 각 행의 행 번호를 생성합니다.이 쿼리가 작동하려면 테이블에 고유 키가 있어야 합니다.

    SELECT (SELECT COUNT(i.au_id) 
            FROM pubs..authors i 
            WHERE i.au_id >= o.au_id ) AS RowID, 
           au_fname + ' ' + au_lname AS 'Author name'
    FROM          pubs..authors o
    ORDER BY      RowID
    
  • 임시 테이블접근법을 사용하여 결과 세트 전체를 임시 테이블에 저장하고,IDENTITY()기능.임시 테이블을 작성하면 특히 큰 테이블을 사용하는 경우 비용이 많이 듭니다.테이블에 고유 키가 없는 경우 이 방법을 사용합니다.

ROWID는 Oracle 테이블의 숨겨진 열이므로 SQL Server의 경우 자체 열을 구축하십시오.ROWID라는 열을 추가합니다.기본값은 입니다.NEWID().

그 방법:SQL Server의 기존 테이블에 기본값 열 추가

http://msdn.microsoft.com/en-us/library/aa260631(v=SQL.80).aspx SQL 서버에서 타임스탬프는 DateTime 열과 같지 않습니다.테이블뿐만 아니라 데이터베이스 전체의 행을 고유하게 식별하기 위해 사용됩니다.이는 낙관적인 동시성을 위해 사용할 수 있습니다.예를 들어 UPDATE [Job] SET [Name]=@이름, [XCustomData]=@XCustomData WHERE ([수정된 타임스탬프]=@Original_Modified TimeStamp AND [GUID]=@Original_가이드

ModifiedTimeStamp는 원래 데이터를 업데이트하고 있으며 행에 다른 업데이트가 발생한 경우 실패합니다.

이 예는 MS SQL의 예에서 따온 것입니다.@ID는 정수 또는 varchar와 교환할 수 있습니다.이것이 제가 찾고 있던 솔루션이기 때문에 공유합니다.맛있게 드세요!!

-- UPDATE statement with CTE references that are correctly matched.
DECLARE @x TABLE (ID int, Stad int, Value int, ison bit);
INSERT @x VALUES (1, 0, 10, 0), (2, 1, 20, 0), (6, 0, 40, 0), (4, 1, 50, 0), (5, 3, 60, 0), (9, 6, 20, 0), (7, 5, 10, 0), (8, 8, 220, 0);
DECLARE @Error int;
DECLARE @id int;

WITH cte AS (SELECT top 1 * FROM @x WHERE Stad=6)
UPDATE x -- cte is referenced by the alias.
SET ison=1, @id=x.ID
FROM cte AS x

SELECT *, @id as 'random' from @x
GO

ROWID는 다음 방법을 사용하여 얻을 수 있습니다.

1. 자동 증분 필드가 포함된 새 테이블을 만듭니다.

2. Row_Number 분석 함수를 사용하여 필요에 따라 시퀀스를 가져옵니다.특정 필드 또는 필드 조합의 오름차순 또는 내림차순 방식으로 row_id를 원하는 상황에서 도움이 되므로 이 방법을 선호합니다.

샘플: Row_Number() Over (Deptno 오더에 의한 파티션)

위의 샘플은 각 부서의 최고 급여를 기준으로 시퀀스 번호를 제공합니다.파티션 기준은 옵션이며 필요에 따라 삭제할 수 있습니다.

시도해 보세요

select NEWID()

출처 : https://learn.microsoft.com/en-us/sql/t-sql/data-types/uniqueidentifier-transact-sql

언급URL : https://stackoverflow.com/questions/909155/equivalent-of-oracles-rowid-in-sql-server

반응형