오라클 임시 테이블에 인덱스를 올려도 안전합니까?
저는 다른 사람들의 테이블 통계를 망치기 때문에 임시 테이블을 분석해서는 안 된다는 것을 읽었습니다.색인은 어떻습니까?프로그램 기간 동안 테이블에 인덱스를 놓으면 테이블을 사용하는 다른 프로그램이 해당 인덱스의 영향을 받을 수 있습니까?
인덱스가 내 프로세스와 테이블을 사용하는 다른 모든 프로세스에 영향을 미칩니까?아니면 프로세스에만 영향을 미칩니까?
어떤 답변도 권위적인 답변이 없었기 때문에, 저는 그와 같은 뇌물을 제공합니다.
인덱스가 내 프로세스와 테이블을 사용하는 다른 모든 프로세스에 영향을 미칩니까?아니면 프로세스에만 영향을 미칩니까?
제 생각엔 우리가 말하는 것 같습니다.GLOBAL TEMPORARY
테이블
임시 테이블은 시스템 사전에 저장된 템플릿에서 각 프로세스가 즉시 만들고 삭제하는 여러 테이블로 구성됩니다.
Oracle
,DML
상당한temporary table
표에 포함된 데이터는 해당 데이터를 사용하는 하나의 프로세스에만 영향을 미치지만 모든 프로세스에는 영향을 미칩니다.
의데에 있는 temporary table
세션 범위 내에서만 볼 수 있습니다.그것은 사용합니다.TEMPORARY TABLESPACE
데이터와 가능한 인덱스를 모두 저장합니다.
DML
당분간temporary table
(즉, 열 이름 및 인덱스를 포함한 레이아웃) 충분한 권한을 가진 모든 사용자가 볼 수 있습니다.
이것은 인덱스의 존재가 테이블을 사용하는 다른 프로세스뿐만 아니라 프로세스에도 영향을 미친다는 것을 의미합니다. 즉, 테이블에서 데이터를 수정하는 프로세스는temporary table
또한 인덱스를 수정해야 합니다.
반대로 테이블(및 인덱스에도 포함됨)에 포함된 데이터는 해당 데이터를 생성한 프로세스에만 영향을 미치고 다른 프로세스에도 표시되지 않습니다.
한 프로세스에서 인덱스를 사용하고 다른 프로세스에서 인덱스를 사용하지 않으려면 다음을 수행하십시오.
- 개의 두개만을 .
temporary tables
한 열 - 그 중 하나에 대한 색인
- 프로세스에 따라 인덱싱된 테이블 또는 인덱싱되지 않은 테이블 사용
임시로 생성된 후 삭제된 일반 테이블이 아니라 실제 Oracle 임시 테이블을 참조하는 것으로 간주됩니다.예, 임시 테이블에 인덱스를 만드는 것이 안전하며 일반 테이블 및 인덱스와 동일한 규칙에 따라 사용됩니다.
[편집] 질문을 다듬으셨군요. 여기 다소 세련된 답변이 있습니다.
시작:
Oracle® Database Administrator's Guide
10g Release 2 (10.2)
Part Number B14231-02
"임시 테이블에 인덱스를 만들 수 있습니다.또한 임시 데이터이며 인덱스의 데이터는 기본 테이블의 데이터와 동일한 세션 또는 트랜잭션 범위를 가집니다."
트랜잭션 범위에서 효율적인 처리를 위해 인덱스가 필요한 경우에는 통계에 테이블에 대한 행이 표시되지 않으므로 쿼리에 명시적으로 힌트를 주어야 합니다.
당신은 두 가지 다른 것, 즉 지수와 통계에 대해 묻고 있습니다.인덱스의 경우, 예, 임시 테이블에 인덱스를 작성할 수 있습니다. 인덱스는 정상적으로 유지됩니다.
통계의 경우 쿼리 시 테이블의 평균 크기를 나타내도록 테이블의 통계를 명시적으로 설정하는 것이 좋습니다.Oracle이 자체적으로 통계를 수집하도록 허용하는 경우 통계 프로세스는 테이블에서 아무것도 찾을 수 없으므로(정의상 테이블의 데이터는 트랜잭션의 로컬 데이터이므로) 부정확한 결과를 반환합니다.
예를 들어, 다음을 수행할 수 있습니다.
exec dbms_stats.set_table_stats(user, 'my_temp_table', numrows=>10, numblks=>4)
또 다른 유용한 정보는 임시 테이블의 크기가 매우 다양하고 트랜잭션 내에서 임시 테이블에 있는 행 수를 알고 있는 경우 해당 정보를 제공하여 최적화 도구를 지원할 수 있다는 것입니다.저는 당신이 온도 테이블에서 일반 테이블로 가입할 때 이것이 많은 도움이 된다는 것을 알게 되었습니다.
예를 들어, 온도 테이블에 약 100개의 행이 있는 경우 다음을 수행할 수 있습니다.
SELECT /*+ CARDINALITY(my_temp_table 100) */ * FROM my_temp_table
음, 제가 해봤는데 색인이 보이고 두 번째 세션에서 사용되었습니다.인덱스가 정말로 필요한 경우 데이터에 대한 새 글로벌 임시 테이블을 만드는 것이 더 안전합니다.
또한 다른 세션이 테이블에 액세스하는 동안에는 인덱스를 만들 수 없습니다.
제가 실행한 테스트 사례는 다음과 같습니다.
--first session
create global temporary table index_test (val number(15))
on commit preserve rows;
create unique index idx_val on index_test(val);
--second session
insert into index_test select rownum from all_tables;
select * from index_test where val=1;
동적 샘플링 힌트(10g)를 사용할 수도 있습니다.
/*+ DYNAMIC_SAMPLING (3) */ index_test에서 val을 선택합니다. 여기서 val = 1;
다른 세션에서 사용하는 동안에는 임시 테이블에 인덱스를 작성할 수 없으므로, 다른 프로세스에 영향을 줄 수 없습니다.
다른 세션의 경우 임시 테이블이 비어 있어 인덱스 값에 액세스할 수 없으므로 기존 인덱스는 현재 세션에만 영향을 미칩니다.
세션 1:
SQL> create global temporary table index_test (val number(15)) on commit preserve rows;
Table created.
SQL> insert into index_test values (1);
1 row created.
SQL> commit;
Commit complete.
SQL>
세션 2(세션 1이 연결되어 있는 동안):
SQL> create unique index idx_val on index_test(val);
create unique index idx_val on index_test(val)
*
ERROR at line 1:
ORA-14452: attempt to create, alter or drop an index on temporary table already in use
SQL>
세션 1로 돌아가기:
SQL> delete from index_test;
1 row deleted.
SQL> commit;
Commit complete.
SQL>
세션 2:
SQL> create unique index idx_val on index_test(val);
create unique index idx_val on index_test(val)
*
ERROR at line 1:
ORA-14452: attempt to create, alter or drop an index on temporary table already in use
SQL>
계속 실패하면 먼저 세션 1의 연결을 끊거나 테이블을 잘라내야 합니다.
세션 1:
SQL> truncate table index_test;
Table truncated.
SQL>
이제 세션 2에서 인덱스를 만들 수 있습니다.
SQL> create unique index idx_val on index_test(val);
Index created.
SQL>
물론 이 색인은 모든 세션에서 사용됩니다.
언급URL : https://stackoverflow.com/questions/941094/is-it-safe-to-put-an-index-on-an-oracle-temporary-table
'programing' 카테고리의 다른 글
JPA Lazy Loading이 Spring boot에서 작동하지 않습니다. (0) | 2023.07.21 |
---|---|
테이블의 그룹화된 레코드별 실행 총계 (0) | 2023.07.21 |
일정한 시간이 지난 후에 중단되는 경우 Spring Scheduled 실행 중지 (0) | 2023.07.21 |
파이썬에서 "EOF가 아닌 동안"에 대한 완벽한 대응물은 무엇입니까? (0) | 2023.07.21 |
자바.java.javaClassCastException: javax.xml.bind입니다.JAXB 요소를 캐스트할 수 없습니다. (0) | 2023.07.21 |