sql优化

本文探讨了数据库优化的关键——SQL优化,特别是如何减少数据库I/O开销。介绍了数据库I/O的概念及其对性能的影响,讨论了笛卡尔积运算对I/O的影响及优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      最近做了个小项目,觉得运行速度很慢,所以就在思考怎么去优化。优化的方案有很多,算法上的优化,数据库优化,缓存类型优化等,这些都需要有一定的基础知识才学得会。所以,我打算先回头补补数据库的基础。

      谈到数据库优化,最常见的无非就是sql优化,好的SQL会提高效率,减少数据库I/O,什么是数据库I/O呢?下面引用第三方大牛的资料:sql i/o开销指什么,开销大对数据库有什么影响 摘自优快云论坛 1) 执行sql查询的过程,是经过SQL解析、SQL执行计划产生的,而SQL通过读取表的页数据到内存,读取过程是通过全表读 还是索引读 均是产生cost的【无论何时运行查询,SQL Server都必须从数据缓冲区中读取数据(逻辑读),如果所需要的数据没有在缓冲区中,则需要到磁盘上读取(物理读)。所以io大会对磁盘造成压力影响性能。同时也可能影响CPU性能。】,不论是i/O开销还是cpu开销,I/O方面的开销列入页数据读取,而复杂的排序 、分组聚合等也产生CPU开销,基于开销大小的比较是SQL优化的基础,可以在查询分析器中执行查询打开SQL语句,清晰看到每个访问路径操作的i/o开销和cpu开销 。详细原文:https://www.cnblogs.com/ambon/articles/5278359.html

       那么什么又跟数据库I/O有关?常见的就说笛卡儿积运算啦。

       笛卡尔积得出的结果集会先保存在内存中,这就影响了I/O。

       提问笛卡尔积平时工作遇到的多吗??什么情况下会发生笛卡尔积?? 笛卡尔积JOIN性能一定很差吗??有没有性能很好的时候?? 有JOIN条件的时候会不会发生笛卡尔积??   笛卡尔积(CartesianJoin)   当一个SQL中两个表无关联条件,或者关联条件可以被忽略的时候就会发生笛卡尔积。遇到这种情况要仔细分析SQL是否符合需求,是不是SQL写错了。在有些情况下,如果CBO预估两个表返回的行数很少(通常小于10),那么也可能发生笛卡尔积。遇到这样的情况: 1.如果SQL跑得很快,并且两个表返回的真实行数确实很少,那么走笛卡尔积可能是最优化   的,这个时候我们不用管。只要是SQL跑得快我们都不用管。 2.统计信息不准确导致CBO错误估算,从而引发笛卡尔积连接。这时要更新统计信息。 3.CBO计算返回行数错误,导致笛卡尔积。CBO计算返回行数错误经常发生,因为CBO是基   于一些数学公式计算的,出错很正常。这个时候我们可以用HINT更正执行计划。资料来源:

https://blog.youkuaiyun.com/leo0805/article/details/78180127

        只要是发生连接的情况就会进行笛卡儿积,当然记录行多少也会有影响,毕竟sql产品也是有优化的,如果说连接条件几乎可以忽略是(记录行特别多,条件限制也能产生很多结果集)会产生笛卡儿积的。总之,优化的话往笛卡儿积上靠拢是一个办法。

        不过并不是所有笛卡儿积都是不好的,如果记录行很少的时候,比如说a表有10个记录,b表有3个,那么你要查两个表,干脆笛卡尔积查询吧。简单省事。如果返回的行数真的很少,那么走笛卡尔积它反而更快。 

       要防止I/O爆炸式增长 SQL优化的核心思想是什么??减少I/O

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值