그룹화되지 않은 Oracle 결과:
Oracle Exadata에 대한 아래 쿼리를 실행하고 있습니다.
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64비트 프로덕션(파티셔닝, 실제 애플리케이션 클러스터, 자동 스토리지 관리, OLAP, 데이터 마이닝 및 실제 애플리케이션 테스트 옵션 포함)
select sum (t.sum_edw_trx_cnt)
from (
select max(x.edw_trx_cnt)sum_edw_trx_cnt,
x.prctr_cell_nbr
from p_prctr_smpl_pf_sp3 x
where mdld_prctr_flg = 'Y'
)t;
그 이후로 오라클에서 오류가 발생할 것으로 예상했습니다. 보시다시피 오류가 없습니다.group by
내부 쿼리 "t"에 있는 절인데 이 쿼리가 실패할 것으로 예상했습니다.
각각 수백만 개의 기록이 있습니다.prctr_cell_nbr
최대 카운트를 원하는 다음 외부 쿼리는 다음에 대한 최대 카운트를 합해야 합니다.prctr_cell
. 간단한 질문입니다.그러나 쿼리가 실행되고 출력이 반환됩니다.112
내부 쿼리의 최대 카운트입니다.
쿼리에서 반환된 결과가 아니기 때문에 저는 이 행동이 혼란스럽습니다.이건 알려진 행동이 아닌 것 같은데, 최근에 본 사람 있나요?
감사해요.
Optimizer에 의한 "select list pruning" 적용 효과를 확인할 수 있습니다.이 경우 버그로 간주됩니다. 인라인 뷰에 집계 함수가 포함되어 있고 메인 쿼리에 참조되지 않은 열이 없는 경우group by
절, optimizer는 단순히 참조되지 않은 열을 제거하기로 결정합니다(SLP - select list pruning).
환경: Windows x64; Oracle 12.1.0.1.0
-- test-table
create table t1 as
select level as col1
, level as col2
from dual
connect by level <= 7;
-- gather statistic on t1 table.
exec dbms_stats.gather_table_stats('', 'T1');
이제 10053 추적이 활성화된 상태에서 버그 쿼리를 실행하고 커버 아래에서 어떤 일이 발생할지 알아보겠습니다.
alter session set tracefile_identifier='no_group_by';
alter session set events '10053 trace name context forever';
select /*+ qb_name(outer) */ col1
from (
select /*+ qb_name(inner) */ max(col1) as col1
, col2
from t1
);
COL1
----------
7
alter session set events '10053 trace name context off';
예상치 못했습니다.ORA-00937
오류. 모든 것이 순조로웠습니다.이제 추적 파일:
OPTIMIZER INFORMATION
******************************************
----- Current SQL Statement for this session (sql_id=d14y7zuxvvfbw) -----
select /*+ qb_name(outer) */ col1
from (
select /*+ qb_name(inner)*/max(col1) as col1
, col2
from t1
)
*******************************************
.....
Query transformations (QT)
**************************
....
SVM: SVM bypassed: Single grp set fct (aggr) without group by.
/* That's where we lose our COL2 */
SLP: Removed select list item COL2 from query block INNER
query block OUTER (#0) unchanged
....
Final query after transformations:******* UNPARSED QUERY IS *******
SELECT /*+ QB_NAME ("OUTER") */ "from$_subquery$_001"."COL1" "COL1"
FROM (SELECT /*+ QB_NAME ("INNER") */ MAX("T1"."COL1") "COL1"
FROM "HR"."T1" "T1") "from$_subquery$_001"
그 해결책으로_query_rewrite_vop_cleanup
매개 변수를 다음과 같이 설정할 수 있습니다.false
. 그러나 운영 환경에서 이 매개 변수를 설정해야 하는 경우에는 당연히 오라클 지원부에 문의해야 합니다.
alter session set "_query_rewrite_vop_cleanup"=false;
session altered
select /*+ qb_name(outer) */ col1
from (
select /*+ qb_name(inner) */ max(col1) as col1
, col2
from t1
);
결과:
Error report -
SQL Error: ORA-00937: not a single-group group function
00937. 00000 - "not a single-group group function"
그리고 우리가 추가할 때는.group by
clause, 쿼리가 예상대로 작동합니다.
select /*+ qb_name(outer) */ col1
from (
select /*+ qb_name(inner) */ max(col1) as col1
, col2
from t1
group by col2
);
결과:
COL1
----------
1
6
2
4
5
3
7
MOS에 액세스할 수 있는 경우 1589317.1, 16989676.8(Bug 16989676 - 12.1.0.2 릴리스에서 수정되어야 함), Bug 8945586 노트를 살펴보십시오.
조항별 그룹을 제외하면 결과가 정확하지 않을 것 같습니다.외부 쿼리에 의한 결과는 내부 쿼리가 열별 그룹을 제외하는 것과 같은 단일 레코드를 생성할 때만 정확합니다.
-- 클래스별 그룹이 없으며 Oracle이 묵묵히 그룹별 그룹을 무시합니다.-- inner 쿼리를 실행하고 max numbre를 반환합니다.카운트 = 1을 나타내는 출력 참조 합계 선택(t.sum_edw_trx_cnt), 카운트(1)선택max(x.edw_trx_cnt)sum_edw_trx_cnt, x.prctr_cell_nbrfrom p_prctr_smpl_pf_sp3 x여기서 x.mdld_prctr_flg = 'Y')t; SUM(T)SUM_EDW_TRX_CNT) 카운트(1)----------------------------------112 1` -- 다음은 절별 그룹이 있는 쿼리입니다.-- 셀 수는 카운트로 표시되며 edw_trx_cnt의 합은-- 예상대로 19838749. `합계 선택(t.sum_edw_trx_cnt), 카운트(1)선택max(x.edw_trx_cnt)sum_edw_trx_cnt, x.prctr_cell_nbrfrom p_prctr_smpl_pf_sp3 x여기서 x.mdld_prctr_flg = 'Y'x.prctr_cell_nbr로 그룹화)t;' SUM(T)SUM_EDW_TRX_CNT) 카운트(1)----------------------------------19838749 14106326
언급URL : https://stackoverflow.com/questions/27322566/oracle-result-without-group-by
'programing' 카테고리의 다른 글
MySQL WITH RECURIC을 사용하여 계정의 계층도를 어떻게 수행합니까? (0) | 2023.10.22 |
---|---|
WebKitFormBoundary는 무엇을 의미합니까? (0) | 2023.10.22 |
문자열을 대문자로 분할 (0) | 2023.10.22 |
JVM 프로세스는 메모리를 어떻게 할당합니까? (0) | 2023.10.22 |
jQuery .close()와 비슷하지만 후손을 횡단합니까? (0) | 2023.10.22 |