搭配 Babelfish 使用 Aurora PostgreSQL 延伸模組 - Amazon Aurora

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

搭配 Babelfish 使用 Aurora PostgreSQL 延伸模組

Aurora PostgreSQL 提供擴充功能以使用其他服務 AWS 。以下是支援各種使用案例的選用擴充功能,例如使用 Amazon S3 搭配資料庫叢集以匯入或匯出資料。

  • 若要將資料從 Amazon S3 儲存貯體匯入 Babelfish 資料庫叢集,請設定 aws_s3 Aurora PostgreSQL 延伸模組。此擴充功能也可讓您將資料從 Aurora PostgreSQL 資料庫叢集匯出至 Amazon S3 儲存貯體。

  • AWS Lambda 是一種運算服務,可讓您執行程式碼,而無需佈建或管理伺服器。您可以使用 Lambda 函數執行各種程序,例如處理來自資料庫執行個體的事件通知。若要進一步了解 Lambda,請參閱《AWS Lambda 開發人員指南》中的什麼是 AWS Lambda?。若要從 Babelfish 資料庫叢集叫用 Lambda 函數,請設定 aws_lambda Aurora PostgreSQL 延伸模組。

若要為 Babelfish 叢集設定這些擴充功能,首先需要授予載入擴充功能的許可給內部 Babelfish 使用者。授予許可後,您可以載入 Aurora PostgreSQL 延伸模組。

在 Babelfish 資料庫叢集中啟用 Aurora PostgreSQL 延伸模組

授予 Babelfish 資料庫叢集所需的權限後,才能載入 aws_s3aws_lambda 擴充功能。

下列程序使用 psql PostgreSQL 命令列工具來連線至資料庫叢集。如需詳細資訊,請參閱使用 psql 來連線至資料庫叢集。您也可以使用 pgAdmin。如需詳細資訊,請參閱 使用 pgAdmin 來連線至資料庫叢集

此程序會依序載入 aws_s3aws_lambda。如果您只想使用其中一個擴充功能,就不需要同時載入兩者。各自都需要 aws_commons 擴充功能,且會依預設載入,如輸出中所示。

設定具有 Aurora PostgreSQL 延伸模組權限的 Babelfish 資料庫叢集
  1. 連線至 Babelfish 資料庫叢集。使用您在建立 Babelfish 資料庫叢集時指定的「主要」使用者 (-U) 名稱。預設值 (postgres) 顯示在範例中。

    用於 Linux, macOS、 或 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:

    輸入資料庫叢集使用者名稱 (-U) 的密碼。如果成功連線,會出現類似以下輸出。

    psql (13.4) SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) Type "help" for help. postgres=>
  2. 授予內部 Babelfish 使用者建立和載入擴充功能的權限。

    babelfish_db=> GRANT rds_superuser TO master_dbo; GRANT ROLE
  3. 建立並載入 aws_s3 擴充功能。aws_commons 擴充功能為必要項目,且在安裝 aws_s3 時即已自動安裝。

    babelfish_db=> create extension aws_s3 cascade; NOTICE: installing required extension "aws_commons" CREATE EXTENSION
  4. 建立並載入 aws_lambda 擴充功能。

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

搭配使用 Babelfish 與 Amazon S3

如果您還沒有 Amazon S3 儲存貯體能與 Babelfish 資料庫叢集搭配使用,可以建立一個儲存貯體。為您想使用的任何 Amazon S3 儲存貯體提供存取權。

嘗試使用 Amazon S3 儲存貯體匯入或匯出資料之前,請完成以下一次性步驟。

為 Babelfish 資料庫執行個體設定 Amazon S3 儲存貯體的存取權
  1. 如果需要,可為 Babelfish 執行個體建立 Amazon S3 儲存貯體。若要執行此作業,請依照《Amazon Simple Storage Service 使用者指南》中建立儲存貯體提供的說明操作。

  2. 將檔案上傳至 Amazon S3 儲存貯體。若要執行此作業,請依照《Amazon Simple Storage Service 使用者指南》中將物件新增到儲存貯體的說明操作。

  3. 視需要設定許可:

    • 若要從 Amazon S3 匯入資料,Babelfish 資料庫叢集需要存取儲存貯體的許可。建議您使用 AWS Identity and Access Management (IAM) 角色,並將 IAM政策連接至叢集的該角色。若要啟用,請依照「使用 IAM角色來存取 Amazon S3 儲存貯體」中的步驟進行。

    • 若要從 Babelfish 資料庫叢集中匯出資料,必須將 Amazon S3 儲存貯體的存取權授予叢集。如同匯入,我們建議您使用 IAM 角色和政策。若要啟用,請依照「設定對 Amazon S3 儲存貯體的存取權」中的步驟進行。

