

# Babelfish와 함께 Aurora PostgreSQL 확장 사용
<a name="babelfish-postgres-aws-extensions"></a>

Aurora PostgreSQL은 다른 AWS 서비스와의 작업을 위한 확장을 제공합니다. 이는 데이터 가져오기 또는 내보내기를 위해 DB 클러스터와 함께 Amazon S3를 사용하는 것과 같은 다양한 사용 사례를 지원하는 선택적 확장입니다.
+ Amazon S3 버킷에서 Babelfish DB 클러스터로 데이터를 가져오려면 `aws_s3` Aurora PostgreSQL 확장을 설정합니다. 이 확장을 사용하면 Aurora PostgreSQL DB 클러스터에서 Amazon S3 버킷으로 데이터를 내보낼 수도 있습니다.
+ AWS Lambda은(는) 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 컴퓨팅 서비스입니다. Lambda 함수를 사용하여 DB 인스턴스의 이벤트 알림 처리와 같은 작업을 수행할 수 있습니다. Lambda에 대한 자세한 내용은 *AWS Lambda 개발자 안내서*의 [AWS Lambda란 무엇입니까?](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)를 참조하세요. Babelfish DB 클러스터에서 Lambda 함수를 호출하려면 `aws_lambda` Aurora PostgreSQL 확장을 설정합니다.

Babelfish 클러스터에 대해 이러한 확장을 설정하려면 먼저 내부 Babelfish 사용자에게 확장을 로드할 수 있는 권한을 부여해야 합니다. 권한을 부여한 후 Aurora PostgreSQL 확장을 로드할 수 있습니다.

## Babelfish DB 클러스터에서 Aurora PostgreSQL 확장 사용 설정
<a name="babelfish-postgres-aws-extensions-enabling"></a>

`aws_s3` 또는 `aws_lambda` 확장을 로드하려면 Babelfish DB 클러스터에 필요한 권한을 부여해야 합니다.

