---------------------------------------------
Markus Winand는 SQL에 대한 통찰력을 제공하고 다양한 시스템이 SQL을 지원하는 방법을 modern-sql.com 에서 보여줍니다. 이전에 그는 use-the-index-luke.com 을 만들었는데, 지금도 활발하게 유지되고 있습니다. Markus는 winand.at 를 통해 강사, 연사 및 컨설턴트로 고용될 수 있습니다.
---------------------------------------------
You can upload a Korean translation of use-the-index-luke.com on your blog
Thank you from the bottom of my heart to author Makus Winand for allowing me.
These are translations that I use for studying by using a papago (google translate)
The translations may not be correct or there may be a typo.
I'd appreciate it if you could point it out in the comments.
---------------------------------------------
---------------------------------------------
use-the-index-luke.com 의 한글번역본을 블로그에 업로드 해도 된다고
허락해주신 Makus Winand 님께 진심으로 감사합니다.
이 번역본들은 제가 공부용도로 번역기(papago, google transrate)를 돌려서
번역한 내용들이라 맞지 않거나, 오타가 있을수 있습니다.
댓글로 지적해주시면 감사하겠습니다.
---------------------------------------------
https://use-the-index-luke.com/sql/where-clause/functions/user-defined-functions
ㄴ
사용자 정의 함수
함수 기반 인덱싱은 매우 일반적인 접근 방식입니다. UPPER같은 함수 외에도 A+B 같은 표현식을 INDEX화 하고, INDEX를 정의할때 사용자 정의 함수를 사용할 수도 있습니다.
한 가지 중요한 예외가 있습니다. 예를 들어 다음 예와 같이 인덱스 정의에서 현재 신간을 직접적으로나 간접적으로 참조할 수 없습니다.
CREATE FUNCTION get_age(date_of_birth DATE)
RETURN NUMBER
AS
BEGIN
RETURN
TRUNC(MONTHS_BETWEEN(SYSDATE, date_of_birth)/12);
END
출처: <https://use-the-index-luke.com/sql/where-clause/functions/user-defined-functions>
GET_AGE 함수는 현재 날짜(sysdate) 를 사용하여 제공된 생년월일을 기준으로 나이를 계산합니다. 예를 들어 select절과 where 절과 같이 SQL 쿼리의 모든 부분에서 이 함수를 사용할 수 있습니다.
SELECT first_name, last_name, get_age(date_of_birth)
FROM employees
WHERE get_age(date_of_birth) = 42
출처: <https://use-the-index-luke.com/sql/where-clause/functions/user-defined-functions>
쿼리는 42세의 직원을 모두 나열합니다. 함수기반 인덱스를 사용하는 것은 이쿼를 최적화하는데 분명한 아이디어이지만 GET_AGE함수는 결정적이지 않기 때문에 인덱스 정의에서 함수를 사용할 수 없습니다. 이는 함수 호출의 결과가 해당 매개변수에 의해 완전히 결정되지않음을 의미합니다. 동일한 매개변수에 대해 항상 동일한 결과를 반환하는 함수(결정적 함수)만 인덱싱할 수 있습니다.
이 제한의 이유는 간단합니다.
새 행을 삽입할 때 데이터베이스는 함수를 호출하고 결과를 인덱스에 저장하며 변경되지 않은 상태로 유지됩니다. 인덱스를 업데이트하는 주기적인 프로세스는 없습니다. 데이터베이스는 생년월일잉 명령문에 의해 변경된 경우에만 인덱싱된 연령을 업데이트합니다.
다음 생일 이후에는 인덱스에 저장된 나이가 틀리게 됩니다.
결정론적일 뿐만 아니라 PostgreSQL 및 Oracle 데이터베이스는 인덱스에서 사용될 때 결정론적 함수로 선언되어야 하므로 키워드 DETERMINISTIC(Oracle) 또는 IMMUTABLE(PostgraSQL)을 사용해야 합니다.
---------------------------------------------
주의
PostgreSQL 과 Oracle 데이터베이스는 DETERMINISTIC 또는 IMMUTABLE 선언을 신뢰합니다. 즉, 개발자를 신뢰한다는 의미입니다.
GET_AGE 함수를 결정론적으로 선언하고 인덱스 정의에서 사용할 수 있습니다. 선언과 관계없이 인덱스에 저장된 나이는 세월이 흘러도 증가하지 않기 때문에 의도한 대로 작동 하지 않습니다. 직원들은 나이가 증가하지 않을 것 입니다. 적어도 INDEX에는 없습니다.
---------------------------------------------
"인덱싱"할 수 없는 함수의 다른 예로는 난수 생성기와 환경변수에 의존하는 함수가 있습니다.
---------------------------------------------
메모
DB2는 인덱스에서 사용자 정의 함수를 사용할 수 없습니다.(결정적이더라도).
---------------------------------------------
---------------------------------------------
TIP
42세 직원 모두를 위해 쿼리를 최적화하기 위해 여전히 인덱스를 어떻게 사용할 수 있습니까?
---------------------------------------------
'use-the-index-luke' 카테고리의 다른 글
2.3 Bind Variable (0) | 2023.07.06 |
---|---|
2.2-3 Over-Indexing (0) | 2023.07.03 |
2.2-1 Case-Insensitive Search (0) | 2023.06.26 |
2.2 Functions (0) | 2023.06.26 |
2.1-3 Slow Indexes, Part II (0) | 2023.06.26 |