CMU 15-721 16-服务器端的逻辑执行 Server -side Logic Execution

简介: 今日议题背景介绍用户自定义函数的内联背景介绍数据库客户端API目前我们假设所有的用户逻辑都在客户自己的应用中,然后通过客户端协议如JDBC/ODBC和数据库进行通信获取和存储数据,如下图:嵌入式数据库逻辑数据库允许将应用逻辑移植到数据库中减少网络通信的交互次数,这样的好处是高效和可重用。

今日议题

  • 背景介绍

  • 用户自定义函数的内联

背景介绍

数据库客户端API

目前我们假设所有的用户逻辑都在客户自己的应用中,然后通过客户端协议如JDBC/ODBC和数据库进行通信获取和存储数据,如下图:
image

嵌入式数据库逻辑

数据库允许将应用逻辑移植到数据库中减少网络通信的交互次数,这样的好处是高效和可重用。
将应用逻辑->
image
变为数据库逻辑-> 
image

用户自定义函数UDF

用户自定义函数(UDF)就是除了系统函数,内嵌在数据库中应用开发者自己写的函数,它可以输入标量参数,执行一些计算,返回一个结果(包括标量结果或者表结果)。
image

用户自定义函数UDF的优势

它可以鼓励模块化和代码重用,不同应用可以用同一逻辑实现,对于复杂操作很少的网络交互,某些类型的应用可以非常容易的用UDF表达或者读取。

用户自定义函数UDF的劣势

查询优化器是把UDF当成黑盒,因此,
→ 无法评估它的代价,由于UDF有相关查询在里面,因此很难并行。
→ 一些数据库不支持一个线程中执行带UDF的查询,在查询或者WHERE条件里面的复杂UDF,会强制数据库用迭代方式执行。
→ RBAR = "Row By Agonizing Row",也就是严格程序化编码的结果,而不是基于集合的方式,比如循环中一行行和数据库进行交互。
→ 如果UDF里面调用的查询有隐性的Join而优化器无法得知,那样更糟糕。因为数据库执行UDF里的SQL都是一行一行的方式,所以那些跨多语句的优化方式无法被应用到。

UDF的性能

先看SQL Server做的一个实验
image

MICROSOFT SQL SERVER UDF的历史

  • 2001 – Microsoft支持了TSQL标量UDFs.
  • 2008 – 用户开始发现UDF是“恶魔”。
  • 2010 – Microsoft发现UDF是“恶魔”。
  • 2014 – UDF的去相关研究开始@IIT-B。
  • 2015 – Froid项目在MSFT Jim Gray Lab开始。
  • 2018 – Froid项目进入SQL Server 2019。

Froid项目

自动把UDF转换成关系型表达式,并且可以被内联为子查询。不需要应用程序员去修改UDF的代码,而是在数据库Rewrite阶段就进行转换,从而避免修改基于代价的优化器。商业数据库已经有能力去把这些规则有效的转换为子查询。

子查询重写

数据库本身就把在Where子句中的嵌套子查询当成一个带参数并返回单值或结果集的函数,因此有两种方法进行优化:
→ 去除相关性或者扁平化重写SQL
→ 分解嵌套子查询并存为临时表
image

LATERAL连接

一个带lateral的内子查询可以引用相关联表的那些行,从而决定是否将它们返回到最终输出。
→ 允许在FROM子句中加入子查询,而且在查询过程中每次迭代一行会评估该内子查询的有关联关系的表的每一行。
→ 内子查询返回的行可以被加入到与外查询Join完的最终结果集中。

FROID 概述

步骤 #1 – 变换语句
image

步骤 #2 – UDF分块
image

步骤 #3 – 合并表达式
image

步骤 #4 – 内联UDF到查询
image

步骤 #5 – 优化器优化
image

额外惊喜的优化

优化前
image
优化后
image

参考链接和文献:

相关文章
|
6月前
|
存储 安全 API
oss服务器端加密(Server-Side Encryption Configuration)
阿里云OSS提供服务器端加密(SSE),确保静态数据安全。支持SSE-KMS,使用KMS托管CMK加密。数据上传时自动加密,下载时自动解密。用户可设置Bucket默认加密或在上传时指定加密选项。适用于高度保护数据场景,如敏感个人信息和企业关键信息。兼容多种部署形态,特定特性地域可用。此功能简化了加密处理,增强了云端数据安全性。
235 1
|
6月前
|
前端开发 数据处理 API
后端开发:构建稳健与高效的服务器逻辑
后端开发:构建稳健与高效的服务器逻辑
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 31 章 逻辑复制
第 31 章 逻辑复制 目录 31.1. 发布 31.2. 订阅 31.2.1. 复制槽管理 31.3. 冲突 31.4. 限制 31.5. 架构 31.5.1. 初始快照 31.6. 监控 31.7. 安全 31.8. 配置设置 31.9. 快速设置 逻辑复制是根据复制标识(通常是主键)复制数据对象及其更改的一种方法。
1513 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 31 章 逻辑复制_31.9. 快速设置
31.9. 快速设置 首先设置postgresql.conf中的配置选项: wal_level = logical 其他所需设置的默认值对于基本设置来说足够了。 需要调整pg_hba.conf以允许复制 (这里的值取决于你的实际网络配置和你想要用于连接的用户): host all repuser 0.
1279 0
|
关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 31 章 逻辑复制_31.8. 配置设置
31.8. 配置设置 逻辑复制需要设置几个配置选项。 在发布者端,必须将wal_level设置为logical, 并且max_replication_slots必须至少设置为预期连接的订阅数量, 加上一些预留用于表同步。
1327 0
|
安全 关系型数据库 数据库
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 31 章 逻辑复制_31.7. 安全
31.7. 安全 用于复制链接的角色必须具有REPLICATION属性 (或者是超级用户)。该用户的访问权限必须在pg_hba.conf中配置。 用户必须具有数据库的CREATE权限才能创建发布。
1143 0
|
监控 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 31 章 逻辑复制_31.6. 监控
31.6. 监控 由于逻辑复制基于与物理流式复制 类似的体系结构,因此发布节点上的监视与物理复制主节点的监视类似 (请参见第 26.2.5.2 节)。 有关订阅的监控信息可以在pg_stat_subscription 中看到。
1282 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 31 章 逻辑复制_31.5. 架构
31.5. 架构 31.5.1. 初始快照 逻辑复制首先复制发布者数据库上的数据快照。一旦完成, 发布者的变化就会实时发送给订阅者。订阅者按照发布者提交的顺序应用数据, 以确保任何单个订阅中的发布的事务一致性。
1387 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 31 章 逻辑复制_31.4. 限制
31.4. 限制 逻辑复制目前有以下限制或缺少的功能。 这些可能会在未来的版本中解决。 不复制数据库模式和DDL命令。初始模式可以使用pg_dump --schema-only 手动复制。后续的模式更改需要手动保持同步。
1328 0
|
关系型数据库 PostgreSQL SQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 31 章 逻辑复制_31.3. 冲突
31.3. 冲突 逻辑复制的行为与普通的DML操作类似,因为即使订阅者节点本地更改了数据, 数据也将被更新。如果传入数据违反任何限制,复制将停止。 这被称为冲突。当复制UPDATE 或者DELETE操作时,丢失的数据不会产生冲突,这样的操作将被忽略。
1468 0