ROWID(오라클) - 쓸모가 있습니까?
ROWID는 쿼리에 의해 반환되는 결과의 각 행에 대해 고유한 값인 것으로 알고 있습니다.
이 ROWID가 필요한 이유는 무엇입니까?ORACLE에는 이미 ROWNUM이 있습니다.
SQL 쿼리에서 ROWID를 사용한 적이 있습니까?
ROWID에 관한 정보입니다.따라서 기본 키 검색보다 빠르게 행을 찾는 것이 가장 빠릅니다.한 후 에 ROWID에서 합니다.where
DML을 사용하다
Oracle SELECT ... FOR UPDATE 구문은 WHERE CURRENT OF를 사용하여 잠긴 행을 업데이트할 때 ROWID를 암시적으로 사용합니다.또한 EXCEPTIONS 테이블(EXCEPTIONS INTO 절을 사용하여 제약을 적용할 때 참조)에는 ROW_ID 열이 있습니다.이것에 의해, 제약 조건을 위반하고 있는 행을 신속히 특정할 수 있습니다.
후자의 예는 범용 코드를 작성하고 데이터 유형, 복합 키 등에 대한 우려 없이 UID를 저장하는 메커니즘이 필요한 경우, 또 다른 일반적인 용도를 나타내고 있습니다.
반면 ROWNUM은 특정 결과 집합의 행에 태그를 붙이는 의사 열입니다.그것은 영구적인 의미가 없다.
편집하다
특정 레코드의 ROWID는 예를 들어 테이블 재구축을 통해 시스템의 라이프 타임에 걸쳐 변경될 수 있습니다.또한 하나의 레코드가 삭제되면 해당 ROWID가 새로운 레코드로 지정될 수 있습니다.따라서 ROWID는 장기적으로 UID로 사용하기에는 적합하지 않습니다.하지만 거래 내에서 사용하기에는 충분합니다.
나는 이제 이것에 대한 예를 안다.
프라이머리 키가 없는 테이블이 있다고 가정합니다.이 테이블은 중복된 행을 가질 수 있습니다.중복된 행을 삭제하고 동일한 행을 유지하려면 어떻게 해야 합니까?
Oracle은 기본 키 대신 ROWID를 제공합니다.연관된 유형의 중첩된 쿼리를 작성할 수 있습니다. [(행의 모든 열을 기준으로 그룹화하고 내부 쿼리의 각 그룹에서 MIN(ROWID)을 취합니다. 각 그룹에 대해 외부 쿼리의 다른 행을 삭제합니다.)]
예
SQL> select * from employees;
SSN NAME
---------- ----------
1 helen
1 helen
2 helen
2 peter
10 sally
11 null
11 null
12 null
8 rows selected.
SQL> delete from employees where ROWID NOT IN (select min(ROWID) from employees
group by ssn,name);
2 rows deleted.
SQL> select * from employees;
SSN NAME
---------- ----------
1 helen
2 helen
2 peter
10 sally
11 null
12 null
6 rows selected.
ROWID는 데이터베이스 EXPORT 및 IMPORT 사이클 전체에 걸쳐 유지되지 않습니다.테이블에 rowid를 키 값으로 저장하지 마십시오.
ROWID는 다음과 같이 구성됩니다(단, ROWNUM 부분은 ROWID의 마지막 부분이지만 반드시 그 순서는 아닙니다).
- OBJID 객체의 고유 식별자.
- FILENO 테이블스페이스에 있는 데이터 파일의 상대 번호.
- BLOCKNO 파일 헤더 뒤에 있는 데이터 파일의 상대 블록 번호.
- ROWNUM 블록 내의 상대적인 ROWNUM.
ROWID를 ROWIDTOCHAR() SQL 함수를 사용하여 ROWID를 복합 필드(OBJID, FILENO, BLOCKNO, ROWNUM)로 쉽게 분해하거나 다음과 같이 사용할 수 있습니다.
SQL> select DBMS_ROWID.ROWID_OBJECT(rowid) "OBJECT",
2 DBMS_ROWID.ROWID_RELATIVE_FNO(rowid) "FILE",
3 DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) "BLOCK",
4 DBMS_ROWID.ROWID_ROW_NUMBER(rowid) "ROW"
5 from dual
6 /
OBJECT FILE BLOCK ROW
---------- ---------- ---------- ----------
258 1 2082 0
필드 ROWNUM(또는 위의 쿼리에서는 ROWNUM)은 SELECT 쿼리에서 사용하는SQL 유사 컬럼 ROWNUM과 동일하지 않습니다.이는 결과 세트 내의 행에서 동적으로 생성된 ROWNUM에 불과합니다.
이 구현으로 인해 행, 블록, 익스텐트 및 세그먼트는 ROWID를 해제하지 않으면 전송할 수 없으므로 인덱스가 비활성화됩니다.
ROWID는 행이 있는 블록에 대한 가장 직접적인 액세스 경로로 행을 일의로 식별합니다.이는 해당 파일 내의 고유 파일과 고유 블록을 부호화하고 해당 블록 내의 고유 행을 부호화하기 때문입니다.
상세 정보:
참조: ROWID 형식의 DBMS 노트
주의:
Oracle이 데이터베이스 파일과 블록을 구조화하는 방법을 조금 이해하고 C 프로그래밍을 알고 있다면 ROWID에 의해 주어진 블록의 내용을 표시하는 프로그램을 쉽게 만들 수 있습니다(8k 또는 데이터베이스에서 사용되는 블록 사이즈가 무엇이든 간에 파일헤더사이즈 + BLOCKNO * BLOCK_SIZE에서 시작하는 블록).블록에는 블록 헤더가 포함되어 있고 그 후(테이블이 클러스터화되지 않은 것으로 가정), 각 행에 대해 블록 내의 상대 오프셋을 제공하는 rowdir가 포함됩니다.예를 들어 rowdir 내의 위치0은 블록 내의 0번째 행의 상대 오프셋이고, rowdir 내의 위치1은 1번째 행의 상대 위치입니다.행 수 자체는 블록 헤더 어딘가에 저장됩니다(블록 레이아웃에 대한 설명 참조).
약간의 프로그래밍 지식과 정확한 블록 레이아웃을 위해 Oracle 데이터베이스 파일의 설명서를 찾아보면 행이 디스크에 저장되는 방식을 확인할 수 있으며 행이 각 열에 대해 저장하는 모든 값도 재구성할 수 있습니다.각 행에는 행의 길이와 열 수에 대한 메타데이터가 포함되어 있으며, 각 열에 대해 열 유형과 바이트 크기 및 값을 나타냅니다.바이트 크기 0은 열 데이터가 비어 있음을 의미합니다(또는 NULL).
ROWID는 테이블 내의 행을 일의로 식별합니다.ROWNUM은 특정 쿼리의 결과 행 번호를 제공합니다.그 둘은 매우 다르며 서로 교환할 수 없다.
또한 ROWNUM의 최신 버전인 ROW_NUMBER도 있으며 동작은 약간 다릅니다.차이점을 설명하는 이 기사를 보세요.
ROWID에서는 기본적으로 동일한 데이터를 가진 2개의 행을 사용할 수 있습니다.한편, 통상, 프라이머리 키는 행보다 조금 더 의미 있는 것이 바람직합니다.ID는 행 간의 고유성을 자동으로 확인하는 단순한 방법입니다.
언급URL : https://stackoverflow.com/questions/2701782/rowid-oracle-any-use-for-it
'source' 카테고리의 다른 글
AngularJS 클라이언트 측 데이터 바인딩 및 서버 측 템플릿 생성 (0) | 2023.02.23 |
---|---|
angularjs는 간단한 카운트다운을 한다. (0) | 2023.02.23 |
HTTP 'Get' 서비스 응답을 AngularJS로 캐시하시겠습니까? (0) | 2023.02.23 |
WordPress의 하위 테마에서 위젯을 재정의하려면 어떻게 해야 합니까? (0) | 2023.02.23 |
TypeScript에서 "as const"는 무엇을 의미하며 그 사용 사례는 무엇입니까? (0) | 2023.02.23 |