搭配 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) 顯示在範例中。

    對於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:

    輸入資料庫叢集使用者名稱 (-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 擴充功能。

    執行此操作時,請務必以資料表存在於 PostgreSQL 情境的方式參考資料表。也就是說,如果你想匯入至名稱為 [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

若要進一步了解如何將 Amazon S3 與 Aurora PostgreSQL 搭配使用,請參閱 將資料從 Amazon S3 匯入 Aurora PostgreSQL 資料庫叢集將資料從 Aurora PostgreSQL 資料庫叢集匯出至 Amazon S3

使用巴貝魚 AWS Lambda

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

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

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

  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 函數。如需使用設定 Aurora PostgreSQL 資料庫叢集的詳細資訊和範例 AWS Lambda, AWS Lambda 請參閱。步驟 2:為您的 Aurora PostgreSQL 資料庫叢集個體和 AWS Lambda

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

AWS Lambda 支持用 Java,Node.js,Python,紅寶石和其他語言編寫的功能。如果叫用的函數會傳回文字,則可以從 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 使用 PostgreSQL 的程序語言 PL/pgSQL。如需進一步了解,請參閱 PL/PGSQL-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 PostgreSQL 搭配使用,請參閱 。如需使用 Lambda 函數的詳細資訊,請參閱《AWS Lambda 開發人員指南》中的 Lambda 入門

在 Babelfish 中使用 pg_stat_statements

Babelfish for Aurora PostgreSQL 從 3.3.0 開始支援 pg_stat_statements 擴充功能。若要進一步瞭解,請參閱 pg_stat_statements

如需 Aurora PostgreSQL 支援的這個擴充功能版本的詳細資訊,請參閱擴充功能版本

建立 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();

限制

  • 目前,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 dbnamegotoprintraise errorsetthrowdeclare cursor

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

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

    • SET QUOTED_IDENTIFIER OFF

    • SET TEXTSIZE 4096

在巴比魚中使用 pgvector

pgvector 是一種開放原始碼擴充套件,可讓您直接在 Postgres 資料庫中搜尋類似的資料。巴貝魚現在支持這個擴展從版本 15.6 和 16.2 開始。如需詳細資訊,請參閱 pgvector 開放原始碼文件

必要條件

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

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

    exec sys.sp_execute_postgresql 'CREATE EXTENSION vector WITH SCHEMA sys';
  • 在 psql 客戶端中 Connect babelfish_db 並運行以下命令:

    CREATE EXTENSION vector WITH SCHEMA sys;
注意

安裝 pgvector 擴充功能之後,向量資料類型只能在您建立的新資料庫連線中使用。現有的連接將無法識別新的數據類型。

支援的功能

巴貝魚擴展了 T-SQL 功能以支持以下內容:

  • 儲存

    Babelfish 現在支援向量資料類型相容語法,增強其 T-SQL 相容性。要了解有關使用 pgvector 存儲數據的更多信息,請參閱存儲

  • 查詢

    巴貝魚擴展 T-SQL 表達式支持,以包括向量相似性運算符。但是,對於所有其他查詢,仍然需要標準 T-SQL 語法。

    注意

    T-SQL 不支持數組類型,數據庫驅動程序沒有任何接口來處理它們。作為一種解決方法,巴貝爾魚使用文本字符串(變量/nvarchar)來存儲矢量數據。例如,當您請求向量值 [1,2,3] 時,巴貝爾魚將返回一個字符串 '[1,2,3]' 作為響應。您可以根據需要在應用程序級別解析和拆分此字符串。

    要了解有關使用 pgvector 查詢數據的更多信息,請參閱查詢

  • 編製索引

    T-SQL Create Index 現在支援USING INDEX_METHOD語法。您現在可以定義建立索引時要在特定資料行上使用的相似性搜尋運算子。

    該語法也被擴展到支持所需的列上的向量相似性操作(檢查列表 _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-SQL 中支持的set_config功能進行增加。

    • IVFFlat於近似搜尋。如需詳細資訊,請參閱 IVFFLat

    若要使用 pgvector 提升效能,請參閱效能

限制

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

  • 巴貝魚目前不支持重新索引功能。不過,您仍然可以使用 PostgreSQL 端點來重新建立索引。如需詳細資訊,請參閱吸塵

使用 Amazon Aurora 機器學習與巴貝爾魚

您可以將適用於 Aurora PostgreSQL 資料庫叢集的 Babelfish 與 Amazon Aurora 機器學習整合,以擴充該叢集的功能。這種無縫整合可讓您存取一系列功能強大的服務,例如 Amazon Comprehend、Amazon SageMaker 或 Amazon 基岩,每種服務都是為滿足不同的機器學習需求而量身打造的。

身為 Babelfish 使用者,您可以在使用 Aurora 機器學習時,使用現有的 T-SQL 語法和語意知識。請依照 Aurora PostgreSQL 的 AWS 文件中提供的指示進行。如需詳細資訊,請參閱 將 Amazon Aurora Machine Learning 與 Aurora PostgreSQL 搭配使用

必要條件

  • 在嘗試將 Aurora PostgreSQL 資料庫叢集設定為使用 Aurora 機器學習之前,您必須瞭解相關需求和先決條件。如需詳細資訊,請參閱 將 Aurora Machine Learning 與 Aurora PostgreSQL 搭配使用的建議

  • 確保您使用 Postgres 端點或sp_execute_postgresql存儲過程安裝aws_ml擴展程序。

    exec sys.sp_execute_postgresql 'Create Extension aws_ml'
    注意

    目前巴貝爾魚不支持sp_execute_postgresql在巴貝爾魚中的級聯操作。由於aws_ml依賴於aws_commons,因此您需要使用 Postgres 端點單獨安裝它。

    create extension aws_common;

使用函數處理 T-SQL 語法和語義 aws_ml

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

範例 : aws_bedrock_model — 使用 Amazon 基岩函數的簡單查詢
aws_bedrock.invoke_model( model_id varchar, content_type text, accept_type text, model_input text) Returns Varchar(MAX)

下面的例子演示了如何調用人為基岩克勞德 2 模型使用調用 invoke 模型。

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 );
範例 : 偵測情緒 — 使用 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_sagemak-使用 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 機器學習與 Aurora PostgreSQL 搭配使用的詳細資訊,請參閱。將 Amazon Aurora Machine Learning 與 Aurora PostgreSQL 搭配使用

限制

  • 雖然 Babelfish 不允許創建數組,但它仍然可以處理代表數組的數據。當您使用類似傳回陣列aws_bedrock.invoke_model_get_embeddings的函式時,結果會以包含陣列元素的字串形式傳送。