함수 변동성

Spanner에서 기본 제공 SQL 및 사용자 정의 함수를 비롯한 함수는 변동성에 따라 분류됩니다. 변동성 카테고리는 동일한 인수로 함수를 호출할 때 동일한 결과를 반환하는지 여부를 나타냅니다. 이 분류는 쿼리 최적화 도구가 함수를 처리하는 방식과 생성된 열 표현식 또는 색인 정의와 같은 함수를 사용할 수 있는 위치에 영향을 미칩니다. 함수 변동성을 이해하면 Spanner에서 더 예측 가능하고 성능이 우수한 쿼리와 스키마를 작성하는 데 도움이 됩니다.

PostgreSQL과 같은 시스템의 개념과 유사한 세 가지 변동성 카테고리가 있습니다.

  • 불변: 동일한 인수 값으로 호출할 때 동일한 결과를 반환하는 함수는 불변입니다. 이 동작은 함수의 결과가 입력 인수만 의존하고 데이터베이스 상태, 세션 설정 또는 외부 요인에는 의존하지 않음을 의미합니다. 대부분의 수학 함수는 변경 불가능합니다. 다음 함수가 그 예입니다.

    • ABS

    • LENGTH

    • 문자열 조작 함수(예: CONCAT, LOWER)

    • 명시적 입력이 있는 날짜 및 시간 형식 함수

    시간대와 같이 런타임에 구성 가능한 설정에 종속된 함수는 데이터베이스 또는 세션 구성에 따라 결과가 달라질 수 있으므로 불변이 아닙니다.

  • 안정적: 단일 문 실행 내에서 동일한 인수 값에 대해 동일한 결과를 반환하는 함수는 안정적입니다. 하지만 결과는 SQL 문에 따라 달라질 수 있습니다. CURRENT_TIMESTAMP, CURRENT_DATE과 같은 함수 및 유사한 시간 기반 함수는 안정적입니다. 예를 들어 동일한 SELECT 문 내에서 CURRENT_TIMESTAMP을 여러 번 호출하면 동일한 타임스탬프가 생성되지만 후속 문에서는 다른 타임스탬프가 생성될 수 있습니다.

  • 변동성: 동일한 인수로 단일 문을 실행하는 동안에도 값이 변경될 수 있는 함수는 변동성이 있는 함수입니다. 예를 들어 고유 ID를 생성하는 GENERATE_UUID 함수는 휘발성입니다.

변동성 영향

함수의 변동성 카테고리는 데이터베이스 스키마에서 함수를 사용할 수 있는 위치와 함수가 포함된 쿼리가 최적화되는 방식을 결정합니다.

  • 생성된 열: 생성된 열을 정의하는 표현식은 변경할 수 없어야 합니다. 이렇게 하면 저장된 값이 행의 다른 열을 기반으로 결정됩니다. 불변이 아닌 표현식으로 생성된 열을 정의하려고 하면 Spanner에서 오류가 발생합니다.

  • 색인 생성: 휘발성 함수가 포함된 표현식에는 색인을 만들 수 없습니다. 휘발성 함수가 포함된 표현식에 인덱스를 만들려고 하면 Spanner에서 오류가 발생합니다.

  • 쿼리 최적화: 쿼리 옵티마이저는 변동성 정보를 사용하여 최적화를 실행합니다. 예를 들어 쿼리 옵티마이저는 상수 인수를 사용하여 변경할 수 없는 함수에 대한 호출을 미리 계산합니다. 옵티마이저는 단일 문의 실행 범위 내에서 안정적인 함수의 결과를 캐시하는 경우가 많습니다.