Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Простой запрос Oracle возвращает неправильные результаты  [new]
SerSerSer
Member

Откуда:
Сообщений: 2
Случайно обнаружил странный баг. На сервере Oracle Enterprise Edition Release 11.1.0.7.0 под Windows 2008 при выполнении запроса:
select tisfc001.t$pdno, tisfc001.t$mitm, tisfc001.t$qrdr, whinh312.qrcr, tcibd001.t$dsca
from baan.ttisfc001201 tisfc001
inner join (select whinh312a.t$orno, whinh312a.t$item, sum(whinh312a.t$qrcr) as qrcr
            from baan.twhinh312201 whinh312a 
            group by whinh312a.t$orno, whinh312a.t$item
           ) whinh312 on whinh312.t$orno = tisfc001.t$pdno and whinh312.t$item = tisfc001.t$mitm
inner join baan.ttcibd001201 tcibd001 on tisfc001.t$mitm=tcibd001.t$item
--where tisfc001.t$pdno >= 'SZ1000040'
group by tisfc001.t$pdno, tisfc001.t$mitm, tisfc001.t$qrdr, whinh312.qrcr, tcibd001.t$dsca

в поле whinh312.qrcr для всех записей выдаётся одно и то же значение (на одном сервере 52, на другом точно таком же 130).
Если раскомментировать строку "where tisfc001.t$pdno >= 'SZ1000040'" или исключить из запроса поле tcibd001.t$dsca или завернуть этот запрос в конструкцию «select * from (этот запрос)» или заменить конструкцию «group by» на «distinct» или добавить хинт /*+RULE*/ или выполнить ещё какие-то неочевидные манипуляции, то начинают выдаваться корректные данные (ну, или другие некорректные данные).
Разумеется, подзапрос
select whinh312a.t$orno, whinh312a.t$item, sum(whinh312a.t$qrcr) as qrcr
from baan.twhinh312201 whinh312a 
group by whinh312a.t$orno, whinh312a.t$item

выдаёт корректные данные (в них, конечно, есть несколько строчек с qrcr=52, но подавляющее большинство другие).
Записей в таблицах: baan.TTISFC001201 - 563, baan.TWHINH312201 - 9658, baan.TTCIBD001201 - 11393.

