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

参考链接和文献:

相关文章
|
29天前
|
存储 安全 API
oss服务器端加密(Server-Side Encryption Configuration)
阿里云OSS提供服务器端加密(SSE),确保静态数据安全。支持SSE-KMS,使用KMS托管CMK加密。数据上传时自动加密,下载时自动解密。用户可设置Bucket默认加密或在上传时指定加密选项。适用于高度保护数据场景,如敏感个人信息和企业关键信息。兼容多种部署形态,特定特性地域可用。此功能简化了加密处理,增强了云端数据安全性。
31 1
|
23天前
|
Ubuntu JavaScript 关系型数据库
在阿里云Ubuntu 20.04服务器中搭建一个 Ghost 博客
在阿里云Ubuntu 20.04服务器上部署Ghost博客的步骤包括创建新用户、安装Nginx、MySQL和Node.js 18.x。首先,通过`adduser`命令创建非root用户,然后安装Nginx和MySQL。接着,设置Node.js环境,下载Nodesource GPG密钥并安装Node.js 18.x。之后,使用`npm`安装Ghost-CLI,创建Ghost安装目录并进行安装。配置过程中需提供博客URL、数据库连接信息等。最后,测试访问前台首页和后台管理页面。确保DNS设置正确,并根据提示完成Ghost博客的配置。
在阿里云Ubuntu 20.04服务器中搭建一个 Ghost 博客
|
27天前
|
存储 弹性计算 数据可视化
要将ECS中的文件直接传输到阿里云网盘与相册(
【2月更文挑战第31天】要将ECS中的文件直接传输到阿里云网盘与相册(
412 4
|
28天前
|
SQL 弹性计算 安全
购买阿里云活动内云服务器之后设置密码、安全组、增加带宽、挂载云盘教程
当我们通过阿里云的活动购买完云服务器之后,并不是立马就能使用了,还需要我们设置云服务器密码,配置安全组等基本操作之后才能使用,有的用户还需要购买并挂载数据盘到云服务器上,很多新手用户由于是初次使用阿里云服务器,因此并不知道这些设置的操作流程,下面给大家介绍下这些设置的具体操作流程。
购买阿里云活动内云服务器之后设置密码、安全组、增加带宽、挂载云盘教程
|
12天前
|
弹性计算
阿里云ECS使用体验
在申请高校学生免费体验阿里云ECS云服务器后的一些使用体验和感受。
|
29天前
|
弹性计算
阿里云3M带宽云服务器并发多大?阿里云3M带宽云服务器测评参考
在探讨云服务器3M带宽能支持多大并发这一问题时,我们首先要明白一个关键点:并发量并非仅由带宽决定,还与网站本身的大小密切相关。一般来说,一个优化良好的普通网站页面大小可能只有几K,为便于计算,我们可以暂且假定每个页面大小为50K。
794 1
|
2天前
|
弹性计算 运维 安全
阿里云ecs使用体验
整了台服务器部署项目上线
|
5天前
|
弹性计算 应用服务中间件 Linux
阿里云ECS服务器上从零开始搭建nginx服务器
阿里云ECS服务器上从零开始搭建nginx服务器
|
5天前
|
弹性计算
阿里云ECS的使用心得
本文主要讲述了我是如何了解到ECS,使用ECS的一些经验,以及自己的感悟心得
|
7天前
|
弹性计算 安全
电子好书发您分享《阿里云第八代企业级ECS实例,为企业提供更安全的云上防护》
阿里云第八代ECS实例,搭载第五代英特尔至强处理器与飞天+CIPU架构,提升企业云服务安全与算力。[阅读详情](https://developer.aliyun.com/ebook/8303/116162?spm=a2c6h.26392459.ebook-detail.5.76bf7e5al1Zn4U) ![image](https://ucc.alicdn.com/pic/developer-ecology/cok6a6su42rzm_f422f7cb775444bbbfc3e61ad86800c2.png)
32 14