우리는 생산에있어서 고유 한 문제가 있습니다. 한밤중에 배치주기 동안 Oracle 12c 데이터베이스가 매번 끊어 질 것입니다. 며칠/몇 주 동안 계속 진행하려면 데이터베이스를 다시 시작해야합니다. 그런 다음 다시 발생합니다. 나는 테이블의 이름을 변경 한오라클의 신비한 데카르트 제품
UPDATE c_bill SET reason_desc = (SELECT description FROM codes
WHERE code_group = 'TRANSACTION_TYPE' AND code = c_bill.reason_code);
-하지만 코드 테이블은 코드와 설명이 : 뒷조사 후, 우리는이 SQL로 좁혀왔다. 개발자가이 설명을 c_bill 테이블에 복사하려고합니다.
이 SQL은 일괄 처리 작업의 일부로 야간에 실행되는 저장 프로 시저의 일부입니다. 개발자는 벌써 진행중인 다른 업데이트를 수행하지만이 SQL은 오랜 시간이 걸립니다.
특정 실행 중에 테이블에는 36308 개의 행이 있습니다. = 36,308 *
Rows_processed을 위의 갱신 1,318,270,864하기위한 곳 중 1 번째로 갱신 36,308 Rows_processed을 위해, 그것은 수 happpens : 나는 생산 DB (내가 브이 $ SQL 테이블에서 SQL을 볼)을 확인하면, 다음과 같은 참조 36308 !! (데카르트 제품?)
TEST에서는이 문제가 없습니다. 내가 UPDATE를 시도하고 TEST에서 계획 한대로 설명해도 아무런 문제가 없습니다. UPDATE와 v $ sql에서 정확히 36308 개의 행을 보여줍니다.
이것은 수수께끼입니다. 누구든지 SQL에서 데카르트 제품의 기회를 볼 수 있습니까? 또는 오라클 12c 옵티마이 저가 Cartesian 제품으로 바꿀 수있는 버그를 알고 있습니까? (그룹별로 버그를 수정하기 위해 일부 패치를 적용했습니다!)
오라클에 대한 상당한 경험이 있습니다. 여기에서 쿼리를 조정합니다. 개발자에게 어디에 where 조건을 추가 할 것을 제안했습니다. 우리는 아직 그것을 테스트하고 있습니다. 그동안 오라클 전문가가 귀하의 의견을 듣고 싶었습니다. 모든 의견/제안을 주셔서 감사합니다.
UPDATE : 앞으로이 게시물을 찾고 사람을위한 - 문제는 데카르트의 제품이 아니라 문제가 업데이트 SQL은 따라서 데카르트처럼 보이는, 일 같은 테이블에 커서 루프에서 실행. 저스틴의 대답을보십시오.
''v $ sql' 1에서'실행 '입니까? 아니면 36308입니까 (즉, 36308 실행에서 36308 개의 행이 업데이트되었습니다)? 공유 풀 또는 AWR/Statspack에서 쿼리 계획을 가져 와서 실제로 데카르트 제품이 있는지 확인할 수 있습니까?'c_bill'는'code_group' 또는'code'라는 이름의 열을 가지고 있습니까? 아니면'codes'에만 존재합니까? –
나는 네가 그것을 못질 것 같아! Executions = 36308이고 예를 들어있는 프로 시저에는 c_bill 테이블의 키에 대한 행을 선택하는 커서가 있습니다. 앞서 언급 한 이전 업데이트에서는 실제로 커서 SQL에 사용 된 키가 있지만이 키는 사용하지 않았습니다. 나는 더 많은 테스트와 포스트 백을 할 것이다. 나는 DBA가 아니며 다음주에 AWR 통계를 점검 할 것입니다. 답변으로 다시 게시 해 주시겠습니까? – SamV
v $ sql에서 문제 UPDATE 문에 대한 last_load_time은 last_load_time이 2016-09-02/03 : 04 : 02 이고 last_active_time이 09/02/2016 4:48이었습니다. 이것은 동일한 SQL이 그 시간 동안 36308 번 실행되는 것을 의미합니까? – SamV