

# 使用适用于 Aurora PostgreSQL 的 Babelfish 过程
<a name="Appendix.Babelfish.Functions"></a>

## 概述
<a name="Appendix.Babelfish.Functions.Overview"></a>

您可以对运行适用于 Aurora PostgreSQL 的 Babelfish 的 Amazon RDS 数据库实例使用以下过程，以提高查询性能：
+ [sp\$1babelfish\$1volatility](sp_babelfish_volatility.md)
+ [sp\$1execute\$1postgresql](sp_execute_postgresql.md)

# sp\$1babelfish\$1volatility
<a name="sp_babelfish_volatility"></a>

PostgreSQL 函数不稳定性有助于优化器更好地执行查询，当在某些子句的某些部分中使用时，会对查询性能产生重大影响。

## 语法
<a name="sp_babelfish_volatility-syntax"></a>

 

```
sp_babelfish_volatility ‘function_name’, ‘volatility’
```

## 参数
<a name="sp_babelfish_volatility-arguments"></a>

 *function\$1name（可选）*   
您可以将此参数的值指定为由两部分组成的名称 `schema_name.function_name`，也可以仅指定 `function_name`。如果您仅指定 `function_name`，则架构名称是当前用户的原定设置架构。

 *volatility（可选）*   
有效的 PostgreSQL 不稳定性值为 `stable`、`volatile` 或 `immutable`。有关更多信息，请参阅 [https://www.postgresql.org/docs/current/xfunc-volatility.html](https://www.postgresql.org/docs/current/xfunc-volatility.html)

**注意**  
当使用具有多个定义的 `function_name` 调用 `sp_babelfish_volatility` 时，将引发错误。

## 结果集
<a name="sp_babelfish_volatility-return-type"></a>

如果未提及参数，则结果集将显示在以下各列之下：`schemaname`、`functionname`、`volatility`。

## 使用说明
<a name="sp_babelfish_volatility-usage-notes"></a>

PostgreSQL 函数不稳定性有助于优化器更好地执行查询，当在某些子句的某些部分中使用时，会对查询性能产生重大影响。

## 示例
<a name="sp_babelfish_volatility-examples"></a>

以下示例显示了如何创建简单的函数，稍后将说明如何使用不同的方法在这些函数上使用 `sp_babelfish_volatility`。

```
1> create function f1() returns int as begin return 0 end
2> go
```

```
1> create schema test_schema
2> go
```

```
1> create function test_schema.f1() returns int as begin return 0 end
2> go
```

以下示例显示了函数的不稳定性：

```
1> exec sp_babelfish_volatility
2> go
            
schemaname  functionname volatility
----------- ------------ ----------
dbo         f1           volatile
test_schema f1           volatile
```

以下示例显示了如何更改函数的不稳定性：

```
1> exec sp_babelfish_volatility 'f1','stable'
2> go
1> exec sp_babelfish_volatility 'test_schema.f1','immutable'
2> go
```

当您仅指定 function\$1name 时，它会显示该函数的架构名称、函数名称和不稳定性。以下示例显示了更改值后函数的不稳定性：

```
1> exec sp_babelfish_volatility 'test_schema.f1'
2> go
            
schemaname  functionname volatility
----------- ------------ ----------
test_schema f1           immutable
```

```
1> exec sp_babelfish_volatility 'f1'
2> go
            
schemaname  functionname volatility
----------- ------------ ----------
dbo         f1           stable
```

当您不指定任何参数时，它会显示当前数据库中存在的函数列表（架构名称、函数名称、函数的不稳定性）：

```
1> exec sp_babelfish_volatility 
2> go
            
schemaname  functionname volatility
----------- ------------ ----------
dbo         f1           stable
test_schema f1           immutable
```

# sp\$1execute\$1postgresql
<a name="sp_execute_postgresql"></a>

您可以从 T-SQL 终端节点执行 PostgreSQL 语句。这简化了您的应用程序，因为您无需退出 T-SQL 端口即可执行这些语句。

## 语法
<a name="sp_execute_postgresql-syntax"></a>

 

```
sp_execute_postgresql [ @stmt = ] statement
```

## 参数
<a name="sp_execute_postgresql-arguments"></a>

 *[ @stmt ] statement*   
参数的数据类型为 varchar。此参数接受 PG 方言语句。

**注意**  
您只能传递一个 PG 方言语句作为参数，否则会引发以下错误。

```
1>exec sp_execute_postgresql 'create extension pg_stat_statements; drop extension pg_stat_statements'
2>go
```

```
Msg 33557097, Level 16, State 1, Server BABELFISH, Line 1
expected 1 statement but got 2 statements after parsing
```

## 使用说明
<a name="sp_execute_postgresql-statements"></a>

### CREATE EXTENSION
<a name="sp_execute_postgresql-statements-create"></a>

创建新的扩展并将其加载到当前数据库中。

```
1>EXEC sp_execute_postgresql 'create extension [ IF NOT EXISTS ] <extension name> [ WITH ] [SCHEMA schema_name] [VERSION version]';
2>go
```

以下示例说明了如何创建扩展：

```
1>EXEC sp_execute_postgresql 'create extension pg_stat_statements with schema sys version "1.10"';
2>go
```

使用以下命令访问扩展对象：

```
1>select * from pg_stat_statements;
2>go
```

**注意**  
 如果在创建扩展期间未明确提供模式名称，则默认情况下，扩展将安装在公共模式中。您必须提供模式限定符才能访问扩展对象，如下所述：

```
1>select * from [public].pg_stat_statements;
2>go
```

**支持的扩展**

Aurora PostgreSQL 提供的以下扩展适用于 Babelfish。
+ `pg_stat_statements`
+ `tds_fdw`
+ `fuzzystrmatch`

**限制**
+ 用户需要在 T-SQL 上具有 sysadmin 角色，在 postgres 上具有 rds\$1superuser 角色才能安装扩展。
+ 扩展不能安装在用户创建的模式中，也不能安装在主数据库、tempdb 和 msdb 数据库的 dbo 和访客模式中。
+ 不支持 CASCADE 选项。

## ALTER EXTENSION
<a name="sp_execute_postgresql-alter"></a>

您可以使用 ALTER 扩展升级到新的扩展版本。

```
1>EXEC sp_execute_postgresql 'alter extension <extension name> UPDATE TO <new_version>';
2>go
```

**限制**
+ 您只能使用 ALTER Extension 语句升级扩展的版本。不支持其它操作。

## DROP EXTENSION
<a name="sp_execute_postgresql-drop"></a>

删除指定的扩展。您也可以使用 `if exists` 或 `restrict` 选项删除扩展。

```
1>EXEC sp_execute_postgresql 'drop extension <extension name>';
2>go
```

**限制**
+ 不支持 CASCADE 选项。