programing

그룹화되지 않은 Oracle 결과:

newsource 2023. 10. 22. 20:05

그룹화되지 않은 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 byclause, 쿼리가 예상대로 작동합니다.

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