오라클 인덱스
인덱스는 데이터 검색 효율성을 향상시키기 위해 사용되는 테이블의 개념적 부분입니다. Oracle은 일반적으로 인덱스를 통해 데이터를 쿼리하는 것이 전체 테이블 스캔보다 빠릅니다. Oracle은 실행 쿼리를 찾아내고 Oracle 최적화 프로그램은 Update 문에 대한 최상의 경로가 있을 때 인덱스를 사용합니다. 인덱스를 사용하면 여러 테이블을 조인할 때 효율성이 향상될 수도 있습니다. LONG 또는 LONG RAW 데이터 유형을 확인하기 위한 키(기본 키) 인덱스는 일반적으로 큰 테이블에서 특히 효과적이지만 작은 테이블을 스캔할 때 효율성을 높일 수도 있습니다. 인덱스를 사용하면 쿼리 효율성이 향상될 수 있지만 인덱스의 비용은 저장 공간이 필요하고 정기적인 유지 관리가 필요하다는 점입니다. 인덱스 자체도 테이블에 레코드가 추가되거나 삭제될 때마다 수정됩니다. 인덱스 열이 수정되면 각 레코드의 INSERT DELETE UPDATE에 추가 디스크 시간이 소요됩니다. 인덱스에는 추가 저장 공간이 필요하고 불필요한 인덱스를 처리하면 쿼리 응답 시간이 느려지므로 정기적인 인덱스 재구축이 필요합니다. p>
ALTER INDEX lt; REBUILD lt; TABLESPACENAMEgt;
( )EXISTS를 포함하는 쿼리를 제출할 때 DISTINCT를 사용하지 마세요. -대다 테이블 정보(예: 부서 테이블 및 직원 테이블) 일반적으로 RDBMS 핵심 모듈은 하위 쿼리 조건이 충족되면 즉시 결과를 반환하므로 쿼리를 더 빠르게 만들기 위해 EXISTS를 EXIST로 바꾸는 것을 고려할 수 있습니다. 비효율적): SELECT DISTINCT DEPT_NO DEPT_NAME FROM DEPT D EMP E WHERE D DEPT_NO = E DEPT_NO (효율적): SELECT DEPT_NO DEPT_NAME FROM DEPT D WHERE EXISTS (SELECT Oracle은 항상 SQL 문을 먼저 구문 분석하고 소문자를 대문자로 변환하므로 대문자를 사용합니다. 실행 전
() Java 코드에서는 커넥터 + 연결 문자열을 최대한 적게 사용하세요.
( ) 인덱스 열에는 NOT 사용을 피하세요. 일반적으로 인덱스 열에는 NOT 사용을 피해야 합니다. 인덱스 열에 함수를 사용하는 것과 동일한 영향을 미칩니다. Oracle은 NOT을 발견하면 인덱스 사용을 중지하고 전체 테이블 스캔을 수행합니다.
( ) WHERE 절에서 인덱스된 열에 대한 계산을 사용하지 마세요. 인덱스된 열이 함수의 일부인 경우 최적화 프로그램은 인덱스를 사용하지 않고 전체 테이블 스캔을 사용합니다.
예:
비효율적인 SELECT … FROM DEPT WHERE SAL * gt; ; 효율적: SELECT … FROM DEPT WHERE SAL gt;
() gt; 대신 gt; 사용
효율적 SELECT * FROM EMP WHERE DEPTNO gt; * FROM EMP WHERE DEPTNO gt;
둘 사이의 차이점은 이전 DBMS가 DEPT가 후자와 동일한 첫 번째 레코드로 직접 이동한다는 것입니다.
DEPT가
보다 큰 첫 번째 레코드로 앞으로 스캔합니다. ( ) OR를 UNION으로 바꿉니다(인덱스 열에 적용 가능).
일반적으로 UNION을 사용하여 WHERE 절을 바꿉니다. 인덱스 열에 OR을 사용하면 전체 테이블 스캔이 발생합니다. 위 규칙은 인덱스가 없는 열이 있는 경우에만 OR을 선택하지 않았기 때문에 쿼리 효율성이 저하될 수 있습니다. 다음 예에서 인덱스는 LOC_ID 및 REGION 모두에 구축됩니다.
효율적 SELECT LOC_ID LOC_DESC REGION FROM LOCATION WHERE LOC_ID = UNION SELECT LOC_ID LOC_DESC REGION FROM LOCATION WHERE REGION = MELBOURNE
비효율적: SELECT LOC_ID LOC_DESC REGION FROM LOCATION WHERE LOC_ID = OR REGION = MELBOURNE
( ) IN을 사용하여 OR 교체
이는 간단하고 기억하기 쉬운 규칙이지만 실제 실행 효과는 Oracle에서 테스트해야 합니다. 아래 두 가지의 실행 경로는 동일한 것 같습니다.
비효율적:
SELECT… FROM LOCATION WHERE LOC_ID = OR LOC_ID = OR LOC_ID =
효율적
SELECT… FROM LOCATION WHERE LOC_IN IN ( )
( ) 인덱스 열에 IS NULL 및 IS NOT NULL 사용 방지
인덱스에서 사용하지 마십시오. Null을 허용할 수 있는 모든 열은 Oracle에서 인덱스를 사용할 수 없습니다. 단일 열 인덱스의 경우 열에 Null 값이 포함되어 있으면 해당 레코드가 인덱스에 존재하지 않습니다. , 모든 열이 null인 경우 하나 이상의 열이 존재하지 않으면 해당 레코드는 인덱스에 존재하지 않습니다. 예를 들어 고유 인덱스가 열 A 및 테이블의 B에 A와 B(null) 값을 가진 레코드가 있는 경우 Oracle은 A와 B(null) 값이 동일한 다음 레코드를 허용하지 않습니다. 인덱스 열이 비어 있으면 Oracle은 전체 키 값이 비어 있는 것으로 간주하므로 동일한 키 값을 가진 레코드를 삽입할 수 있습니다. 물론 null 값이 존재하지 않기 때문입니다. 인덱스에서 열의 WHERE 절에 있는 인덱스 열의 Null 값 비교로 인해 ORACLE이 인덱스를 비활성화하게 됩니다.
비효율성: (인덱스 실패)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;
효율적(인덱스가 유효함)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE gt =
( )는 항상 index
인덱스가 여러 열에 구축된 경우 최적화 프로그램은 첫 번째 열(선행 열)이 where 절에서 참조되는 경우에만 인덱스를 사용하도록 선택합니다. 이 역시 간단하지만 중요한 규칙입니다. 인덱스의 두 번째 열만 참조하는 경우 최적화 프로그램은 전체 테이블 스캔을 사용하고 인덱스를 무시합니다.
( ) UNION을 UNION ALL로 교체(가능한 경우)
SQL 문이 실행될 때 두 개의 쿼리 결과 집합을 UNION해야 하는 경우 두 결과 집합은 UNION이 됩니다.
ALL 방식은 병합 후 정렬을 거쳐 최종 결과를 출력하는데, UNION 대신 UNION ALL을 사용하면 정렬이 필요하지 않아 효율성이 향상된다는 점에 유의해야 한다. 두 개의 결과 세트가 있으므로 비즈니스 요구 사항의 관점에서 UNION ALL 사용의 타당성을 분석하기 위해 UNION은 SORT_AREA_SIZE 메모리를 사용합니다. 다음 SQL도 매우 중요합니다. lixixinzhi/Article /program/Oracle/201311/16789 정렬 소비를 쿼리하는 데 사용할 수 있습니다.