Oracle에서 ORDER BY 다음에 +0이 표시되는 것은 무엇입니까?
이 Oracle 9i 쿼리의 끝에 있는 +0이 무엇을 의미하는지 이해하려고 합니다.
SELECT /*+ INDEX (a CODE_ZIP_CODE_IX) */
a.city,
a.state,
LPAD(a.code,5,0) ZipCode,
b.County_Name CoName,
c.Description RegDesc,
d.Description RegTypeDesc
FROM TBL_CODE_ZIP a,
TBL_CODE_COUNTY b,
TBL_CODE_REGION c,
TBL_CODE_REGION_TYPE d
WHERE a.City = 'LONDONDERRY'
AND a.State = 'NH'
AND lpad(a.Code,5,0) = '03038'
AND a.Region_Type_Code = 1
AND b.County(+) = a.County_Code
AND b.STATE(+) = a.STATE
AND c.Code(+) = a.Region_Code
AND d.Code(+) = a.Region_Type_Code
ORDER BY a.Code +0
아이디어 있어요?
참고: a 사이에 scordescript를 추가할 수 없기 때문에 오름차순이나 내림차순과 관련이 없다고 생각합니다.코드와 +0 그리고 +0 뒤에 scordescript를 추가할 수 있습니다.
그+ 0
는 규칙 기반 최적화 도구 시절의 트릭으로, 숫자 열의 인덱스를 사용할 수 없었습니다.마찬가지로, 그들은 했습니다.|| ''
영숫자 열의 경우.
당신의 질문에 대해, 제가 그것을 조사한 후에 도달할 수 있는 유일한 결론은 그것의 제작자가 성능에 어려움을 겪고 있었다는 것입니다.만약 (내가 추측하기로는) 인덱스 CODE_ZIP_CODE_IX가 TBL_CODE_ZIP(Code)의 인덱스라면 쿼리는 이 인덱스를 사용할 것이라고 암시하더라도 사용하지 않을 것입니다.작성자는 아마도 a.code 대신 LPAD(a.code, 5,0)를 사용하면 인덱스를 사용할 수 없다는 것을 알지 못했을 것입니다.절별 순서는 메모리에 있는 중간 결과 집합을 가져와서 정렬합니다.이를 위해 색인이 필요하지 않습니다.하지만 그것과 함께.+ 0
그는 그것을 무력화시키려고 생각했던 것 같습니다.
따라서, 사용된 속임수는 효과적이지 않았고, 이제 여러분이 발견한 것처럼 오해를 불러일으킬 뿐입니다.
안녕, 롭.
PS1: LPAD(TO_CHAR(a.code),5,'0') 또는 TO_CHAR(a.code,'fm00009')를 사용하는 것이 좋습니다.그러면 데이터 유형으로 무엇을 하고 있는지 분명해집니다.
PS2: LPAD(TO_CHAR(a.code), 5, '0')에 기반한 함수 기반 인덱스를 사용하거나 우편번호를 왼쪽으로 이동할 때 사용하는 표현식을 사용하면 쿼리에 도움이 될 수 있습니다.
a.code는 숫자 문자열을 포함하는 VARCHAR2이고 +0은 숫자에 효과적으로 캐스팅되어 정렬이 알파가 아닌 숫자가 될 것입니다.
+0 다음에 ASC/DESC를 추가할 수 있어야 합니다.
참고: 저는 이 답변을 삭제했습니다. 왜냐하면 마크 B가 더 빠른 타이피스트였기 때문입니다.하지만 Lucas가 게시한 SQL의 근본적인 의도가 무엇이었는지 입증하는 데 가치가 있다고 생각하기 때문에 다시 설치했습니다.
CODE가 숫자 문자열(zip 코드)을 포함하는 VARCHAR2 열이었다고 가정합니다.문제는 막대가 숫자가 아닌 문자열로 정렬된다는 것입니다.CODE에 0을 추가하면 숫자에 암시적 캐스트가 생성되므로 숫자로 정렬됩니다.
SQL> select id, code
2 from t72
3 order by code
4 /
ID CODE
---------- -----
1 1
2 11
3 111
4 12
SQL> select id, code
2 from t72
3 order by code+0
4 /
ID CODE
---------- -----
1 1
2 11
4 12
3 111
SQL>
저장된 코드에 0이 왼쪽으로 붙여졌다면 어차피 숫자 순서로 정렬할 것이기 때문에 캐스트가 필요하지 않았을 것입니다.
다른 사람들이 관찰했듯이 TO_NUMBER()를 사용하는 것이 더 나은 선택이었을 것입니다.+0은 명시적인 캐스팅보다 명확하지 않으며 의도를 명확하게 하는 것이 항상 좋습니다.
다음에 대한 인덱스가 있습니까?TBL_CODE_ZIP.Code
옵티마이저가 쿼리의 해당 부분에 대해 인덱스를 사용하지 않도록 하기 위해 숫자에 0을 추가하는 쿼리(또는 문자열에 ")를 본 적이 있습니다. (물론 인덱스를 사용하지 않는 적절한 방법은 적절한 힌트를 추가하는 것입니다.)
원래 작성자가 인덱스 검색에 ORDER BY를 최적화하는 데 문제가 있어 쿼리 실행 속도가 느려지는 문제가 발생했을 수 있습니다. 따라서 +0을 추가하여 다른 액세스 경로를 적용하고 일반 정렬을 수행했습니다.
먼저 답변을 드려서 죄송합니다. 왜냐하면 지금은 매우 오래된 질문이기 때문입니다.그러나 +0은 데이터베이스에 인덱스를 무시하라는 힌트입니다(에 있는 경우).이 특정 쿼리에 대해 코드 열),
일부 시간 인덱스는 검색 속도를 빠르게 하는 반면, 데이터베이스의 최적화 모드에 따라 검색 속도를 매우 느리게 하는 경우도 있습니다.
이제 두 가지 옵션이 있습니다. +0 힌트를 사용하거나 .code에서 동일한 속도를 얻을 경우 인덱스를 삭제합니다.
언급URL : https://stackoverflow.com/questions/3196611/what-does-0-mean-after-an-order-by-in-oracle
'programing' 카테고리의 다른 글
ViewStateMode와 EnableViewState 비교 (0) | 2023.08.04 |
---|---|
asp.net : 잘못된 포스트백 또는 콜백 인수 (0) | 2023.08.04 |
Spring Boot : 'jpaMappingContext' 이름의 bone을 만드는 중 오류가 발생했습니다. java.lang.Null 포인터예외. (0) | 2023.08.04 |
MySQL EXPLE: "인덱스 사용" vs."인덱스 조건 사용" (0) | 2023.08.04 |
이미지를 NSUserDefaults에 저장하시겠습니까? (0) | 2023.08.04 |