优化SQL查询实现高效数据检索(一)

news2024/12/24 22:03:37

大家好,SQL(结构化查询语言)可以帮助大家从数据库中收集数据,它是专为此而设计的,换句话说,它使用行和列来处理数据,让使用者能够使用SQL查询来操作数据库中的数据。

SQL查询

SQL查询是一系列指令,向数据库发出这些指令以从中收集信息;可以使用这些查询从数据库中收集和操作数据;通过使用它们可以创建报告,进行数据分析等;由于这些查询的形式和长度,执行时间可能会很长,特别是在处理大型数据表时。

SQL查询优化

SQL查询优化的目的是确保你有效地使用资源。通俗地说,它可以减少执行时间,节省成本并提高性能。这对于开发人员和数据分析师来说是一项重要的技能。不仅从数据库返回正确的数据很重要,了解如何有效地做到这一点也很重要。

应该始终问自己:“是否有更好的编写查询的方法?”

让我们更深入地探讨一下这些原因。

资源效率:未经过优化的SQL查询会消耗过多的系统资源,如CPU和内存。这可能会导致整体系统性能下降。优化SQL查询可以确保这些资源得到有效利用。这反过来会导致更好的性能和可扩展性。

减少执行时间:如果查询运行缓慢,这将对用户体验产生负面影响。或者如果有一个正在运行的应用程序,这会导致应用程序性能下降。优化查询可以帮助减少执行时间,提供更快的响应时间和更好的用户体验。

节省成本:优化查询可以减少支持数据库系统所需的硬件和基础设施。这可以在硬件、能源和维护成本方面节约成本。

SQL查询优化技术

这份流程图展示了在优化SQL查询时应遵循的建议步骤。我们将在示例中遵循相同的方法。值得注意的是,优化工具也可以帮助提高查询性能。因此,让我们从众所周知的SQL命令SELECT开始,探索这些技术。

  • 使用指定字段的SELECT

当使用SELECT *时,它将返回表中所有行和所有列,与其扫描整个数据库,不如在SELECT之后使用特定字段。

在示例中,我们将使用特定的列名替换SELECT *。正如大家看到的那样,这将减少检索的数据量。因此,查询运行得更快,因为数据库必须获取并提供请求的列,而不是整个表的所有列。这可以在表包含大量列或大量数据行时最大限度地减轻数据库的I/O负担。

以下是优化之前的代码:

SELECT * FROM customer;

以下是输出结果:

 总查询运行时间为260毫秒,对此进行改进,为了展示这一点,本文将只选择3个不同列而不是选择全部,你也可以根据项目需要选择所需的列。以下是代码:

SELECT customer_id, 
       age, 
       country 
FROM customer;

以下是输出结果:

 正如你所看到的,通过定义我们要选择的字段,我们不会强制数据库扫描其所有数据,因此运行时间从260毫秒减少到79毫秒。想象一下,如果有数百万或数十亿行,或者有数百列,则会有很大的区别。

  • 避免使用SELECT DISTINCT

SELECT DISTINCT用于返回指定列中的唯一值。为此,数据库引擎必须扫描整个表并删除重复的值。在许多情况下,使用类似GROUP BY的替代方法可以提高性能,因为可以减少处理的数据量。

以下是代码:

SELECT DISTINCT segment 
FROM customer;

以下是输出结果:

我们的代码检索了customer表中segment列的唯一值,数据库引擎必须处理表中的所有记录,识别重复值并仅返回唯一值。对于大型表格来说,这可能会耗费大量时间和资源。

在替代版本中,以下查询通过使用GROUP BY子句检索segment列中的唯一值。GROUP BY子句根据指定的列对记录进行分组,为每个组返回一条记录。

以下是代码:

SELECT segment
FROM customer
GROUP BY segment;

以下是输出结果:

在本例中,GROUP BY子句有效地根据segment列对记录进行分组,从而产生与SELECT DISTINCT查询相同的输出。

通过避免使用SELECT DISTINCT并改用GROUP BY,你可以优化SQL查询并将总查询时间从198毫秒减少到62毫秒,这是超过3倍的速度。

  • 避免使用循环

循环可能会导致你的查询速度变慢,因为它们强制数据库一条一条地遍历记录。如果可能的话,使用内置操作和SQL函数,这些函数可以利用数据库引擎的优化并更有效地处理数据。