Сами таблицы:
-- Create table
create table baan.TTISFC001201
(
  t$pdno    CHAR(9) not null,
  t$cprj    CHAR(9) not null,
  t$mitm    CHAR(47) not null,
  t$qrdr    NUMBER not null,
  t$rdld    DATE not null,
  t$cwar    CHAR(6) not null,
  t$revi    CHAR(6) not null,
  t$rwko    NUMBER not null,
  t$opro    CHAR(6) not null,
  t$efdt    DATE not null,
  t$rgrp    CHAR(6) not null,
  t$mfre    NUMBER not null,
  t$shsp    NUMBER not null,
  t$prcd    NUMBER not null,
  t$prlb    NUMBER not null,
  t$bfep    NUMBER not null,
  t$bfhr    NUMBER not null,
  t$rswc    NUMBER not null,
  t$trcp    CHAR(8) not null,
  t$clco    CHAR(6) not null,
  t$cctt    NUMBER not null,
  t$grid    CHAR(9) not null,
  t$osta    NUMBER not null,
  t$cdld    DATE not null,
  t$cada    DATE not null,
  t$fres    NUMBER not null,
  t$clot    CHAR(20) not null,
  t$lbid    CHAR(25) not null,
  t$defc    NUMBER not null,
  t$bloc    NUMBER not null,
  t$oprp    NUMBER not null,
  t$odpr    NUMBER not null,
  t$cpla    NUMBER not null,
  t$prdt    DATE not null,
  t$pldt    DATE not null,
  t$mmno    NUMBER not null,
  t$mmpo    NUMBER not null,
  t$plid    CHAR(9) not null,
  t$sfpl    CHAR(9) not null,
  t$apdt    DATE not null,
  t$cmdt    DATE not null,
  t$adld    DATE not null,
  t$cldt    DATE not null,
  t$qntl    NUMBER not null,
  t$qtdl    NUMBER not null,
  t$qdlv    NUMBER not null,
  t$qrjc    NUMBER not null,
  t$qtbf    NUMBER not null,
  t$qbfd    NUMBER not null,
  t$qoor    NUMBER not null,
  t$covn    NUMBER not null,
  t$roul    NUMBER not null,
  t$oprn    NUMBER not null,
  t$matl    NUMBER not null,
  t$matn    NUMBER not null,
  t$subn    NUMBER not null,
  t$chel    NUMBER not null,
  t$sawl    NUMBER not null,
  t$cutl    NUMBER not null,
  t$recn    NUMBER not null,
  t$insn    NUMBER not null,
  t$srnl    NUMBER not null,
  t$crpr$1  NUMBER not null,
  t$crpr$2  NUMBER not null,
  t$crpr$3  NUMBER not null,
  t$crpr$4  NUMBER not null,
  t$aprp    NUMBER not null,
  t$spcn    CHAR(22) not null,
  t$ofbp    CHAR(9) not null,
  t$subc    NUMBER not null,
  t$owns    NUMBER not null,
  t$mocp    NUMBER not null,
  t$reco    CHAR(6) not null,
  t$txta    NUMBER not null,
  t$cdf_ok  CHAR(30) not null,
  t$refcntd NUMBER not null,
  t$refcntu NUMBER not null
)
tablespace DATA
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate indexes 
create unique index baan.TTISFC001201$IDX1 on baan.TTISFC001201 (T$PDNO)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TTISFC001201$IDX2 on baan.TTISFC001201 (T$CPRJ, T$MITM, T$PDNO)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TTISFC001201$IDX3 on baan.TTISFC001201 (T$CPRJ, T$PDNO)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TTISFC001201$IDX4 on baan.TTISFC001201 (T$MITM, T$ADLD, T$PDNO)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TTISFC001201$IDX5 on baan.TTISFC001201 (T$PRCD, T$PDNO)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TTISFC001201$IDX6 on baan.TTISFC001201 (T$BLOC, T$PDNO)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TTISFC001201$IDX7 on baan.TTISFC001201 (T$GRID, T$PDNO)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TTISFC001201$IDX8 on baan.TTISFC001201 (T$PRDT, T$PDNO)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Grant/Revoke object privileges 
grant select, insert, update, delete on baan.TTISFC001201 to R_BAAN;