您現在可以搭配 Babelfish 資料庫叢集使用 Amazon S3 與 aws_s3 擴充功能。

將資料從 Amazon S3 匯入至 Babelfish 以及將 Babelfish 資料匯出至 Amazon S3
  1. 搭配 Babelfish 資料庫叢集使用 aws_s3 擴充功能。

    執行此操作時,請務必參考存在於 Postgre 內容中的資料表SQL。也就是說,如果你想匯入至名稱為 [database].[schema].[tableA] 的 Babelfish 資料表,請在 aws_s3 函數中以 database_schema_tableA 參考該表:

  2. 使用aws_s3延伸模組和 Amazon S3 時,請務必使用 PostgreSQL 命名來參考 Babelfish 資料表,如下表所示。

Babelfish 資料表

Aurora PostgreSQL 資料表

database.schema.table

database_schema_table

若要進一步了解如何搭配 Aurora Postgre 使用 Amazon S3SQL,請參閱 將資料從 Amazon S3 匯入至適用於 PostgreSQL 資料庫執行個體的 Aurora Postgre 資料庫叢集從適用於 PostgreSQL 資料庫執行個體的 Aurora Postgre 資料庫叢集匯出資料至 Amazon S3

搭配 使用 Babelfish AWS Lambda

aws_lambda 擴充功能載入 Babelfish 資料庫叢集中之後,但在叫用 Lambda 函數之前,您可以按照此程序為資料庫叢集提供 Lambda 存取權。

為 Babelfish 資料庫叢集設定存取權以搭配使用 Lambda

此程序使用 AWS CLI 來建立IAM政策和角色,並將其與 Babelfish 資料庫叢集建立關聯。

  1. 建立允許從您的 Babelfish 資料庫叢集存取 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" } ] }'
  2. 建立 政策在執行時間可擔任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" } ] }'
  3. 將政策連接到角色。

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::444455556666:policy/rds-lambda-policy \ --role-name rds-lambda-role --region aws-region
  4. 將角色連接至 Babelfish 資料庫叢集

    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 資料庫叢集的詳細資訊和範例 AWS Lambda,請參閱 步驟 2:IAM針對 Postgre 資料庫執行個體設定 Aurora 叢集和 AWS Lambda

從 Babelfish 資料庫叢集叫用 Lambda 函數

AWS Lambda 支援以 Java、Node.js、Python、Ruby 和其他語言編寫的函數。如果叫用的函數會傳回文字,則可以從 Babelfish 資料庫叢集中叫用它。以下範例是傳回問候語的預留位置 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 資料庫叢集。如需詳細資訊,請參閱使用 psql 來連線至資料庫叢集

  2. 建立包裝函式。此範例針對 SQL、 使用 Postgre SQL的程序語言PL/pgSQL。若要進一步了解,請參閱 PL/pg SQL–SQL 程序語言

    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)
    2. 若要從TDS連接埠叫用 (呼叫) 此函數,請使用 SQL Server sqlcmd命令列用戶端連線至連接埠。如需詳細資訊,請參閱 使用 SQL Server 用戶端來連線至資料庫叢集。連線後,請執行以下命令:

      1> select lambda_wrapper(); 2> go

      此命令會傳回類似以下的輸出:

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

若要進一步了解如何將 Lambda 與 Aurora Postgre 搭配使用SQL,請參閱 調用 AWS Lambda 來自適用於 Postgre SQL 資料庫執行個體的 Aurora 資料庫叢集RDS功能 SQL。如需使用 Lambda 函數的詳細資訊,請參閱《AWS Lambda 開發人員指南》中的 Lambda 入門

在 Babelfish 中使用 pg_stat_statements

Babelfish for Aurora PostgreSQL 支援從 3.3.0 pg_stat_statements延伸。若要進一步瞭解,請參閱 pg_stat_statements

如需 Aurora Postgre 支援的此延伸模組版本的詳細資訊SQL,請參閱延伸模組版本

建立 pg_stat_statements 擴充功能

若要開啟 pg_stat_statements,您必須開啟查詢識別碼計算。如果 compute_query_id 在參數群組中設定為 onauto,則會自動完成此操作。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端點建立擴充功能。

授權擴充功能

根據預設,您可以查看在 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();
  2. 使用 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)

重設查詢統計

您可以使用 pg_stat_statements_reset() 來重設 pg_stat_statements 迄今收集的統計資料。若要進一步瞭解,請參閱 pg_stat_statements。目前僅透過PSQL端點支援。使用rds_superuser權限連線至 Babelfish for Aurora PostgreSQL,請使用下列命令:

SELECT pg_stat_statements_reset();