让我们来定义一个带有循环的自定义函数:

CREATE OR REPLACE FUNCTION sum_ages_with_loop() RETURNS TABLE (country_name TEXT, sum_age INTEGER) AS $$
DECLARE
    country_record RECORD;
    age_sum INTEGER;
BEGIN
    FOR country_record IN SELECT DISTINCT country FROM customer WHERE segment = 'Corporate'
    LOOP
        SELECT SUM(age) INTO age_sum FROM customer WHERE country = country_record.country AND segment = 'Corporate';
        country_name := country_record.country;
        sum_age := age_sum;
        RETURN NEXT;
    END LOOP;
END;
$$ LANGUAGE plpgsql;

上面的代码使用基于循环的方法来计算“Corporate”客户段中每个国家的年龄总和,它首先检索不同国家的列表,然后使用循环迭代每个国家,计算该国家客户的年龄总和。这种方法可能会很慢和低效,因为它是逐行处理数据。

现在让我们运行这个函数:

SELECT * 
FROM sum_ages_with_loop()

以下是输出结果:

使用此方法的运行时间为198毫秒,让我们看一下优化后的SQL代码:

SELECT country, 
       SUM(age) AS sum_age
FROM customer
WHERE segment = 'Corporate'
GROUP BY country;

以下是输出结果:
 

通常情况下,使用单个SQL查询的优化版本表现更佳,因为它利用了数据库引擎的优化能力。

为了在我们的第一个代码中获得相同的结果,我们使用了PL/pgSQL函数中的循环,这通常比使用单个SQL查询慢且不够有效,并且迫使编写更多的代码行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/745271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

11-2.箭头函数与函数的this问题

目录 1 箭头函数 1.1 基本使用 1.2 在只有一个参数的时候,小括号可以省略 1.3 只有一行时,可以省略大括号 1.4 只有一行时的return问题 1.5 直接返回一个对象 1.6 箭头函数使用剩余参数 2 this问题 2.1 直接打印this 2.2 fucntion定…

接口工具Postman知多少

目录 前言: Postman简介 如何使用Postman 1)主界面 2)测试用例的创建 3)请求结果 4)测试集的创建 使用方法: 前言: Postman是一个流行的API开发和测试工具,它提供了丰富的功…

38. QT在工控机Linux系统上调试机器人注意事项

1. QtCreator项目编译目录问题 当使用QtCreator创建一个新项目之后,对于代码编译产生的最终文件保存路径一般也会确定下来,QtCreator会帮助我们在同级目录下创建保存路径。例如下图:带有蓝色框的文件夹为项目源码,左侧的文件夹即为项目编译后产生的文件夹 如果在某种情况…

Unity | 向量、矩阵、齐次坐标

目录 一、向量点乘&叉乘 1.点乘 1.1 公式 1.2 几何意义 2.叉乘 2.1 公式 2.2 几何意义 二、矩阵点乘&叉乘 1.矩阵 2.矩阵的点乘 3.矩阵的叉乘 三、矩阵旋转 四、齐次坐标 一、向量点乘&叉乘 1.点乘 又称内积,结果是个标量, 1…

LIS医学检验信息系统 智慧检验实验室系统源码

医学检验信息系统(LIS)涵盖实验室的全部管理流程,包括从检验申请、标本采集、实验检测、报告发布的完整流程,以及质控管理、科室事务、试剂管理等功能,遵循医学实验室认可标准ISO15189的要求规范,适合各种实验机构的业务流程。 …

【MySQL】MySQL 数据类型,数值、日期和时间、字符串类型,创建数据表,删除数据表

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…

在Windows server 2012上使用virtualBox运行CentOS7虚拟机,被强制暂停

文章目录 问题场景排查过程处理解决事后反思 问题场景 我们的平台服务使用docker部署,使用docker-compose进行管理,部署到CentOS7的服务器里平台部署到客户环境时,一小部分客户,使用自己机房或单独的服务器。很多客户不愿意采购新…

进程之间的数据交互(使用管道和套接字实现进程通信)

本篇目录 进程通信的方法有哪些C语言使用管道实现进程通信使用管道进行实时通信 C语言使用套接字进行进程通信 进程通信的方法有哪些 进程通信是指在操作系统中,不同进程之间进行数据传递、信息共享和协调工作的方法。以下是常见的进程通信方法: 管道&a…

Linux网络第五章——YUM和NFS共享服务—YUM

YUM简介: 是一个专门为了解决包的依赖关系而存在的软件包管理器。 可以一键下载,一键安装和卸载。yum 是改进型的 RPM 软件管理器, 它解决了 RPM 所面临的软件包依赖问题。 yum 在服务器端存有所有的 RPM 包,并将各个包之间的依…

相比传统ERP,基于项目的ERP系统有何不同?

服务型企业是独特的以人为本的组织,依靠员工来销售、配置和提供一系列的产品和服务,这通常是以项目或合同为基础。 在这样一个环境中,服务型企业的基本财务要求与传统的制造和供应链型企业有很大的不同。 基于项目的企业需要管理资源&#x…

2023最新 Navicat 16.2.3 安装和学习试用连接Redis教程详解

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

IIS8 安装 .net1.1

直接上正文; 一 安装补丁 安装顺序: 1 dotnetfx.exe 2 NDP1.1sp1-KB867460-X86 3 NDP1.1sp1-KB886903-X86 .NET_Framework_Cleanup_Tool.zip(这个是卸载.net framework的软件,后面可能会用) 链接:ht…

ubuntu软件商店换阿里源,并解决更新源报错-->无法验证下列签名: NO_PUBKEY 3B4FE6ACC0B21F32

目录 一、背景 二、给源文件备份 三、更新源 四、解决报错 五、继续更新源 六、完成更新,下载应用 一、背景 重装了个ubuntu,发现软件商店用不了,打算换源。 二、给源文件备份 1)登录ubuntu系统,打开终端&…

mybatis双重foreach实现遍历map中的两个list数组

文章目录 实现背景:前端传值的格式Debug断点调试java如何解析json对象第一步 JSONArray.fromObject()第二步 遍历jsonArray第三步 mybatis双重foreach foreach标签说明最终效果 实现背景: 前端传值时可能会有多个字段传递过来,需要后台将这多…

SpringBoot + WebSocket+STOMP指定推送消息

目录 一、前提条件1.2 环境要求1.3 依赖 二、相关工具类准备2.1 发送消息载体2.2 接收消息载体2.3 消息处理接口2.4 为 STOMP 消息传递配置 Spring 三、前端部分四、效果 一、前提条件 本文将简单的描述SpringBoot WebSocketSTOMP指定推送消息场景,不包含信息安全加…

搭建FRP内网穿透服务器来远程访问本地windows/linux中的web服务

什么是FRP? FRP 是一个免费开源的用于内网穿透的反向代理应用,它支持 TCP、UDP 协议, 也为 http 和 https 协议提供了额外的支持。 FRP有服务端和客户端,你将服务端安装在你买的便宜云服务器上,FRP客户端安装在你自己的…

数据标注是什么?

关于数据标注您需要了解的一切——专家解答:澳鹏产品管理总监Meeta Dash 人工智能(AI)的质量取决于对其予以训练所使用的数据。由于训练数据的质量和数量直接决定AI算法的成败,因此,对于一个AI项目,平均80…

简单线性回归评估指标+R Squared

使得每一个数据集尽可能的小 均方误差MSE:(平方和取平均值) 均方根误差RMSE:(平方和取平均值开根号):平均误差值 平均绝对误差MAE:(绝对值取平均)&#xff1a…

Misc题目总结

目录 [WUSTCTF2020]girlfriend 手机键盘隐写: [GUET-CTF2019]zips setup.sh文件的运行方法: [MRCTF2020]千层套路 重复解zip加密压缩包脚本: 根据RGB坐标构造二维码脚本: [DDCTF2018](╯□)╯︵ ┻━┻ [WUSTC…

COT、COT-SC、TOT 大预言模型思考方式||底层逻辑:prompt设定

先讲一下具体缩写的意思 COT-chain of thoughts COT-SC (Self-consistency) Tree of thoughts:Deliberate problem solving with LLM 我理解其实不复杂 1. 最简单的是:直接大白话问一次 (IO) 2. 进阶一点是:思维链,…