-- Create table
create table baan.TWHINH312201
(
  t$rcno    CHAR(9) not null,
  t$rcln    NUMBER not null,
  t$oorg    NUMBER not null,
  t$orno    CHAR(9) not null,
  t$oset    NUMBER not null,
  t$pono    NUMBER not null,
  t$seqn    NUMBER not null,
  t$sfbp    CHAR(9) not null,
  t$item    CHAR(47) not null,
  t$cmnf    CHAR(6) not null,
  t$mpnr    CHAR(35) not null,
  t$effn    NUMBER not null,
  t$revi    CHAR(6) not null,
  t$serl    CHAR(30) not null,
  t$clot    CHAR(20) not null,
  t$rcun    CHAR(3) not null,
  t$qrcr    NUMBER not null,
  t$qrec    NUMBER not null,
  t$qapr    NUMBER not null,
  t$qdes    NUMBER not null,
  t$qrej    NUMBER not null,
  t$qadv    NUMBER not null,
  t$qput    NUMBER not null,
  t$qadi    NUMBER not null,
  t$qpui    NUMBER not null,
  t$psno    CHAR(30) not null,
  t$psqr    NUMBER not null,
  t$psqu    NUMBER not null,
  t$psun    CHAR(3) not null,
  t$cwar    CHAR(6) not null,
  t$rclo    CHAR(10) not null,
  t$dslo    CHAR(10) not null,
  t$pkdf    CHAR(6) not null,
  t$pmsk    CHAR(20) not null,
  t$acti    CHAR(20) not null,
  t$lsta    NUMBER not null,
  t$cmpl    NUMBER not null,
  t$fire    NUMBER not null,
  t$conf    NUMBER not null,
  t$insp    NUMBER not null,
  t$cdck    NUMBER not null,
  t$cdcr    NUMBER not null,
  t$dmse    NUMBER not null,
  t$qdms    NUMBER not null,
  t$arej    NUMBER not null,
  t$ardt    DATE not null,
  t$shdt    DATE not null,
  t$idat    DATE not null,
  t$trdt    DATE not null,
  t$refe    CHAR(30) not null,
  t$ltbp    CHAR(30) not null,
  t$exhu    CHAR(25) not null,
  t$huid    CHAR(25) not null,
  t$shid    CHAR(9) not null,
  t$shsq    NUMBER not null,
  t$load    CHAR(9) not null,
  t$shpm    CHAR(9) not null,
  t$wght    NUMBER not null,
  t$wtun    CHAR(3) not null,
  t$cpro    CHAR(30) not null,
  t$blck    NUMBER not null,
  t$resn    CHAR(6) not null,
  t$logn    CHAR(16) not null,
  t$casi    CHAR(3) not null,
  t$tsrl    CHAR(30) not null,
  t$tlot    CHAR(20) not null,
  t$exrr    CHAR(20) not null,
  t$spcn    CHAR(22) not null,
  t$disp    NUMBER not null,
  t$txtn    NUMBER not null,
  t$itxt    NUMBER not null,
  t$refcntd NUMBER not null,
  t$refcntu NUMBER not null
)
tablespace DATA
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate indexes 
create unique index baan.TWHINH312201$IDX1 on baan.TWHINH312201 (T$RCNO, T$RCLN)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TWHINH312201$IDX2 on baan.TWHINH312201 (T$OORG, T$ORNO, T$OSET, T$PONO, T$SEQN, T$RCNO, T$RCLN)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TWHINH312201$IDX3 on baan.TWHINH312201 (T$PSNO, T$SFBP, T$OORG, T$ORNO, T$OSET, T$PONO, T$SEQN, T$RCNO, T$RCLN)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TWHINH312201$IDX4 on baan.TWHINH312201 (T$OORG, T$ORNO, T$PONO, T$SEQN, T$RCNO, T$RCLN)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TWHINH312201$IDX5 on baan.TWHINH312201 (T$ITEM, T$CWAR, T$RCNO, T$RCLN)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TWHINH312201$IDX6 on baan.TWHINH312201 (T$RCNO, T$OORG, T$ORNO, T$OSET, T$PONO, T$SEQN, T$RCLN)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TWHINH312201$IDX7 on baan.TWHINH312201 (T$LSTA, T$RCNO, T$RCLN)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TWHINH312201$IDX8 on baan.TWHINH312201 (T$CWAR, T$ITEM, T$RCNO, T$RCLN)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TWHINH312201$IDX9 on baan.TWHINH312201 (T$SFBP, T$RCNO, T$RCLN)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Grant/Revoke object privileges 
grant select, insert, update, delete on baan.TWHINH312201 to R_BAAN;