限制

  • 目前, pg_stat_statements() 不支援透過 T-SQL 端點。 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 dbnamegotoprintraise errorsetthrowdeclare cursor

  • 對於 CREATELOGIN和 ALTERLOGIN陳述式,不會顯示查詢和 queryid。它將顯示權限不足。

  • pg_stat_statements 檢視始終包含以下兩個項目,因為這些是由 sqlcmd 用戶端內部執行。

    • SET QUOTED_IDENTIFIER OFF

    • SET TEXTSIZE 4096

在 Babelfish 中使用 pgvector

pgvector 是一種開放原始碼延伸模組,可讓您直接在 Postgres 資料庫中搜尋類似的資料。Babelfish 現在支援從 15.6 和 16.2 版開始的此延伸。如需詳細資訊,請參閱 pgvector 開放原始碼文件

必要條件

若要啟用 pgvector 功能,請使用下列其中一種方法在 sys 結構描述中安裝延伸模組:

  • 在 sqlcmd 用戶端中執行下列命令:

    exec sys.sp_execute_postgresql 'CREATE EXTENSION vector WITH SCHEMA sys';
  • 在 psql 用戶端中連線至 babelfish_db並執行下列命令:

    CREATE EXTENSION vector WITH SCHEMA sys;
注意

安裝 pgvector 延伸模組後,向量資料類型將僅在您建立的新資料庫連線中可用。現有的連線無法辨識新的資料類型。

支援的功能

Babelfish 擴充 T-SQL 功能以支援下列項目:

  • 儲存

    Babelfish 現在支援向量資料類型相容的語法,增強其 T SQL相容性。若要進一步了解使用 pgvector 儲存資料,請參閱儲存

  • 查詢

    Babelfish 擴展 T-SQL 表達式支援,以包含向量相似性運算子。不過,對於所有其他查詢,仍然需要標準 T SQL語法。

    注意

    T-SQL 不支援陣列類型,且資料庫驅動程式沒有任何可處理的界面。作為解決方法,Babelfish 使用文字字串 (varchar/nvarchar) 來存放向量資料。例如,當您請求向量值 【1,2,3】 時,Babelfish 會傳回字串 '【1,2,3】' 作為回應。您可以根據您的需求,在應用程式層級剖析和分割此字串。

    若要進一步了解如何使用 pgvector 查詢資料,請參閱查詢

  • 編製索引

    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 為資料編製索引,請參閱編製索引

  • 效能

    • SET BABELFISH_STATISTICS PROFILE ON 使用 從 T-SQL 端點偵錯查詢計劃。

    • max_parallel_workers_get_gather 使用 T- 中支援的 set_config 函數來增加 SQL。

    • 使用 IVFFlat進行近似搜尋。如需詳細資訊,請參閱IVFFlat

    若要改善 pgvector 的效能,請參閱效能

限制

  • Babelfish 不支援混合式搜尋的全文搜尋。如需詳細資訊,請參閱混合搜尋

  • Babelfish 目前不支援重新索引功能。不過,您仍然可以使用 PostgreSQL 端點重新索引。如需詳細資訊,請參閱清空

搭配 Babelfish 使用 Amazon Aurora 機器學習

您可以將 Babelfish for Aurora PostgreSQL 資料庫叢集與 Amazon Aurora Machine Learning 整合,以擴展其功能。這種無縫整合可讓您存取各種功能強大的服務,例如 Amazon Comprehend 或 Amazon SageMaker AI 或 Amazon Bedrock,每個服務都專為滿足不同的機器學習需求而量身打造。

身為 Babelfish 使用者,您可以在使用 Aurora Machine Learning 時使用現有的 TSQL 語法和語意知識。請遵循 Aurora Postgre AWS 文件中提供的指示SQL。如需詳細資訊,請參閱搭配 Aurora Postgre 使用 Amazon Aurora 機器學習SQL

必要條件

  • 在嘗試設定 Babelfish for Aurora PostgreSQL 資料庫叢集以使用 Aurora 機器學習之前,您必須了解相關要求和先決條件。如需詳細資訊,請參閱搭配 Aurora Postgre 使用 Aurora 機器學習的要求SQL

  • 請確定您使用 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函數處理 TSQL 語法和語意

下列範例說明如何將 T-SQL 語法和語意套用至 Amazon ML 服務:

範例 :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 );
範例 :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');
範例 :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且類型為「任何」,因此使用者可以將任意長度和任何資料類型的清單傳遞至 函數,該函數將做為模型的輸入。下列範例示範如何叫用 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 Postgre 使用 Aurora 機器學習的詳細資訊SQL,請參閱 搭配 Aurora Postgre 使用 Amazon Aurora 機器學習SQL

限制

  • 雖然 Babelfish 不允許建立陣列,但仍然可以處理代表陣列的資料。當您使用aws_bedrock.invoke_model_get_embeddings像傳回陣列這樣的函數時,結果會以包含陣列元素的字串傳遞。