SQL语言艺术(六)锦囊妙计:认识经典SQL模式

本章讨论存取经过适当规范化的数据时,遇到的9种最经典的情况

[b][size=medium]小结果集,源表较少,查询条件直接针对源表[/size][/b]

对于典型的OLTP应用,多为返回小结果集的查询。如果过滤条件直接针对源表,我们必须保证这些过滤条件高效,对于重要的字段,考虑加上索引。如果涉及连接多表的情况,需要优化连接顺序,尽快过滤不符合条件的记录。如果统计数据足够精确地反映了表的内容,优化器有可能对连接顺序做出适当选择

在使用索引字段的时候要注意,函数或者隐式转换会导致[url=http://septem.iteye.com/blog/611062]索引失效[/url]。在确定重要字段有索引的情况下,还必须如果是非唯一性索引或者基于唯一性索引的范围扫描,还需要考虑聚集索引与分区,物理数据的顺序是否与索引一致,对性能影响很大

[b][size=medium]小结果集,查询条件涉及源表之外的表[/size][/b]

我们想要的数据来自一个表,但查询条件是针对其它表的,且不需要从这些表返回任何数据。就像之前讨论过的[url=http://septem.iteye.com/blog/619098]订单[/url]的例子,这类查询可以使用连接,加上distinct去除结果中的重复记录。但较好的方式是使用子查询,在没有其它条件的情况下,优先考虑非关联子查询,因为关联子查询需要扫描源表

[b][size=medium]小结果集,多个宽泛条件,结果集取交集[/size][/b]

分别使用各个条件时,会产生大量数据,但各个条件的交集是小结果集。使用正规连接,关联子查询,还是非关联子查询,要根据不同条件的过滤能力和已存在哪些索引而定

[b][size=medium]小结果集,一个源表,查询条件宽泛且涉及多个源表之外的表[/size][/b]

如果查询条件可选择性较差,优化器可能会选择忽略它们,先访问关联的所有小型,再对其它表运用过滤条件。将提供的查询条件推迟执行,不利于减少要处理的数据量。这时我们必须迫使DBMS依我们所需的方式执行查询。多数SQL方言都支持优化器的提示(hint),但这种方法会随着未来的环境,数据量,硬件等因素的变化而变得不适用。更优雅的方法是在from子句中采用嵌套查询,在数值表达式中建议连接关系。通常没有必要采用非常具体的的方式和难以理解的提示,提供正确的最初指导就可使优化器找到正确的执行路径。混乱的查询会让优化器困惑,结构清晰的查询及合理的连接建议,通常足以帮助优化器提升性能

[b][size=medium]大结果集[/size][/b]

如果查询返回几万条记录,那么使用索引是没有意义的,借助hash join或者merge join进行全表扫描是合适的。我们必须扫描数据返回比例最高的表,它违背了尽快去除不必要数据这一原则,但一旦扫描结束应立即重新贯彻该原则

在大结果集的情况下,每条记录的处理都必须小心,避免性能不佳的自定义函数的调用,另外处理大量记录时,关联查询是性能杀手。录一个查询包含多个子查询时,必须让它们操作各不相同的数据子集,避免子查询相互依赖,到查询执行的最后阶段,多个子查询得到的不同数据集经过hash join或者集合操作得到结果集

[b][size=medium]结果集来自基于一个表的自连接[/size][/b]

自连接的情况除了一般规则之外,比如保证索引高效,应该尽量通过一次处理收集所有感兴趣的记录,再使用诸如case语句等结构分别显示记录。通常当需要查找和最小,最大,最早或最近的值相关的数据时,首先必须找到这些值本身,接下来用这些值作为第二遍扫描的搜索条件。而以滑动窗口(sliding window)为基础的OLAP函数,可以将两遍扫描合而为一。当多个选取条件作用于同一个表的不同记录时,可以使用基于滑动窗口工作的函数

[b][size=medium]结果集以聚合函数为基础获得[/size][/b]

此时结果集大小取决于group by的字段基数而不是查询条件的精确性。实际上最让人感兴趣的SQL聚合使用技巧,不是显式的sum或avg,而是如何将过程性处理转化为以聚合为基础的纯SQL替代方案。优秀SQL编程的困难,多半在于解决问题的方式,不要将一个问题转换成对数据库的一系列查询,而是转换成少数查询。程序中大量中间变量保存从数据库读出的值,然后根据变量进行简单判断,最后再把它们作为其它查询的输入,这样做是错误的。糟糕的SQL编程有个显著特点,就是SQL之外存在大量代码,以循环的方式对返回数据进行加,减,乘,除之类的处理,这里的工作应该交给SQL的聚合函数

比如以下的查询语句:
select shipment_id
from shipments
where shipment_id not in (select shipment_id
from orders
where order_complete = 'N')

可以转化为聚合函数:
select shipment_id
from orders
group by shipment_id
having sum(case when order_complete = 'N' then 1
else 0
end) =0

甚至可以不进行任何转换:
select shipment_id
from orders
group by shipment_id
having min(order_complete) = 'Y'


聚合操作的数据应尽量少,把条件放到where子句中,能让多余的记录尽早被过滤掉,因而更高效

[b][size=medium]结果集通过简单搜索或基于日期的范围搜索获得[/size][/b]

如果历史数据较少,那么各项ID的可选择性很高,比如:
select whatever
from hist_data as outer
where (outer.item_id, outer.record_date) in
(select inner.item_id, max(inner.record_date)
from hist_data as inner
where inner.item_id = somevalue
and inner.record_date <= reference_date
group by inner.item_id)

OLAP在查询特定日期某数据项的值时也同样有用,但OLAP属于SQL的非关系层

对于大量历史数据的情况下,难度在于排序,对大量数据的排序代价是很高的。而且排序是非关系操作,降低非关系层厚度的唯一方法就是在关系层多做一些工作,增加过滤条件的数量。此时,针对所需数据更精确地归类日期以缩小范围,便非常重要。如果我们把数据控制在可管理的大小,就相当于回到了少量历史记录的情况。如果无法同时指定上限和下限,我们的唯一希望就是根据数据项分区,在单一分区上操作,这比较接近大结果集的情况

[b][size=medium]结果集和别的数据存在与否有关[/size][/b]

对于识别例外的需求,最常用的解决方案有两个:not in搭配非关联子查询,或者not exists搭配关联子查询。在子查询出现在高效搜索条件之后,使用not exists是对的,但当子查询是唯一条件时,使用not in比较好

使用count(*)测试某些数据是否存在是个糟糕的主意,为此DBMS必须搜索并找出所有相符的记录,此时应该使用exists,它会在遇到第一个相符的数据时就停止。

集合操作符的重大优点是彻底打破了子查询强加的时间限制。当存在关联子查询时,就必须执行外层查询,接着对所有通过过滤条件的记录执行内层查询。外层查询和内层查询相互依赖,因为外层查询会把数据传递给内层查询。非关联子查询必须先完成内层查询之后,外层查询才能介入。相比之下,使用集合操作符union, intersect或except时,查询中的这些组成部分不会彼此依赖,从而不同部分的查询可以并行执行,最后把不完整的结果集组合起来,这就是分而治之

另一个表达非存在性的方法是使用外连接(out join),通过检查连接表的字段值是否为null找出它们。数据集可以通过各种技巧进行比较,但一般而言,使用外连接和子集合操作符更高效
UR5 机械臂手眼标定(Eye-in-Hand)实战:OpenCV 求解 AX=XB,误差 < 2mm 本文详细介绍了UR5机械臂在Eye-in-Hand配置下的手眼标定实战,通过OpenCV实现高精度标定,最终达到误差小于2mm的工业级精度要求。文章涵盖了标定基础原理、环境搭建、数据采集策略、核心算法实现及误差分析与优化,为视觉机械臂的自主抓取提供了实用指南。 阅读详情

相关推荐

当AI换脸遇上内容审核:Facefusion NSFW检测的技术伦理与用户自主权之争

本文探讨了Facefusion开源AI换脸工具中NSFW检测机制的技术伦理困境与用户自主权之争。分析了其多层次防御机制的技术实现与社区规避方法,揭示了开源软件在安全与自由之间的平衡难题,并提出了分层权限设计等社区实践方案。

weixin_29165725的博客 654

SQL语言艺术示例一(rownum)

[size=medium]这几天我在看《SQL语言艺术》的电子版。 有这样一个简单的例子:不是经理的员工当中,哪五个人收入最高。“找出不是经理的员工”是其中的关系操作部分,由此获得一个有限的员工集合,然后排序。有些SQL方言通过在select语句中增加特殊子句来限制返回的记录数,很显然,排序和限制记录数都是非关系操作。其他SQL方言(这里主要是指Oracle)则采...

唐唐 251

国科大——形式语言与自动机理论(0812课程)——作业

此次作业题考察,包括但不限于有限自动机、无限自动机、正则文法、正则表达式以及正则语言的性质,题考查下推自动机相关的知识,题考查图灵机相关的知识。此课程建议本科学习过课程的同学选修,成绩占比:考试100%。此课程虽然留有作业,但可做也可不做,且不考勤。

qq_54145399的博客 698

SQL模式的定义

一个关系数据库管理系统的实例中可以建立多个数据库,一个数据库可以建立多个模式,一个模式通常包括多个表、视图、索引等数据库对象。 创建了一个模式就建立了一个数据库的命名空间,一个框架。 定义模式语句: CREATE SCHEMA <模式名> AUTHORIZATION <用户名>; 如果没有指定<模式名> 那么 <模式名> 隐含为 <用户名&g...

孜蓝的博客 4782

【国产化信创实践】宝兰德bes中间件集成springboot

【国产化信创实践】宝兰德bes中间件集成springboot

项目管理、软件工厂、vue研发、Java研发、中国文化等。 1万+

ICLR 2025 | MambaPEFT: 探索针对Mamba的参数高效微调方法

通过利用海量数据构建大型模型,基于Transformer的模型生态系统已逐步确立。参数高效微调(PEFT)是一项至关重要的技术,它能以最低成本将这些模型应用于下游任务,同时实现高效的性能表现。最近,基于状态空间模型(SSM)的Mamba模型作为Transformer的潜在替代方案受到了广泛关注。尽管已经提出了许多基于Mamba的大规模模型,但如何高效地将预训练的Mamba模型应用于下游任务仍有待研究。在本文中,作者对适用于Mamba的PEFT方法展开了探索性分析。

小白学视觉 324

标准SQL的9种语句

标准的sql包含9种语句:   数据查询 select   数据定义 create drop alter   数据操纵 insert update delete   数据控制 grant revoke   这9种语句看起来很简单,但实际上内容还是很丰富的,学好这9种语句灵活运用对我们来说是非常重要的。   (1)Select 查询语句    语法:SELECT [ALL|DISTIN

邵鸿鑫 2781

【深度学习新浪潮】AI 智能眼镜关键视觉技术、技术栈及开源项目全解析

Meta新款智能眼镜在演示中暴露出的AI误判和延迟问题,揭示了端侧视觉与多模态算法落地的核心瓶颈。本文从算法工程视角解析了AI智能眼镜的三大关键技术:感知增强(多帧降噪、HDR成像)、场景解析(轻量化目标检测、语义分割)和空间定位(视觉SLAM、ToF辅助),并梳理了完整的技术栈架构,包括硬件适配、驱动优化和框架选型。文章还提供了高价值开源项目参考,如OpenXR和ORB-SLAM3,为端侧视觉算法落地提供实操指南,助力开发者攻克算力约束下的实时性、精度和功耗平衡难题。

专注:太空算力、AI infra、异构调度、大模型成本工程 524

数据库标准语言SQL(二)——模式的定义

数据库标准语言SQL(二)——数据定义 一、前言 从这篇文章开始,我们就正式进入到数据库标准语言SQL的学习和实践。本篇主要是介绍数据库内数据对象的定义、以及删除操作。 二、模式的定义与删除操作 1.语法 CREATE SCHEMA <模式名(可不写)> AUTHORIZATION <用户名> 2.示例 eg1.定义一个测试模式 Test create schema "Test" authirization ZHANG; #这是一般数据库的定义模式语句 #由于我用的是Oracle数据

m0_54718288的博客 3372

基于3D相机的人体穴位识别与标注系统——完整Python实现方案

摘要 本文提出了一种基于3D相机的人体穴位识别与标注系统完整实现方案。系统采用Intel RealSense D435相机实时采集RGB-D数据,结合MediaPipe Pose模型进行人体33个关键骨骼点的三维姿态估计。通过建立穴位与骨骼关键点的映射关系,利用相机内参和深度信息将二维图像坐标转换为三维空间坐标。系统采用模块化设计,包含数据采集层、算法处理层、坐标转换层和可视化层,实现了穴位定位、三维坐标转换和点云可视化功能。关键技术包括:基于骨度折量法的穴位映射算法、深度图像到三维点云的转换方法,以及Op

AI的内部世界的博客 261

多模态大模型在AI人工智能领域的创新实践探索

随着人工智能技术的飞速发展,单一模态的数据处理已经难以满足复杂现实场景的需求。多模态大模型通过融合多种模态的数据,如文本、图像、音频等,能够更全面、深入地理解和处理信息,为人工智能的发展带来了新的机遇和挑战。本文的目的在于深入探讨多模态大模型在AI人工智能领域的创新实践,包括其核心概念、算法原理、实际应用等方面,旨在为相关领域的研究人员和从业者提供全面的技术参考和实践指导。本文的范围涵盖了多模态大模型的基本原理、算法实现、数学模型、项目实战以及实际应用场景等多个方面。

大模型应用工坊 1311

SQL的9种语句:

数据查询 select   数据定义 create drop alter   数据操纵 insert update delete   数据控制 grant revoke   这9种语句看起来很简单,但实际上内容还是很丰富的,学好这9种语句灵活运用对我们来说是非常重要的。   (1)Select 查询语句   语法:SELECT [ALL|DISTINCT] [AS 列名] [, [

qq_40279838的博客 4713

《手把手教你YOLOv9实战》,改进专栏目录

为了提供友好的操作效果,本专栏将会手把手搭建可视化界面,我将用PyQt5 搭建一个可视化界面,可视化界面能够实现基本的图像加载与检测功能,如支持视频、摄像头,还支持更换不同的 YOLOv9 模型,并适应不同领域(如口罩检测系统、人脸检测系统、工业缺陷检测系统等),界面灵活、功能强大。通过YOLOv9加以改进设计,形成新的算法框架,一起水科研和论文,专栏会一直持续更新中,本专栏适合目标检测、分割、分类。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2129

锦囊妙计:认识经典SQL模式

过滤数据会遇到的最典型情况有九种: 小结果集,源表较少,查询条件直接针对源表。 小结果集,查询条件涉及源表之外的表。 小结果集,多个宽泛条件,结果取交集。 小结果集,一个源表,查询条件宽泛且涉及多个源表之外的表。 大结果集 结果集来自基于一个表的自连接 结果集以聚合函数为基础获得。 结果集通多简单搜索或基于日期的范围搜索获得 结果集和别的数据存在与否有关。 1.小结果集,直接条...

weixin_42304063的博客 206

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SQL语言艺术

http://book.csdn.net/bookfiles/669/ 内容介绍: 本书分为12章,每一章包含许多原则或准则,并通过举例的方式对原则进行解释说明。这些例子大多来自于实际案例,对九种SQL经典查询场景以及其性能影响讨论,非常便于实践,为你的实际工作提出了具体建议。本书适合SQL数据库开发者、软件架构师,也适合DBA,尤其是数据库应用维护人员阅读。 您现在正在查看:C...

liuchaoyong 240

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

24种设计模式-策略模式(Strategy Pattern)

一、优点:      1、 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。   2、 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使...

weixin_30455067的博客 120

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

设计好接口的 36 个锦囊妙计

作为后端开发,不管是什么语言,JavaGo还是C++,其背后的后端思想都是类似的。后面打算出一个后端思想的技术专栏,主要包括后端的一些设计、或者后端规范相关的,希望对大家日常工作有帮助哈。如何把一个接口设计好。所以,今天就给大家介绍,设计好接口的36个锦囊。本文就是后端思想专栏的第一篇哈。单一性是指接口做的事情比较单一、专一。比如一个登陆接口,它做的事情就只是校验账户名密码,然后返回登陆成功以及userId即可。但是如果你为了减少接口交互,把一些注册、一些配置查询等全放到登陆接口,就不太妥。

IT_1024的博客 370

The Art Of SQL是如何模仿孙子兵法的目录的

 《The Art Of SQL》的作者称该书的目录仿照了《孙子兵法》和克劳塞维茨的《战争论》。好事者将三本书的目录放在一起对比了一下:The Art Of SQL孙子兵法The Art Of WarSQL语言艺术On War1.Laying Plans始计第一Laying Plans制定计划2.Waging War作战第二Waging War发动战争3.Tactical Dispositio

膈腧的涂鸦板 1337

GolangGuide性能优化:高并发系统设计的15个锦囊妙计

如何设计一个高并发系统是每个Golang开发者都需要掌握的核心技能。GolangGuide项目提供了全面的高并发系统设计指南,通过15个关键策略帮助你构建稳定、高性能的系统架构。本文将为你详细解析这些高并发设计的锦囊妙计,让你在面对流量洪峰时游刃有余。 ## 🎯 理解高并发系统的本质 所谓设计高并发系统,就是设计一个系统,保证它整体可用的同时,能够处理很高的并发用户请求,能够承受很大的流量冲

gitblog_00551的博客 422

MySQL DBA必备工具使用的6大锦囊妙计

今儿给大家分享一篇,关于MySQL DBA必备工具的使用。可以方便帮助我们管理我们的数据库,让我们的工作更高效。 这款工具是 MySQL 一个重要分支 percona 的,名称叫做 percona-toolkit(一把锋利的瑞士军刀),它呢是一组命令的集合。今儿给大家介绍几个我们在生产环境中最长用到的。 工具包的下载地址:https://www.percona.com/down

wangjinbao5566的博客 1059

计算机专业知识【深入浅出理解存储过程:数据库的高效“锦囊妙计”】

简单来说,存储过程是一组为了完成特定功能而预先编译好并存储在数据库中的 SQL 语句集合。它就像是一个封装好的小程序,接收输入参数,执行一系列操作,还能返回结果。想象一下,你要去完成一项复杂的任务,每次都得把步骤重新规划一遍,既麻烦又容易出错。而存储过程就相当于把这些步骤写下来,装订成册,以后每次需要完成这个任务,直接拿出这本册子照着做就行,方便又快捷。

一勺菠萝丶的博客 453

锦囊妙计2

大结果集 无论结果集是如何获得的,只要结果集很大,就符合我们下面要讨论的大结果集的情况。 如果查询返回几万条记录,那么使用索引是没有意义的。借助哈希或合并连接进行全表扫描是合适的。 采取扫描方式不合适的情况下,应尽量减少要访问的数据的块数。最常用的手段就是使用索引(而不是表),尽管所有索引的总数据量经常比表还大,但单个索引则远比表要小。如果索引包含了所有需要的信息,则扫描索引而不扫描表是相当...

weixin_42304063的博客 310

Java常用设计模式 面试必备

本文总结了7种常用的设计模式,分为创建型、结构型、行为型三大类,并提供了具体代码实现。 创建型模式: 单例模式(Spring Bean默认实现) 建造者模式(Lombok的@Builder注解) 工厂模式(Spring IOC容器) 结构型模式: 4. 代理模式(Spring AOP的核心实现) 行为型模式: 5. 策略模式(消除复杂if-else) 6. 模板方法模式(Spring的xxTemplate) 7. 责任链模式(Filter/Interceptor) 文章提供了各种模式的典型代码实现,包括单例

Liaka的博客 976

6个针对MySQL大数据量分页查询优化的锦囊妙计

方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N 适应场景: 适用于数据量较少的情况(元组百/千级)原因 / 缺点: 全表扫描,速度会很慢 且 有的数据库结果集返回不稳定(如某次返回1,2,3,另外的一次返回2,1,3). Limit限制的是从结果集的M位置处取出N条输出,其余抛弃. 方法2: 建立主键或唯一索引, 利用索引(假设每页10条) 语句样式:MySQL中,可用如下方法: MyS...

程序员界 401

送你 3 个优化大数据量下分页查询缓慢的锦囊妙计

https://www.ershouyi.com/

zouduchen的博客 673

面试前看看

标题高频面试题 主题讲解: B站 tojson 系列

weixin_43719015的博客 293
上一篇: linux_tips
下一篇: SQL语言艺术(七)变换战术:处理层次结构
pagx007
博客等级 码龄19年 1粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值