生成列(Generated Columns)概述

2024-09-01 04:36

本文主要是介绍生成列(Generated Columns)概述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

生成列(Generated Columns)是数据库表中的一种特殊列,它的值不是直接存储的,而是根据其他列的值计算得出的。生成列可以是虚拟列(Virtual Column)或存储列(Stored Column),根据实际需求来选择。生成列在某些场景下可以简化数据处理逻辑并提高查询效率,特别是当需要频繁计算某个值时。

生成列的类型
  1. 虚拟列(Virtual Column)

    • 特点:虚拟列的值不会实际存储在数据库中,而是每次查询时动态计算。
    • 优点:节省存储空间,因为它不占用额外的磁盘空间。
    • 缺点:每次查询时需要实时计算,可能影响查询性能,特别是在大数据量的情况下。
  2. 存储列(Stored Column)

    • 特点:存储列的值会在插入或更新时计算并保存到数据库中,因此查询时无需重新计算。
    • 优点:提高查询性能,因为值是预先计算好的,查询时直接读取。
    • 缺点:占用额外的存储空间,且每次插入或更新数据时需要额外的计算时间。
使用生成列的示例

假设我们有一个电商平台的 products 表,存储了商品的一些基础信息和属性数据,其中有些属性数据存储在 JSON 字段中。我们希望能够通过生成列来简化查询操作,提高查询性能。

表结构示例:
CREATE TABLE products (product_id INT PRIMARY KEY,product_name VARCHAR(255),category VARCHAR(50),attributes JSON,screen_size DECIMAL GENERATED ALWAYS AS (CAST(attributes->>'$.屏幕尺寸' AS DECIMAL)) STORED,battery_capacity DECIMAL GENERATED ALWAYS AS (CAST(attributes->>'$.电池容量' AS DECIMAL)) STORED
);

解释:

  • screen_sizebattery_capacity 是生成列,它们的值分别通过 CAST(attributes->>'$.屏幕尺寸' AS DECIMAL)CAST(attributes->>'$.电池容量' AS DECIMAL) 计算得出。
  • GENERATED ALWAYS AS 定义了生成列的计算方式。
  • STORED 关键字表示这些生成列的值会被存储在数据库中,而不是每次查询时动态计算。
查询示例

现在我们可以通过生成列直接查询满足条件的商品,而无需每次都在查询语句中进行计算:

SELECT product_id, product_name, screen_size, battery_capacity
FROM products
WHERE screen_size > 6
AND battery_capacity > 3000;

优势:

  • 简化查询:生成列让查询语句变得更加简洁,因为计算逻辑已经在列定义时处理好了。
  • 提高性能:由于 screen_sizebattery_capacity 是存储列,查询时不需要再执行 JSON 提取和数据类型转换操作,直接读取预先计算好的值,大大提高了查询性能。
注意事项
  • 存储开销:存储列虽然提高了查询性能,但会增加数据库的存储需求,因为这些列的数据需要被实际存储。
  • 更新成本:每次插入或更新涉及到基础列(例如 JSON 字段)时,生成列的值也需要重新计算并更新,这会增加写操作的成本。
  • 适用场景:生成列特别适用于那些需要频繁查询计算结果且计算过程较为复杂的场景。在这种情况下,通过预先计算并存储结果可以大幅度提高系统的查询效率。
结论

生成列提供了一种灵活的方式来处理数据库表中的计算需求,尤其是在涉及到 JSON 字段或其他复杂计算的场景中。通过合理地使用存储列,开发人员可以有效提高查询性能,同时保持数据库设计的简洁性。

这篇关于生成列(Generated Columns)概述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125951

相关文章

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文

Vue3 如何通过json配置生成查询表单

《Vue3如何通过json配置生成查询表单》本文给大家介绍Vue3如何通过json配置生成查询表单,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录功能实现背景项目代码案例功能实现背景通过vue3实现后台管理项目一定含有表格功能,通常离不开表单

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

Python使用python-pptx自动化操作和生成PPT

《Python使用python-pptx自动化操作和生成PPT》这篇文章主要为大家详细介绍了如何使用python-pptx库实现PPT自动化,并提供实用的代码示例和应用场景,感兴趣的小伙伴可以跟随小编... 目录使用python-pptx操作PPT文档安装python-pptx基础概念创建新的PPT文档查看

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结

Python实现数据可视化图表生成(适合新手入门)

《Python实现数据可视化图表生成(适合新手入门)》在数据科学和数据分析的新时代,高效、直观的数据可视化工具显得尤为重要,下面:本文主要介绍Python实现数据可视化图表生成的相关资料,文中通过... 目录前言为什么需要数据可视化准备工作基本图表绘制折线图柱状图散点图使用Seaborn创建高级图表箱线图热

SQLServer中生成雪花ID(Snowflake ID)的实现方法

《SQLServer中生成雪花ID(SnowflakeID)的实现方法》:本文主要介绍在SQLServer中生成雪花ID(SnowflakeID)的实现方法,文中通过示例代码介绍的非常详细,... 目录前言认识雪花ID雪花ID的核心特点雪花ID的结构(64位)雪花ID的优势雪花ID的局限性雪花ID的应用场景