다음 절차에서는 `psql` PostgreSQL 명령줄 도구를 사용하여 DB 클러스터에 연결합니다. 자세한 내용은 [psql을 사용하여 DB 클러스터에 연결](babelfish-connect-PostgreSQL.md#babelfish-connect-psql) 섹션을 참조하세요. pgAdmin을 사용할 수도 있습니다. 자세한 내용은 [pgAdmin을 사용하여 DB 클러스터에 연결](babelfish-connect-PostgreSQL.md#babelfish-connect-pgadmin)을 참조하세요.

이 절차는 `aws_s3`과 `aws_lambda`를 차례로 로드합니다. 이러한 확장 중 하나만 사용하려면 둘 다 로드할 필요가 없습니다. `aws_commons` 확장은 각각에 필요하며 출력에 표시된 대로 기본적으로 로드됩니다.

**Aurora PostgreSQL 확장에 대한 권한으로 Babelfish DB 클러스터 설정**

1. Babelfish DB 클러스터에 연결합니다. Babelfish DB 클러스터를 생성할 때 지정한 "마스터" 사용자(-U)의 이름을 사용합니다. 기본값(`postgres`)은 예제에 표시되어 있습니다.

   대상 LinuxmacOS, 또는Unix:

   ```
   psql -h {{your-Babelfish.cluster.444455556666-us-east-1.rds.amazonaws.com}} \
   -U postgres \
   -d babelfish_db \
   -p 5432
   ```

   Windows의 경우:

   ```
   psql -h {{your-Babelfish.cluster.444455556666-us-east-1.rds.amazonaws.com}} ^
   -U postgres ^
   -d babelfish_db ^
   -p 5432
   ```

   명령은 사용자 이름(-U)의 암호를 입력하라는 프롬프트로 응답합니다.

   ```
   Password:
   ```

   DB 클러스터의 사용자 이름(-U)에 대한 암호를 입력합니다. 성공적으로 연결하면 다음과 비슷한 출력이 표시됩니다.

   ```
   psql (13.4)
   SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
   Type "help" for help.
   
   postgres=>
   ```

1. 내부 Babelfish 사용자에게 확장을 생성하고 로드할 수 있는 권한을 부여합니다.

   ```
   babelfish_db=> GRANT rds_superuser TO master_dbo;
   GRANT ROLE
   ```

1. `aws_s3` 확장 생성 및 로드 `aws_commons` 확장이 필요하며 `aws_s3`이 설치되면 자동으로 설치됩니다.

   ```
   babelfish_db=> create extension aws_s3 cascade;
   NOTICE:  installing required extension "aws_commons"
   CREATE EXTENSION
   ```

1. `aws_lambda` 확장 생성 및 로드

   ```
   babelfish_db=> create extension aws_lambda cascade;
   CREATE EXTENSION
   babelfish_db=>
   ```

## Amazon S3에서 Babelfish 사용
<a name="babelfish-postgres-aws-extensions-using-aws_s3"></a>

Babelfish DB 클러스터에 사용할 Amazon S3 버킷이 아직 없는 경우 하나 생성할 수 있습니다. 사용하려는 Amazon S3 버킷에 대해 액세스 권한을 제공합니다.

Amazon S3 버킷을 사용하여 데이터를 가져오거나 내보내기 전에 다음 일회성 단계를 완료하세요.

**Amazon S3 버킷에 대한 Babelfish DB 인스턴스의 액세스 설정**

1. 필요한 경우 Babelfish 인스턴스용 Amazon S3 버킷을 생성합니다. 이렇게 하려면 *Amazon Simple Storage Service 사용 설명서*의 [Create a bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.htmlurl-s3-user;GetStartedWithS3.html#creating-bucket) 지침을 따르세요.

1. Amazon S3 버킷에 파일을 업로드합니다. 이렇게 하려면 *Amazon Simple Storage Service 사용 설명서*의 [Add an object to a bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PuttingAnObjectInABucket.htmlurl-s3-user;GetStartedWithS3.html#uploading-an-object-bucket) 단계를 따르세요.

1. 필요에 따라 권한을 설정합니다.
   + Amazon S3에서 데이터를 가져오려면 Babelfish DB 클러스터에 버킷 액세스 권한이 필요합니다. AWS Identity and Access Management(IAM) 역할을 사용하고 클러스터의 해당 역할에 IAM 정책을 연결하는 것이 좋습니다. 이렇게 하려면 [IAM 역할을 사용해 Amazon S3 버킷에 액세스](USER_PostgreSQL.S3Import.AccessPermission.md#USER_PostgreSQL.S3Import.ARNRole) 단원의 절차를 따르세요.
   + Babelfish DB 클러스터에서 데이터를 내보내려면 클러스터에 Amazon S3 버킷에 대한 액세스 권한이 부여되어야 합니다. 가져오기와 마찬가지로 IAM 역할 및 정책을 사용하는 것이 좋습니다. 이렇게 하려면 [Amazon S3 버킷에 대한 액세스 권한 설정](postgresql-s3-export-access-bucket.md) 단원의 절차를 따르세요.

이제 Babelfish DB 클러스터에서 `aws_s3` 확장과 함께 Amazon S3를 사용할 수 있습니다.

**Amazon S3에서 Babelfish로 데이터 가져오기 및 Amazon S3로 Babelfish 데이터 내보내기**

1. Babelfish DB 클러스터와 함께 `aws_s3` 확장을 사용합니다.

   이때 PostgreSQL 컨텍스트에 있는 테이블을 참조해야 합니다. 즉, `[database].[schema].[tableA]`라는 Babelfish 테이블로 가져오려면 `aws_s3` 함수에서 해당 테이블을 `database_schema_tableA`로 참조합니다.
   + `aws_s3` 함수를 사용하여 데이터를 가져오는 예는 [Amazon S3에서 Aurora PostgreSQL DB 클러스터 로 데이터 가져오기](USER_PostgreSQL.S3Import.FileFormats.md) 섹션을 참조하세요.
   + `aws_s3` 함수를 사용하여 데이터를 내보내는 예는 [aws\_s3.query\_export\_to\_s3 함수를 사용하여 쿼리 데이터 내보내기](postgresql-s3-export-examples.md) 섹션을 참조하세요.

1. 다음 표와 같이 `aws_s3` 확장 및 Amazon S3를 사용할 때 PostgreSQL 이름 지정을 사용하여 Babelfish 테이블을 참조해야 합니다.


| Babelfish 테이블 | Aurora PostgreSQL 테이블 | 
| --- | --- | 
| `{{database}}.{{schema}}.{{table}}` | `{{database}}_{{schema}}_{{table}}` | 

Aurora PostgreSQL과 함께 Amazon S3를 사용하는 방법에 대해 자세히 알아보려면 [PostgreSQL DB 인스턴스용 Aurora PostgreSQL DB 클러스터](USER_PostgreSQL.S3Import.md) 및 [Aurora PostgreSQL DB 클러스터에서 Amazon S3로 데이터 내보내기](postgresql-s3-export.md) 섹션을 참조하세요.

## AWS Lambda와 함께 Babelfish 사용
<a name="babelfish-postgres-aws-extensions-using-aws_lambda"></a>

`aws_lambda` 확장이 Babelfish DB 클러스터에 로드된 후 이 절차에 따라 Lambda에 DB 클러스터에 대한 액세스 권한을 부여해야 Lambda 함수를 호출할 수 있습니다.

**Lambda와 작동하도록 Babelfish DB 클러스터에 대한 액세스 설정**

이 절차에서는 AWS CLI를 사용하여 IAM 정책, 역할을 생성하고 이를 Babelfish DB 클러스터와 연결합니다.

1. Babelfish DB 클러스터에서 Lambda에 대한 액세스를 허용하는 IAM 정책을 생성합니다.

   ```
   aws iam create-policy  --policy-name {{rds-lambda-policy}} --policy-document '{
   	"Version": "2012-10-17",		 	 	 
       "Statement": [
           {
           "Sid": "AllowAccessToExampleFunction",
           "Effect": "Allow",
           "Action": "lambda:InvokeFunction",
           "Resource": "arn:aws:lambda:{{{{aws-region}}:444455556666:function:my-function}}"
           }
       ]
   }'
   ```

1. 정책이 런타임에 수임할 수 있는 IAM 역할을 생성합니다.

   ```
   aws iam create-role  --role-name {{rds-lambda-role}} --assume-role-policy-document '{
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
           "Effect": "Allow",
           "Principal": {
               "Service": "rds.amazonaws.com"
           },
           "Action": "sts:AssumeRole"
           }
       ]
   }'
   ```

1. 책을 역할에 연결합니다.

   ```
   aws iam attach-role-policy \
       --policy-arn arn:aws:iam::{{444455556666}}:policy/{{rds-lambda-policy}} \
       --role-name {{rds-lambda-role}} --region {{aws-region}}
   ```

1. Babelfish DB 클러스터에 역할을 연결합니다.

   ```
   aws rds add-role-to-db-cluster \
          --db-cluster-identifier {{my-cluster-name}} \
          --feature-name Lambda \
          --role-arn  arn:aws:iam::{{444455556666:role/rds-lambda-role}}   \
          --region {{aws-region}}
   ```

이러한 태스크를 완료한 후 Lambda 함수를 호출할 수 있습니다. AWS Lambda를 사용하여 Aurora PostgreSQL DB 클러스터에 대해 AWS Lambda를 설정하는 방법에 대한 자세한 내용과 예는 [2단계: Aurora PostgreSQL DB 클러스터 및 AWS Lambda에 대한 IAM 구성](PostgreSQL-Lambda.md#PostgreSQL-Lambda-access) 섹션을 참조하세요.

**Babelfish DB 클러스터에서 Lambda 함수 호출**

AWS Lambda는 Java, Node.js, Python, Ruby 및 기타 언어로 작성된 기능을 지원합니다. 함수가 호출될 때 텍스트를 반환하면 Babelfish DB 클러스터에서 이를 호출할 수 있습니다. 다음 예는 인사말을 반환하는 자리 표시자 python 함수입니다.

```
lambda_function.py
import json
def lambda_handler(event, context):
    #TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
```

현재 Babelfish는 JSON을 지원하지 않습니다. 함수가 JSON을 반환하는 경우 래퍼를 사용하여 JSON을 처리합니다. 예를 들어, 앞에 표시된 `lambda_function.py`가 Lambda에 `my-function`으로 저장되어 있다고 가정해 보겠습니다.

1. `psql` 클라이언트 또는 pgAdmin 클라이언트를 사용하여 Babelfish DB 클러스터에 연결합니다. 자세한 내용은 [psql을 사용하여 DB 클러스터에 연결](babelfish-connect-PostgreSQL.md#babelfish-connect-psql) 섹션을 참조하세요.

1. 래퍼를 생성합니다. 이 예에서는 SQL용 PostgreSQL의 절차적 언어인 `PL/pgSQL`을 사용합니다. 자세한 내용은 [PL/pgSQL–SQL 절차적 언어](https://www.postgresql.org/docs/13/plpgsql.html)를 참조하세요.

   ```
   create or replace function master_dbo.lambda_wrapper()
   returns text
   language plpgsql
   as
   $$
   declare
      r_status_code integer;
      r_payload text;
   begin
      SELECT payload INTO r_payload
        FROM aws_lambda.invoke(  aws_commons.create_lambda_function_arn('my-function', 'us-east-1')
                               ,'{"body": "Hello from Postgres!"}'::json );
      return r_payload ;
   end;
   $$;
   ```

   이제 이 함수는 Babelfish TDS 포트(1433) 또는 PostgreSQL 포트(5433)에서 실행할 수 있습니다.

   1. PostgreSQL 포트에서 이 함수 호출

      ```
      SELECT * from aws_lambda.invoke(aws_commons.create_lambda_function_arn('my-function', 'us-east-1'), '{"body": "Hello from Postgres!"}'::json );
      ```

      출력은 다음과 유사합니다.

      ```
      status_code |                        payload                        | executed_version | log_result
      -------------+-------------------------------------------------------+------------------+------------
               200 | {"statusCode": 200, "body": "\"Hello from Lambda!\""} | $LATEST          |
      (1 row)
      ```

   1. TDS 포트에서 이 기능을 호출하려면 SQL Server `sqlcmd` 명령줄 클라이언트를 사용하여 포트에 연결합니다. 자세한 내용은 [SQL Server 클라이언트 도구를 사용하여 DB 클러스터에 연결](babelfish-connect-sqlserver.md)을 참조하세요. 연결되면 다음을 실행합니다.

      ```
      1> select lambda_wrapper();
      2> go
      ```

      이 명령은 다음과 비슷한 출력을 반환합니다.

      ```
      {"statusCode": 200, "body": "\"Hello from Lambda!\""}
      ```

Aurora PostgreSQL과 함께 Lambda를 사용하는 방법에 대해 자세히 알아보려면 [Aurora PostgreSQL DB 클러스터 에서 AWS Lambda 함수 호출](PostgreSQL-Lambda.md) 섹션을 참조하세요. Lambda 함수 작업에 대한 자세한 내용은 *AWS Lambda 개발자 안내서*의 [Lambda 시작하기](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)를 참조하세요.

## Babelfish 에서 pg\_stat\_statements 사용
<a name="babelfish-postgres-aws-extensions-using-pgstat"></a>

Babelfish for Aurora PostgreSQL은 3.3.0에서 `pg_stat_statements` 확장을 지원합니다. 자세한 내용은 [pg\_stat\_statements](https://www.postgresql.org/docs/current/pgstatstatements.html)를 참조하세요.

Aurora PostgreSQL에서 지원하는 이 확장에 대한 자세한 내용은 [확장 버전](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraPostgreSQLReleaseNotes/AuroraPostgreSQL.Extensions.html)을 참조하세요.

### pg\_stat\_statements 확장 만들기
<a name="babelfish-postgres-aws-extensions-using-pgstat-install"></a>

`pg_stat_statements`를 활성화하려면 쿼리 식별자 계산을 켜야 합니다. 이 작업은 파라미터 그룹에서 `compute_query_id`가 `on` 또는 `auto`로 설정되어 있으면 자동으로 수행됩니다. `compute_query_id` 파라미터의 기본값은 `auto`입니다. 이 기능을 켜려면 이 확장도 생성해야 합니다. 다음 명령을 사용하여 T-SQL 엔드포인트에서 확장을 설치하세요.

```
				
1>EXEC sp_execute_postgresql 'CREATE EXTENSION pg_stat_statements WITH SCHEMA sys';
```

다음 쿼리를 사용하여 쿼리 통계에 액세스할 수 있습니다.

```
postgres=>select * from pg_stat_statements; 
```

**참고**  
설치 중에 확장의 스키마 이름을 제공하지 않으면 기본적으로 확장이 퍼블릭 스키마에 생성됩니다. 액세스하려면 아래와 같이 스키마 한정자와 함께 대괄호를 사용해야 합니다.

```
postgres=>select * from [public].pg_stat_statements;
```

PSQL 엔드포인트에서 확장을 생성할 수도 있습니다.

### 확장 승인
<a name="babelfish-postgres-aws-extensions-using-pgstat-authorization"></a>

기본적으로 승인 없이 T-SQL 데이터베이스 내에서 수행된 쿼리의 통계를 볼 수 있습니다.

다른 사람이 만든 쿼리 통계에 액세스하려면 `pg_read_all_stats` PostgreSQL 역할이 있어야 합니다. 아래에 설명된 단계에 따라 GRANT pg\_read\_all\_stats 명령을 생성합니다.

1. T-SQL에서는 내부 PG 역할 이름을 반환하는 다음 쿼리를 사용합니다.

   ```
   SELECT rolname FROM pg_roles WHERE oid = USER_ID();
   ```

1. rds\_superuser 권한으로 Babelfish for Aurora PostgreSQL 데이터베이스에 연결하고 다음 명령을 사용합니다.

   ```
   GRANT pg_read_all_stats TO <rolname_from_above_query>
   ```

**예제**  
T-SQL 엔드포인트에서:

```
1>SELECT rolname FROM pg_roles WHERE oid = USER_ID();
2>go
```

```
rolname
-------
master_dbo
(1 rows affected)
```

PSQL 엔드포인트에서:

```
babelfish_db=# grant pg_read_all_stats to master_dbo;
```

```
GRANT ROLE
```

pg\_stat\_statements 뷰를 사용하여 쿼리 통계에 액세스할 수 있습니다.

```
1>create table t1(cola int);
2>go
1>insert into t1 values (1),(2),(3);
2>go
```

```
(3 rows affected)
```

```
1>select userid, dbid, queryid, query from pg_stat_statements;
2>go
```

```
userid dbid queryid             query
------ ---- -------             -----
37503 34582 6487973085327558478 select * from t1
37503 34582 6284378402749466286 SET QUOTED_IDENTIFIER OFF
37503 34582 2864302298511657420 insert into t1 values ($1),($2),($3)
10    34582 NULL                <insufficient privilege>
37503 34582 5615368793313871642 SET TEXTSIZE 4096
37503 34582 639400815330803392  create table t1(cola int)
(6 rows affected)
```

### 쿼리 통계 재설정
<a name="babelfish-postgres-aws-extensions-using-pgstat-reset"></a>

`pg_stat_statements_reset()`을 사용하여 지금까지 pg\_stat\_statements에서 수집한 통계를 재설정할 수 있습니다. 자세한 내용은 [pg\_stat\_statements]( https://www.postgresql.org/docs/current/pgstatstatements.html)를 참조하세요. 현재 PSQL 엔드포인트를 통해서만 지원됩니다. `rds_superuser` 권한을 사용하여 Babelfish for Aurora PostgreSQL에 연결하려면 다음 명령을 사용하세요.

```
SELECT pg_stat_statements_reset();
```

### 제한 사항
<a name="babelfish-postgres-aws-extensions-using-pgstat-limitations"></a>
+ 현재 T-SQL 엔드포인트를 통해서는 `pg_stat_statements()`가 지원되지 않습니다. 통계를 수집할 때는 `pg_stat_statements` 뷰를 사용하는 것이 좋습니다.
+ 일부 쿼리는 Aurora PostgreSQL 엔진으로 구현된 T-SQL 파서에 의해 다시 작성될 수 있습니다. `pg_stat_statements` 뷰에는 원래 쿼리가 아닌 다시 작성된 쿼리가 표시됩니다.

  예제

  ```
  select next value for [dbo].[newCounter];
  ```

   위의 쿼리는 pg\_stat\_statements 뷰에서 다음과 같이 다시 작성됩니다.

  ```
  select nextval($1);
  ```
+ 문의 실행 흐름에 따라 일부 쿼리는 pg\_stat\_statements에서 추적되지 않고 뷰에 표시되지 않을 수 있습니다. 여기에 포함되는 문은 `use dbname`, `goto`, `print`, `raise error`, `set`, `throw`, `declare cursor`입니다.
+ CREATE LOGIN 및 ALTER LOGIN 문의 경우 쿼리 및 쿼리 ID가 표시되지 않습니다. 권한이 충분하지 않다고 표시됩니다.
+ `pg_stat_statements` 뷰에는 항상 아래 두 항목이 포함됩니다. 이 두 항목은 `sqlcmd` 클라이언트가 내부적으로 실행하기 때문입니다.
  + SET QUOTED\_IDENTIFIER OFF
  + SET TEXTSIZE 4,096

## Babelfish에서 pgvector 사용
<a name="babelfish-postgres-aws-extensions-using-pgvector"></a>

오픈 소스 확장인 pgvector를 사용하면 Postgres 데이터베이스 내에서 직접 유사한 데이터를 검색할 수 있습니다. Babelfish는 이제 버전 15.6 및 16.2부터 이 확장을 지원합니다. 자세한 내용은 [pgvector 오픈 소스 설명서](https://github.com/pgvector/pgvector)를 참조하세요.

### 사전 조건
<a name="babelfish-postgres-aws-extensions-using-pgvector-prereq"></a>

pgvector 기능을 활성화하려면 다음 방법 중 하나를 사용하여 sys 스키마에 확장을 설치하세요.
+ sqlcmd 클라이언트에서 다음 명령을 실행합니다.

  ```
  exec sys.sp_execute_postgresql 'CREATE EXTENSION vector WITH SCHEMA sys';
  ```
+ `babelfish_db`에 연결하고 psql 클라이언트에서 다음 명령을 실행합니다.

  ```
  CREATE EXTENSION vector WITH SCHEMA sys;
  ```

**참고**  
pgvector 확장을 설치한 후에는 설정한 새 데이터베이스 연결에서만 해당 벡터 데이터 유형을 사용할 수 있습니다. 기존 연결에서는 새 데이터 유형을 인식하지 못합니다.

### 지원되는 기능
<a name="babelfish-postgres-aws-extensions-using-pgvector-supported"></a>

Babelfish는 T-SQL 기능을 확장하여 다음을 지원합니다.
+ **저장**

  Babelfish는 이제 벡터 데이터 유형 호환 구문을 지원하여 T-SQL 호환성을 개선합니다. pgvector를 사용하여 데이터를 저장하는 방법에 대한 자세한 내용은 [Storing](https://github.com/pgvector/pgvector?tab=readme-ov-file#storing)을 참조하세요.
+ **쿼리**

   Babelfish는 벡터 유사성 연산자를 포함하도록 T-SQL 표현식 지원을 확장합니다. 그러나 다른 모든 쿼리의 경우 표준 T-SQL 구문이 여전히 필요합니다.
**참고**  
T-SQL은 배열 유형을 지원하지 않으며 데이터베이스 드라이버에는 배열 유형을 처리하는 인터페이스가 없습니다. 해결 방법으로 Babelfish는 텍스트 문자열(varchar/nvarchar)을 사용하여 벡터 데이터를 저장합니다. 예를 들어 벡터 값 [1,2,3]을 요청하면 Babelfish는 '[1,2,3]' 문자열을 응답으로 반환합니다. 필요에 따라 애플리케이션 수준에서 이 문자열을 구문 분석하고 분할할 수 있습니다.

  pgvector를 사용하여 데이터를 쿼리하는 방법에 대한 자세한 내용은 [Querying](https://github.com/pgvector/pgvector?tab=readme-ov-file#querying)을 참조하세요.
+ **인덱싱**

  T-SQL `Create Index`는 이제 `USING INDEX_METHOD` 구문을 지원합니다. 이제 인덱스를 만들 때 특정 열에 사용할 유사성 검색 연산자를 정의할 수 있습니다.

  또한 문법이 필수 열에 대한 벡터 유사성 연산을 지원하도록 확장되었습니다(column\_name\_list\_with\_order\_for\_vector 문법 확인).

  ```
  CREATE [UNIQUE] [clustered] [COLUMNSTORE] INDEX <index_name> ON <table_name> [USING vector_index_method] (<column_name_list_with_order_for_vector>)
  Where column_name_list_with_order_for_vector is:
      <column_name> [ASC | DESC] [VECTOR_COSINE_OPS | VECTOR_IP_OPS | VECTOR_L2_OPS] (COMMA simple_column_name [ASC | DESC] [VECTOR_COSINE_OPS | VECTOR_IP_OPS | VECTOR_L2_OPS])
  ```

  pgvector를 사용하여 데이터를 인덱싱하는 방법에 대한 자세한 내용은 [Indexing](https://github.com/pgvector/pgvector?tab=readme-ov-file#indexing)을 참조하세요.
+ **성능**:
  + T-SQL 엔드포인트에서 쿼리 계획을 디버깅하는 데 `SET BABELFISH_STATISTICS PROFILE ON`을 사용합니다.
  + T-SQL에서 지원되는 `set_config` 함수를 사용하여 `max_parallel_workers_get_gather`를 늘립니다.
  + 대략적인 검색에 `IVFFlat`을 사용합니다. 자세한 내용은 [IVFFlat](https://github.com/pgvector/pgvector?tab=readme-ov-file#ivfflat)을 참조하세요.

  pgvector를 사용하여 성능을 개선하는 방법에 대한 자세한 내용은 [Performance](https://github.com/pgvector/pgvector?tab=readme-ov-file#performance)를 참조하세요.

### 제한 사항
<a name="babelfish-postgres-aws-extensions-using-pgvector-unsupported"></a>
+ Babelfish는 하이브리드 검색에 전체 텍스트 검색을 지원하지 않습니다. 자세한 내용은 [Hybrid Search](https://github.com/pgvector/pgvector?tab=readme-ov-file#hybrid-search)를 참조하세요.
+ Babelfish는 현재 재인덱싱 기능을 지원하지 않습니다. 그러나 여전히 PostgreSQL 엔드포인트를 사용하여 재인덱싱이 가능합니다. 자세한 내용은 [Vacuuming](https://github.com/pgvector/pgvector?tab=readme-ov-file#vacuuming)을 참조하세요.

## Babelfish와 함께 Amazon Aurora 기계 학습 사용
<a name="babelfish-postgres-aws-extensions-using-ml"></a>

Amazon Aurora 기계 학습과 통합하면 Babelfish for Aurora PostgreSQL DB 클러스터의 기능을 확장할 수 있습니다. 이 원활한 통합을 통해 각각 고유한 기계 학습 요구 사항을 해결하도록 맞춤화된 Amazon Comprehend, Amazon SageMaker AI, Amazon Bedrock과 같은 다양하고 강력한 서비스에 액세스할 수 있습니다.

Babelfish 사용자는 Aurora 기계 학습을 사용할 때 T-SQL 구문 및 의미 체계에 대한 기존 지식을 사용할 수 있습니다. Aurora PostgreSQL에 대한 AWS 설명서에 나와 있는 지침을 따르세요. 자세한 내용은 [Aurora PostgreSQL과 함께 Amazon Aurora 기계 학습 사용](postgresql-ml.md) 섹션을 참조하세요.

### 사전 조건
<a name="babelfish-postgres-aws-extensions-using-ml-prereq"></a>
+ Aurora 기계 학습을 사용하도록 Babelfish for Aurora PostgreSQL DB 클러스터를 설정하기 전에 관련 요구 사항과 사전 조건을 이해해야 합니다. 자세한 내용은 [Aurora PostgreSQL과 함께 Aurora 기계 학습을 사용할 때 요구 사항](postgresql-ml.md#postgresql-ml-prereqs) 섹션을 참조하세요.
+ Postgres 엔드포인트 또는 `sp_execute_postgresql` 저장 프로시저를 사용하여 `aws_ml` 확장을 설치해야 합니다.

  ```
  exec sys.sp_execute_postgresql 'Create Extension aws_ml'
  ```
**참고**  
현재 Babelfish는 Babelfish 내에서 `sp_execute_postgresql`을 사용한 캐스케이드 작업을 지원하지 않습니다. `aws_ml`은 `aws_commons`를 사용하기 때문에 Postgres 엔드포인트를 사용하여 별도로 설치해야 합니다.

  ```
  create extension aws_common;
  ```

### `aws_ml` 함수를 사용한 T-SQL 구문 및 의미 체계 처리
<a name="babelfish-postgres-aws-extensions-using-ml-examples"></a>

다음 예시는 T-SQL 구문과 의미 체계가 Amazon ML 서비스에 적용되는 방법을 설명합니다.

**Example : aws\_bedrock.invoke\_model - Amazon Bedrock 함수를 사용하는 간단한 쿼리**  

```
aws_bedrock.invoke_model(
   model_id      varchar,
   content_type  text,
   accept_type   text,
   model_input   text)
Returns Varchar(MAX)
```
다음 예제는 invoke\_model을 사용하여 Bedrock에 대한 Anthropic Claude 2 모델을 간접 호출하는 방법을 보여줍니다.  

```
SELECT aws_bedrock.invoke_model (
    'anthropic.claude-v2', -- model_id
    'application/json', -- content_type
    'application/json', -- accept_type
    '{"prompt": "\n\nHuman:
    You are a helpful assistant that answers questions directly
    and only using the information provided in the context below.
    \nDescribe the answerin detail.\n\nContext: %s \n\nQuestion:
    %s \n\nAssistant:","max_tokens_to_sample":4096,"temperature"
    :0.5,"top_k":250,"top_p":0.5,"stop_sequences":[]}' -- model_input
);
```

**Example : aws\_comprehend.detect\_sentiment - Amazon Comprehend 함수를 사용하는 간단한 쿼리**  

```
aws_comprehend.detect_sentiment(
   input_text varchar,
   language_code varchar,
   max_rows_per_batch int)
Returns table (sentiment varchar, confidence real)
```
다음 예시는 Amazon Comprehend 서비스를 간접 호출하는 방법을 보여줍니다.  

```
select sentiment from aws_comprehend.detect_sentiment('This is great', 'en');
```

**Example : aws\_sagemaker.invoke\_endpoint - Amazon SageMaker 함수를 사용하는 간단한 쿼리**  

```
aws_sagemaker.invoke_endpoint(
  endpoint_name varchar,   
  max_rows_per_batch int,
  VARIADIC model_input "any") -- Babelfish inherits PG's variadic parameter type
Rerurns Varchar(MAX)
```

model\_input은 VARIADIC으로 표시되고 유형이 'any'이므로 사용자는 길이 및 데이터 유형과 관계없이 목록을 함수에 전달할 수 있으며, 이 함수는 모델에 대한 입력 역할을 합니다. 다음 예시는 Amazon SageMaker 서비스를 간접 호출하는 방법을 보여줍니다.

```
SELECT CAST (aws_sagemaker.invoke_endpoint(
    'sagemaker_model_endpoint_name',
    NULL,
    arg1, arg2 -- model inputs are separate arguments )
AS INT) -- cast the output to INT
```

Aurora PostgreSQL과 함께 Aurora 기계 학습을 사용하는 방법에 대한 자세한 내용은 [Aurora PostgreSQL과 함께 Amazon Aurora 기계 학습 사용](postgresql-ml.md) 섹션을 참조하세요.

### 제한 사항
<a name="babelfish-postgres-aws-extensions-using-ml-limit"></a>
+ Babelfish는 배열 생성을 허용하지 않지만 배열을 나타내는 데이터는 처리할 수 있습니다. 배열을 반환하는 `aws_bedrock.invoke_model_get_embeddings`와 같은 함수를 사용하면 결과가 배열 요소가 포함된 문자열로 전달됩니다.