사용자가 쿼리를 실행하고 비용이 일정 임계 값 이상인 불량 데카르트가있는 경우를 생각해보십시오. 그런 다음 oracle이 나에게 이메일을 보냅니다. 나는 몇 가지 시도했지만 런타임에 작동하지 않습니다. 두꺼비와 SQL 개발자가 실행 계획을 볼 수 있다면. 그러면 거기에 정보가 있다는 것을 나는 믿는다. 아니면 다른 논리를 채택해야 할 수도 있습니다.trigger @ 실행 계획 .. 카디 전 곱
답변
일반적으로 이것은 아마도 가능하지 않습니다. 당신이 정말로 결정한다면
이론적으로, 당신은 모든 SELECT
, INSERT
, UPDATE
및 DELETE
가 얻을 화재 시스템의 모든 테이블에 대한 트리거 세밀한 감사 (FGA)를 생성 할 수있는 SQL_ID
V$SESSION
에서, 가입 V$SQL_PLAN
으로 변경하고 원하는 모든 논리를 구현합니다. 기술적으로는 가능하지만 코드가 상당히 복잡하므로 시스템의 모든 쿼리에 잠재적으로 상당한 양의 오버 헤드를 추가해야합니다. 이것은 실용적이지 않을 수 있습니다.
오히려 트리거를 사용하는 것보다, 당신은 모든 활성 세션에 대한 V$SESSION
를 조회 할 것이다 DBMS_JOB 또는 DBMS_SCHEDULER 패키지를 통해 몇 분 간격으로 실행되도록 예약 된 절차를 쓸 수 V$SQL_PLAN
에 가입하고, 당신이 원하는 어떤 논리 구현 . 따라서 사용자가 모든 명령문을 실행할 때마다 트리거를 실행하려는 오버 헤드가 제거됩니다. 하지만 여전히 상당한 양의 코드가 필요합니다.
해결하려는 비즈니스 문제에 따라 임의의 코드를 작성하는 대신 하나의 SQL 문에서 소비 할 수있는 리소스의 양을 제한하도록 Oracle을 만들려면 resource limits on the user's profile을 만드는 것이 더 쉽습니다. 예를 들어 사용자의 CPU_PER_CALL
, LOGICAL_READS_PER_CALL
또는 COMPOSITE_LIMIT
을 설정하여 Oracle이 강제 종료하기 전에 단일 명령문이 수행 할 수있는 CPU, 논리 입출력 양 또는 CPU 및 논리 입출력의 합성 제한을 제한 할 수 있습니다 .
더 많은 제어가 필요하면 Oracle Resource Manager을 사용할 수 있습니다. 따라서 오라클이 특정 사용자의 쿼리를 실행하는 데 오랜 시간이 걸릴 것으로 예상되거나 오라클이 해당 리소스에 대한 경쟁이있을 경우 사용자 그룹이 소비 할 수있는 리소스를 제한하는 것을 막을 수 있습니다. 오라클은 장기 실행 쿼리를 특정 사용자의 우선 순위가 낮은 그룹으로 자동으로 이전 할 수 있고, 장기 실행 쿼리를 자동으로 제거 할 수 있으므로 처음부터 실행되지 않도록 할 수 있습니다.
감사합니다. 내 생각이 다르게 생각했습니다. 두꺼비 및 SQL 개발자와 같은 응용 프로그램이 가능하고 사용자가 나를 좋아한다는 것이 가능한지 묻기를 바랍니다. 또는 이것에 대해 이미 언급 한 내용 중 상당 부분이 필요합니다. – Imran
@Imran - 쿼리 계획에 액세스하지 못하도록하는 것은 아무것도 없습니다 (단, Toad와 SQL Developer가 수행하는 별도의 세션에서 훨씬 쉽습니다). 'V $ SESSION'을'SQL_ID'에'V $ SQL_PLAN'에 가입시키고 모든 세션에서 현재 실행중인 SQL 문에 대한 쿼리 계획을 볼 수 있습니다 - 이것은 예약 된 작업을 작성한 경우 수행 할 작업입니다. 쿼리 계획을 분석하기위한 논리를 작성해야한다는 것과 사람들이 일반적인 공간에서 해결하고자하는 대부분의 문제는 프로필 및/또는 리소스 관리자를 사용하여 더 잘 해결된다는 것입니다. –
정말 감사드립니다. – Imran