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

大家好,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查询慢且不够有效,并且迫使编写更多的代码行。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx Linux安装

参考 : http://test.runoob.com/w3cnote/nginx-install-and-config.html 点击跳转 下载安装包 - 这里选择的是 nginx-1.6.3 pgp 网址 : http://nginx.org/en/download.html 点击跳转 2. 上传Linux - 这里新建了临时文件夹 mkdir /usr/local/tmp 3. 解压 tar -zxvf nginx-1.6.…

Springcloud基础(4)-Ribbon负载均衡

负载均衡 1. Ribbon简单描述2. 在SpringCloud中查看相关处理源码3. ribbon的默认策略,懒加载3. 实操中的相关问题 1. Ribbon简单描述 Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具。Ribbon是Netflix发布的开源项目&#xff0…

手机快充协议

高通:QC2.0、QC3.0、QC3.5、QC4.0、QC5.0、 FCP、SCP、AFC、SFCP、 MTKPE1.1/PE2.0/PE3.0、TYPEC、PD2.0、PD3.0/3.1、VOOC 支持 PD3.0/PD2.0 支持 QC3.0/QC2.0 支持 AFC 支持 FCP 支持 PE2.0/PE1.1 联发科的PE(Pump Express)/PE 支持 SFCP 在PP…

火车头小发猫AI伪原创[php源码]

对于大多数站长来说&#xff0c;有点困难&#xff0c;但是如果他们不知道如何原创&#xff0c;我们不知道如何伪原创吗&#xff1f;我把我常用的伪原创的方法列出来&#xff0c;希望对大家有所帮助。 使用教程&#xff1a;火车头采集器AI伪原创 <?php header("Conte…

【面试】Hbase

逻辑模型 1 NameSpace 命名空间&#xff0c;类似于关系型数据库的database概念&#xff0c;每个命名空间下有多个表。Hbase有两个自带的命名空间,分别是hbase和default, hbase中存放的是HBase内置的表, default表是用户默认使用的命名空间。 2 Region 类似于关系型数据库的表…

资深测试整理,APP专项测试方法总结,看这篇就够了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 APP专项测试 1、…

Python启动TCP服务并监听连接,从客户端发送消息

下面是一个简单的例子&#xff0c;演示如何在Python中启动TCP服务并监听连接&#xff0c;以及如何从客户端发送消息&#xff1a; TCP服务端代码&#xff1a; import socketHOST 192.168.6.211 PORT 8888server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) …

【QT】QT搭建OpenCV环境

QT/OpenCV 01、开始之前02、QT03、CMake04、OpenCV05、配置06、测试 01、开始之前 本文版本&#xff1a; 1、QT&#xff1a;Based on Qt 5.12.2 (MSVC 2017, 32 bit)&#xff0c;编译方式是MinGW 2、CMake&#xff1a;cmake-3.27.0-rc4-windows-x86_64.msi 3、OpenCV&#xff1…

深度学习——优化器Optimizer

代码以及详细注释&#xff1a; import torch import torch.utils.data as Data import torch.nn.functional as F import matplotlib.pyplot as plt# torch.manual_seed(1) # reproducible """超参数 """ # 学习率 LR 0.01 # 批大小 BATCH_…

什么是RPC并实现一个简单的RPC

1. 基本的RPC模型 主要介绍RPC是什么&#xff0c;基本的RPC代码&#xff0c;RPC与REST的区别&#xff0c;gRPC的使用 1.1 基本概念 RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用&#xff0c;简单的理解是一个节点请求另一个节点提供的服务本地过程调用&am…

详解Jenkins配置邮件通知

前言 这几天Darren洋在使用Jenkins定时构建jmeter脚本中&#xff0c;要用到邮箱配置&#xff0c;故记录之。 一、Jenkins默认邮箱通知 这里填好smtp服务器地址和邮箱后缀&#xff0c;这样下面的账号就不用加邮箱后缀了。 网易邮箱设置以下我就不说废话文学了&#xff0c;直接上…

智能优化算法——哈里鹰算法(Matlab实现)

目录 1 算法简介 2 算法数学模型 2.1.全局探索阶段 2.2 过渡阶段 2.3.局部开采阶段 3 求解步骤与程序框图 3.1 步骤 3.2 程序框图 4 matlab代码及结果 4.1 代码 4.2 结果 1 算法简介 哈里斯鹰算法(Harris Hawks Optimization&#xff0c;HHO)&#xff0c;是由Ali Asghar Heid…

【深度剖析】 快速排序为什么不稳定?!

文章目录 零、前言一、快速排序的步骤原理二、什么是稳定性&#xff1f;三、不稳定的地方在哪里&#xff1f;四、怎么让快速排序变得稳定&#xff1f;1、采用双指针的快速排序A 思路简述B 参考代码 :C 算法分析 2、基于递归的快速排序A 思路简述B 参考代码C 算法分析 3、采用归…

【K8S系列】深入解析K8S调度

序言 做一件事并不难&#xff0c;难的是在于坚持。坚持一下也不难&#xff0c;难的是坚持到底。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记论点蓝色&#xff1a;用来标记论点 Kubernetes (k8s) 是一个容器编…

使用docker部署rancher并导入k8s集群

前言&#xff1a;鉴于我已经部署了k8s集群&#xff0c;那就在部署rancher一台用于管理k8s&#xff0c;这是一台单独的虚拟环境&#xff0c;之前在k8s的master节点上进行部署并未成功&#xff0c;有可能端口冲突了&#xff0c;这个问题我并没有深究&#xff0c;如果非要通过修改…

C#使用Chart进行统计,切换不同的图表类型

WindowsForm应用程序中Chart图表控件所属的命名空间&#xff1a; Chart 命名空间&#xff1a; System.Windows.Forms.DataVisualization.Charting 对应的dll路径&#xff1a; C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\Syst…

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

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

PDF转CAD后尺寸如何保持一致?这几种方法可以尝试一下

CAD文件是可编辑的&#xff0c;可以进行修改、添加和删除&#xff0c;这使得在CAD软件中进行编辑更加容易和灵活。这意味着&#xff0c;如果需要对图纸进行修改或者添加新的元素&#xff0c;可以直接在CAD软件中进行操作&#xff0c;而不需要重新制作整个图纸。那么将PDF文件转…

Linux嵌入式项目-智能家居

一、资料下载 二、框架知识 三、MQTT通信协议 1、上位机APP主要工作 1.wait for msg / while(1)订阅等待消息 2.处理消息 客户端创建了两个线程&#xff0c;一个线程用于发布消息&#xff0c;一个线程用于监听订阅消息 &#xff08;那我的仿真系统也可以啊&#xff0c;一个…

DVDNET A FAST NETWORK FOR DEEP VIDEO DENOISING

DVDNET: A FAST NETWORK FOR DEEP VIDEO DENOISING https://ieeexplore.ieee.org/document/8803136 摘要 现有的最先进视频去噪算法是基于补丁的方法&#xff0c;以往的基于NN的算在其性能上无法与其媲美。但是本文提出NN的视频去噪算法性能要好&#xff1a; 其相比于基于补丁…