-- Create table
create table baan.TTCIBD001201
(
  t$item    CHAR(47) not null,
  t$kitm    NUMBER not null,
  t$citg    CHAR(6) not null,
  t$itmt    NUMBER not null,
  t$dsca    CHAR(30) not null,
  t$dscb    CHAR(8) not null,
  t$dscc    CHAR(12) not null,
  t$dscd    CHAR(8) not null,
  t$seak    CHAR(16) not null,
  t$seab    CHAR(16) not null,
  t$uset    CHAR(6) not null,
  t$cuni    CHAR(3) not null,
  t$cwun    CHAR(3) not null,
  t$wght    NUMBER not null,
  t$ctyp    CHAR(3) not null,
  t$ltct    NUMBER not null,
  t$csel    CHAR(3) not null,
  t$csig    CHAR(3) not null,
  t$ctyo    CHAR(3) not null,
  t$cpcl    CHAR(6) not null,
  t$cood    CHAR(9) not null,
  t$eitm    NUMBER not null,
  t$umer    NUMBER not null,
  t$cpln    CHAR(6) not null,
  t$ccde    CHAR(25) not null,
  t$cmnf    CHAR(6) not null,
  t$cean    CHAR(14) not null,
  t$cont    NUMBER not null,
  t$cntr    CHAR(3) not null,
  t$cprj    CHAR(9) not null,
  t$repl    NUMBER not null,
  t$cpva    NUMBER not null,
  t$dfit    CHAR(47) not null,
  t$stoi    NUMBER not null,
  t$cpcp    CHAR(8) not null,
  t$unef    NUMBER not null,
  t$ichg    NUMBER not null,
  t$uefs    NUMBER not null,
  t$seri    NUMBER not null,
  t$styp    NUMBER not null,
  t$psiu    NUMBER not null,
  t$efco    CHAR(8) not null,
  t$indt    DATE not null,
  t$chma    NUMBER not null,
  t$edco    NUMBER not null,
  t$mcoa    NUMBER not null,
  t$opts    NUMBER not null,
  t$envc    NUMBER not null,
  t$sayn    NUMBER not null,
  t$subc    NUMBER not null,
  t$srce    NUMBER not null,
  t$lmdt    DATE not null,
  t$txta    NUMBER not null,
  t$knmr    CHAR(50) not null,
  t$ldsc    CHAR(100) not null,
  t$dsc2    CHAR(50) not null,
  t$refcntd NUMBER not null,
  t$refcntu NUMBER not null
)
tablespace DATA
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate indexes 
create unique index baan.TTCIBD001201$IDX1 on baan.TTCIBD001201 (T$ITEM)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TTCIBD001201$IDX2 on baan.TTCIBD001201 (T$SEAK, T$ITEM)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TTCIBD001201$IDX3 on baan.TTCIBD001201 (T$SEAB, T$ITEM)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TTCIBD001201$IDX4 on baan.TTCIBD001201 (T$CITG, T$ITEM)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TTCIBD001201$IDX5 on baan.TTCIBD001201 (T$CEAN, T$ITEM)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TTCIBD001201$IDX6 on baan.TTCIBD001201 (T$KITM, T$ITEM)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TTCIBD001201$IDX7 on baan.TTCIBD001201 (T$DFIT, T$ITEM)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TTCIBD001201$IDX8 on baan.TTCIBD001201 (T$CPVA, T$CPRJ, T$ITEM)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create unique index baan.TTCIBD001201$IDX9 on baan.TTCIBD001201 (T$CPRJ, T$ITEM)
  tablespace INDX
  pctfree 5
  initrans 3
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Grant/Revoke object privileges 
grant select, insert, update, delete on baan.TTCIBD001201 to R_BAAN;


Последнюю таблицу baan.TTCIBD001201 можно заменить на простейшую
-- Create table
create table TEST001
(
  t$item CHAR(47) not null,
  t$dsca CHAR(30) not null
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

и оставить в ней пару записей, при этом общее поведение запроса сохраняется.
20 дек 11, 17:42    [11798788]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос Oracle возвращает неправильные результаты  [new]
samatom
Member

Откуда: Москва
Сообщений: 367
SerSerSer,
group by tisfc001.t$pdno, tisfc001.t$mitm, tisfc001.t$qrdr, whinh312.qrcr, tcibd001.t$dsca

в чем смысл этой группировки в конце запроса, если нет агрегатной функции?
Возможно, имеет место быть битый индекс - перестройте.
20 дек 11, 21:01    [11799752]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос Oracle возвращает неправильные результаты  [new]
SerSerSer
Member

Откуда:
Сообщений: 2
Сначала это был более сложный запрос (с агрегатными функциями), который я понемногу порезал для локализации бага.
Перестройку индексов уже раньше пробовали - не помогала.
Сейчас баг пропал сам собой. Видимо, поменялись данные в таблицах и Oracle теперь строит немного другой план запроса...
В общем, загадка осталась, но воспроизвести её теперь не получается.
28 дек 11, 14:56    [11839882]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить