하나의 단일 SQL SELECT 범위에 대해 DECIALISTIC과 유사한 PL/SQL 프래그마가 있습니까?
SQL에서SELECT진술, 나는 그것의 범위에 대해 결정론적인 함수를 실행하고 싶습니다.SELECTstatement(또는 트랜잭션도 괜찮을 것입니다)
select t.x, t.y, my_function(t.x) from t
의 많은 가치들.t.x동일하므로 Oracle은 작업 속도를 높이기 위해 동일한 함수를 몇 번이고 호출하는 것을 생략할 수 있습니다.하지만 이 기능에 다음과 같은 라벨을 붙이면DETERMINISTIC, 결과는 이 쿼리의 여러 실행 사이에 캐시될 수 있습니다.사용할 수 없는 이유DETERMINISTIC이유는my_function은(는) 수시로 변경되는 구성 매개 변수를 사용합니다.
제가 사용할 수 있는 다른 키워드가 있습니까?주의해야 할 문제점(메모리 문제, 동시성 등)이 있습니까?또는 함수를 한 번만 호출하는 분석 함수와 같은 다른 트릭이 있을 수 있습니다.t.x(중요한 성능에 영향을 미치지 않는) 가치?
이렇게 하면 다음과 같습니다.
select t.x, t.y, (select my_function(t.x) from dual)
from t
그러면 Oracle은 하위 쿼리 캐싱을 사용하여 함수 호출을 줄일 수 있습니다.
이것은 당신의 질문에 대한 답이 아니라 당신에게 해결책이 될 수 있습니다.말씀하신 이 구성 파라미터는 기능할 파라미터로 추가할 수 없습니까?이 경우에는.my_function(t.x, val1)다른 것 vs.my_function(t.x, val2).
단순한 해결 방법으로는 첫 번째 함수를 호출하는 두 번째 결정적 함수를 만드는 것이 있습니다. 그러나 두 번째 함수가 함수를 사용하는 각 쿼리에서 다른 리터럴 값을 제공하는 추가적인 무의미한 매개 변수를 사용하도록 하는 것입니다.
또 다른 방법은 함수를 패키지에 넣고 결과를 전역 변수로 설정하는 것입니다.그런 다음 함수를 호출할 때 입력 변수가 이전과 동일한지 확인하고 그런 경우 글로벌 변수를 빠르게 반환합니다.
SQL> create or replace package temp is
2
3 function blah ( PIndex integer ) return integer;
4
5 end temp;
6 /
Package created.
SQL>
SQL> create or replace package body temp is
2
3 GResult integer := 0;
4 GIndex integer;
5
6 function blah ( PIndex integer ) return integer is
7
8 begin
9
10 if Gindex = Pindex then
11 return Gresult;
12 else
13 GIndex := Pindex;
14 GResult := Pindex;
15 end if;
16
17 return Gresult;
18
19 end blah;
20
21 end temp;
22 /
Package body created.
SQL>
SQL> select temp.blah(1) from dual;
TEMP.BLAH(1)
------------
1
SQL>
SQL> select temp.blah(1) from dual;
TEMP.BLAH(1)
------------
1
SQL>
SQL> select temp.blah(2) from dual;
TEMP.BLAH(2)
------------
2
SQL>
언급URL : https://stackoverflow.com/questions/7270467/is-there-a-pl-sql-pragma-similar-to-deterministic-but-for-the-scope-of-one-sing
'programing' 카테고리의 다른 글
| jHTML 요소의 스타일을 변경하는 jQuery (0) | 2023.09.11 |
|---|---|
| Java 및 MariaDB 연결 드라이버 오류 (0) | 2023.09.11 |
| 값을 이미 반환하는 경우 함수에서 오류를 반환하는 가장 좋은 방법은 무엇입니까? (0) | 2023.09.11 |
| jquery를 통해 앵커 클릭을 시뮬레이션하려면 어떻게 해야 합니까? (0) | 2023.09.06 |
| MariaDB가 SELinux를 사용하도록 설정된 상태에서 시작하지 못함 (0) | 2023.09.06 |