[SQL] SQL에서 조건을 실행하기 위해 '어디에'조항
SQLSQL에서 조건을 실행하기 위해 '어디에'조항
내가 좋아하는 내 where 절에 조건의 집합이
WHERE
d.attribute3 = 'abcd*'
AND x.STATUS != 'P'
AND x.STATUS != 'J'
AND x.STATUS != 'X'
AND x.STATUS != 'S'
AND x.STATUS != 'D'
AND CURRENT_TIMESTAMP - 1 < x.CREATION_TIMESTAMP
이러한 조건 중 어느 것이 먼저 실행됩니다? 나는 오라클을 사용하고 있습니다.
내 실행 계획에서 이러한 정보를 얻을 수 있습니까? (나는 다른 내가 시도 것, 여기에 DB에 그렇게 할 수있는 권한이 없습니다)
해결법
-
==============================
1.당신은 확실히 당신은 실행 계획을 볼 수있는 "권한이없는"있습니까? AUTOTRACE를 사용하는 방법에 대한 무엇?
당신은 확실히 당신은 실행 계획을 볼 수있는 "권한이없는"있습니까? AUTOTRACE를 사용하는 방법에 대한 무엇?
SQL> set autotrace on SQL> select * from emp 2 join dept on dept.deptno = emp.deptno 3 where emp.ename like 'K%' 4 and dept.loc like 'l%' 5 / no rows selected Execution Plan ---------------------------------------------------------- ---------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ---------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 62 | 4 (0)| | 1 | NESTED LOOPS | | 1 | 62 | 4 (0)| |* 2 | TABLE ACCESS FULL | EMP | 1 | 42 | 3 (0)| |* 3 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 20 | 1 (0)| |* 4 | INDEX UNIQUE SCAN | SYS_C0042912 | 1 | | 0 (0)| ---------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("EMP"."ENAME" LIKE 'K%' AND "EMP"."DEPTNO" IS NOT NULL) 3 - filter("DEPT"."LOC" LIKE 'l%') 4 - access("DEPT"."DEPTNO"="EMP"."DEPTNO")
당신이 볼 수 있듯이, 그 쿼리를 실행하는 방법에 대해 자세히 꽤 많이 있습니다. 그것은 저에게 말한다 :
응용 프로그램이 순서는 우리가이 재 주문 쿼리를 보여줄 수있는 술어는 WHERE 절에서 정렬하는 방법과 아무 상관이 :
SQL> select * from emp 2 join dept on dept.deptno = emp.deptno 3 where dept.loc like 'l%' 4 and emp.ename like 'K%'; no rows selected Execution Plan ---------------------------------------------------------- ---------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ---------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 62 | 4 (0)| | 1 | NESTED LOOPS | | 1 | 62 | 4 (0)| |* 2 | TABLE ACCESS FULL | EMP | 1 | 42 | 3 (0)| |* 3 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 20 | 1 (0)| |* 4 | INDEX UNIQUE SCAN | SYS_C0042912 | 1 | | 0 (0)| ---------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("EMP"."ENAME" LIKE 'K%' AND "EMP"."DEPTNO" IS NOT NULL) 3 - filter("DEPT"."LOC" LIKE 'l%') 4 - access("DEPT"."DEPTNO"="EMP"."DEPTNO")
-
==============================
2.데이터베이스가있는 조건을 실행하기 위해 어떤 순서로 결정합니다.
데이터베이스가있는 조건을 실행하기 위해 어떤 순서로 결정합니다.
가능한 보통 (항상은 아니지만) 먼저 인덱스를 사용합니다.
-
==============================
3.로하고있다 당신에게 정보를 줄 것이다 실행 계획을보고했다. 당신이 계획의 안정성 기능을 사용하지 않는 그러나, 당신은 항상 동일하게 남아있는 실행 계획에 의존 할 수 없다.
로하고있다 당신에게 정보를 줄 것이다 실행 계획을보고했다. 당신이 계획의 안정성 기능을 사용하지 않는 그러나, 당신은 항상 동일하게 남아있는 실행 계획에 의존 할 수 없다.
당신이 게시 된 쿼리의 경우, 나는 약 효율은 당신이 생각하는 것 같다, 그래서 어떤 방법으로 로직을 변경됩니다 평가 순서처럼 보이지 않는다. 그것은 매우 가능성이 오라클 최적화 효율적인 계획을 선택하는 것입니다.
당신은 기본 쿼리 성능을 비교하려는 경우 특정 순서를 장려하기 위해 할 수있는 트릭이있다. 먼저 실행되는 타임 스탬프 조건을 원했다는 것을 예를 들어 보겠습니다. 이 작업을 수행 할 수 있습니다 :
WITH subset AS ( SELECT /*+ materialize */ FROM my_table WHERE CURRENT_TIMESTAMP - 1 < x.CREATION_TIMESTAMP ) SELECT * FROM subset WHERE d.attribute3 = 'abcd*' AND x.STATUS != 'P' AND x.STATUS != 'J' AND x.STATUS != 'X' AND x.STATUS != 'S' AND x.STATUS != 'D'
은 "구체화"힌트는, 제 인라인 쿼리를 실행 다른 조건이 결과 세트를 검색하기 위해 최적화를 야기한다.
난 당신이 일반적인 습관으로 이렇게 조언하고 있지 않다. 대부분의 경우 단지 최적의 실행 계획으로 이어질 것입니다 간단한 쿼리를 작성.
-
==============================
4.는 CPU 기반 비용 모델 9i의 도입 및 10g + 오라클에서 기본적으로 사용에서, 실행 계획에 다른 의견을 추가하려면 또한 술어 평가 순서가이 영향을 미치지 않는 경우에도 낮은 계산 비용 발생합니다있는 평가를 할 것입니다 테이블 액세스 순서 및 방법에 관한 것이다. 적은 조건 계산 결과의 다른 전에 술어를 실행함으로써 실행되는 경우 다음 optimisaton 적용 할 수있다.
는 CPU 기반 비용 모델 9i의 도입 및 10g + 오라클에서 기본적으로 사용에서, 실행 계획에 다른 의견을 추가하려면 또한 술어 평가 순서가이 영향을 미치지 않는 경우에도 낮은 계산 비용 발생합니다있는 평가를 할 것입니다 테이블 액세스 순서 및 방법에 관한 것이다. 적은 조건 계산 결과의 다른 전에 술어를 실행함으로써 실행되는 경우 다음 optimisaton 적용 할 수있다.
자세한 내용은이 문서를 참조하십시오 http://www.oracle.com/technology/pub/articles/lewis_cbo.html
점검 제한 조건 또는 파티션 정의와 비교 행이 어쨌든 반환 될 수 있음을 나타냅니다 경우 또한, 오라클은 심지어 술어를 실행할 필요가 없습니다.
복잡한 물건.
-
==============================
5.마지막으로, 관계형 데이터베이스 이론은 당신이 그렇게 최선의 노력하지 않는 쿼리 조항의 실행 순서에 의존하지 않을 수 있다고 말한다. 다른 사람이 말했듯이, 비용 기반이 생각하는 것을 선택하려고 최적화가 가장 좋지만에도 사용되는 실제 순서를 보장하지 않습니다 계획을 설명하는보기. 계획을 설명하는 것은 단지 CBO 권장 무엇인지를 알 수 있지만, 아직 100 % 아니다.
마지막으로, 관계형 데이터베이스 이론은 당신이 그렇게 최선의 노력하지 않는 쿼리 조항의 실행 순서에 의존하지 않을 수 있다고 말한다. 다른 사람이 말했듯이, 비용 기반이 생각하는 것을 선택하려고 최적화가 가장 좋지만에도 사용되는 실제 순서를 보장하지 않습니다 계획을 설명하는보기. 계획을 설명하는 것은 단지 CBO 권장 무엇인지를 알 수 있지만, 아직 100 % 아니다.
당신이이 일을하려는 이유를 설명 어쩌면 경우, 일부는 계획을 제안 할 수 있을까?
-
==============================
6.까다로운 질문입니다. 그냥 같은 딜레마에 직면했다. 나는 쿼리 내에서 기능을 언급 할 필요가있다. 당신이 일반적으로 성능에 영향을 미치는 방법을 이해 있도록 기능 자체는 다른 쿼리를합니다. 조건의 나머지 부분이 먼저 실행한다면 우리가 가지고있는 대부분의 경우, 함수가 너무 자주 호출 할 수 없습니다 것입니다.
까다로운 질문입니다. 그냥 같은 딜레마에 직면했다. 나는 쿼리 내에서 기능을 언급 할 필요가있다. 당신이 일반적으로 성능에 영향을 미치는 방법을 이해 있도록 기능 자체는 다른 쿼리를합니다. 조건의 나머지 부분이 먼저 실행한다면 우리가 가지고있는 대부분의 경우, 함수가 너무 자주 호출 할 수 없습니다 것입니다.
음, 여기에 주제에 대한 다른 기사를 게시하는 것이 유용 할 것이라고 생각했다.
다음의 인용문은 도널드 Burleson의 사이트 (http://www.dba-oracle.com/t_where_clause.htm)에서 복사됩니다.
from https://stackoverflow.com/questions/340139/execution-order-of-conditions-in-sql-where-clause by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 2008 SQL에 원자 MERGE 문인가? (0) | 2020.07.07 |
---|---|
[SQL] SQL Server 관리 Studio에서 IntelliSense를 분실 (0) | 2020.07.07 |
[SQL] PostgreSQL은 외래 키 삽입 삽입, / 옆 널빤지를 중첩 (0) | 2020.07.07 |
[SQL] BigQuery에 날짜 - 분할 뷰 (0) | 2020.07.07 |
[SQL] 뷰에서 - 과학 표기법 (> 숫자 VARCHAR에서) 캐스팅 (0) | 2020.07.07 |