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

参考链接和文献:

相关文章
|
1月前
|
存储 安全 API
oss服务器端加密(Server-Side Encryption Configuration)
阿里云OSS提供服务器端加密(SSE),确保静态数据安全。支持SSE-KMS,使用KMS托管CMK加密。数据上传时自动加密,下载时自动解密。用户可设置Bucket默认加密或在上传时指定加密选项。适用于高度保护数据场景,如敏感个人信息和企业关键信息。兼容多种部署形态,特定特性地域可用。此功能简化了加密处理,增强了云端数据安全性。
72 1
|
1月前
|
前端开发 数据处理 API
后端开发:构建稳健与高效的服务器逻辑
后端开发:构建稳健与高效的服务器逻辑
|
XML Java Maven
部署在SAP ABAP服务器上的SAP UI5应用,resource root的计算逻辑
Created by Jerry Wang, last modified on Oct 22, 2015 file: .UI5RepositoryAppSetup
部署在SAP ABAP服务器上的SAP UI5应用,resource root的计算逻辑
|
JavaScript SEO
调试 SAP Spartacus 服务器端渲染 SEO HTML Tag 生成逻辑的注意事项
调试 SAP Spartacus 服务器端渲染 SEO HTML Tag 生成逻辑的注意事项
调试 SAP Spartacus 服务器端渲染 SEO HTML Tag 生成逻辑的注意事项
从 SAP WebIDE 往 ABAP 服务器上部署 SAP UI5 应用的一些后台执行逻辑的单步调试
从 SAP WebIDE 往 ABAP 服务器上部署 SAP UI5 应用的一些后台执行逻辑的单步调试
从 SAP WebIDE 往 ABAP 服务器上部署 SAP UI5 应用的一些后台执行逻辑的单步调试
|
XML Java Maven
部署在SAP ABAP服务器上的SAP UI5应用,resource root的计算逻辑
部署在SAP ABAP服务器上的SAP UI5应用,resource root的计算逻辑
部署在SAP ABAP服务器上的SAP UI5应用,resource root的计算逻辑
部署到ABAP服务器上的SAP UI5应用,其index.html的读取逻辑
How is correct index.html served by ui5 handler from BSP repository
106 0
部署到ABAP服务器上的SAP UI5应用,其index.html的读取逻辑
|
关系型数据库 数据库 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. 快速设置 逻辑复制是根据复制标识(通常是主键)复制数据对象及其更改的一种方法。
1489 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 31 章 逻辑复制_31.9. 快速设置
31.9. 快速设置 首先设置postgresql.conf中的配置选项: wal_level = logical 其他所需设置的默认值对于基本设置来说足够了。 需要调整pg_hba.conf以允许复制 (这里的值取决于你的实际网络配置和你想要用于连接的用户): host all repuser 0.
1260 0