问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

SQL 语句执行感觉很慢,怎么回事?

发布网友 发布时间:2022-04-22 05:37

我来回答

5个回答

热心网友 时间:2023-11-06 10:18

到这个数量级的全部更新,肯定会很慢。
第一。你的记录不一定在同一个partition,
第二。不明白为什么那么多人建议你建索引,你建的索引越多,你的更新速度越慢,因为你更新记录的同时,还有更新索引。
第三。你必须知道更新速度慢的瓶颈在哪里。是读写太多,还是内存不够,还是CUP不够快,然后对症下药。

下面介绍两个简单的办法,也许有效:
第一:
把这个100W行的表纵向劈成两个,用外键关系连接,一个装小的,经常改变的数据比如ID,外键,状态值,时间等,另一个装大的,不经常改变的数据,比如很长的字符串,xml,text 等。
这样更新时操作小的这个表,可以大大节约内存和CPU 开销,降低磁盘操作。
坏处就是查询时会慢些。
第二:
把这100W行横向切成很多个表,比如每个月的记录装在一个表里,这样每个表的记录数可能只有几万,查询,更新都会快很多。
坏处是查询,更新都不如原来好写。

热心网友 时间:2023-11-06 10:19

1. 执行计划中明明有使用到索引,为什么执行还是这么慢?

2. 执行计划中显示扫描行数为 644,为什么 slow log 中显示 100 多万行?
a. 我们先看执行计划,选择的索引 “INDX_BIOM_ELOCK_TASK3(TASK_ID)”。结合 sql 来看,因为有 "ORDER BY TASK_ID DESC" 子句,排序通常很慢,如果使用了文件排序性能会更差,优化器选择这个索引避免了排序。
那为什么不选 possible_keys:INDX_BIOM_ELOCK_TASK 呢?原因也很简单,TASK_DATE 字段区分度太低了,走这个索引需要扫描的行数很大,而且还要进行额外的排序,优化器综合判断代价更大,所以就不选这个索引了。不过如果我们强制选择这个索引(用 force index 语法),会看到 SQL 执行速度更快少于 10s,那是因为优化器基于代价的原则并不等价于执行速度的快慢;
b. 再看执行计划中的 type:index,"index" 代表 “全索引扫描”,其实和全表扫描差不多,只是扫描的时候是按照索引次序进行而不是行,主要优点就是避免了排序,但是开销仍然非常大。
Extra:Using where 也意味着扫描完索引后还需要回表进行筛选。一般来说,得保证 type 至少达到 range 级别,最好能达到 ref。
在第 2 点中提到的“慢日志记录Rows_examined: 1161559,看起来是全表扫描”,这里更正为“全索引扫描”,扫描行数确实等于表的行数;
c. 关于执行计划中:“rows:644”,其实这个只是估算值,并不准确,我们分析慢 SQL 时判断准确的扫描行数应该以 slow log 中的 Rows_examined 为准。
4. 优化建议:添加组合索引 IDX_REL_DEVID_TASK_ID(REL_DEVID,TASK_ID)

优化过程:
TASK_DATE 字段存在索引,但是选择度很低,优化器不会走这个索引,建议后续可以删除这个索引:
select count(*),count(distinct TASK_DATE) from T_BIOMA_ELOCK_TASK;+------------+---------------------------+| count(*) | count(distinct TASK_DATE) |+------------+---------------------------+| 1161559 | 223 |+------------+---------------------------+

在这个 sql 中 REL_DEVID 字段从命名上看选择度较高,通过下面 sql 来检验确实如此:
select count(*),count(distinct REL_DEVID) from T_BIOMA_ELOCK_TASK;+----------+---------------------------+| count(*) | count(distinct REL_DEVID) |+----------+---------------------------+| 1161559 | 62235 |+----------+---------------------------+

由于有排序,所以得把 task_id 也加入到新建的索引中,REL_DEVID,task_id 组合选择度 100%:
select count(*),count(distinct REL_DEVID,task_id) from T_BIOMA_ELOCK_TASK;+----------+-----------------------------------+| count(*) | count(distinct REL_DEVID,task_id) |+----------+-----------------------------------+| 1161559 | 1161559 |+----------+-----------------------------------+

在测试环境添加 REL_DEVID,TASK_ID 组合索引,测试 sql 性能:alter table T_BIOMA_ELOCK_TASK add index idx_REL_DEVID_TASK_ID(REL_DEVID,TASK_ID);
添加索引后执行计划:
这里还要注意一点“隐式转换”:REL_DEVID 字段数据类型为 varchar,需要在 sql 中加引号:AND T.REL_DEVID = 000000025xxx >> AND T.REL_DEVID = '000000025xxx'

执行时间从 10s+ 降到 毫秒级别:
1 row in set (0.00 sec)
结论
一个典型的 order by 查询的优化,添加更合适的索引可以避免性能问题:执行计划使用索引并不意味着就能执行快。

热心网友 时间:2023-11-06 10:19

100万条数据啊,数据量不少了,你可要建立一个合理的索引,这样可以大大提高速度,而你说的执行慢,存储过程不好说,不知道你写的是否合理,不合理的代码和合理的代码查询速度是相差很远的,从几分钟甚至更久与十几妙钟的差别。

如果你确定你的语法没法再优化,数据库索引已经是最佳的话,你可以考虑将此数据表老数据,已经很少用到的数据备份到其他表去,如果要查询历史数据,要么在允许查询要么你就通过程序处理去查询这个备份的数据表。

热心网友 时间:2023-11-06 10:20

需要建立索引。更新也是先查询再更新,所以要先提高查询效率!!!

全表扫描? 看来你得升级硬件了,或者优化调整oracle系统的参数设置了。

还有一个办法,就是把大表分解成多个小表。

热心网友 时间:2023-11-06 10:20

2个办法
1)建立合适的索引可以适当提高效率,这个是最主要的。

2) 把你的sql写漂亮点,少用点in exists之类的,
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
送你离开千里之外歌词完整版 枇杷怎么做才有营养? 枇杷怎么吃最有营养啊? 用护肤品脸上刺痛怎么办 洗脸脸上刺痛 肠粉有什么家常做法? 肠粉的家常做法 教你自制广东肠粉 小度voice是什么意思? 小度智能屏x10是否支持粤语_小度智能屏x10支持粤语吗 小度支持粤语吗 电脑有几年没用过了,能开机进不了界面 索引用了!查询速度为什么还是那么慢?! 我的电脑不能进入BIOS界面了 SQL语句执行很慢,怎么回事? 电脑能开机不能进入bios,是不是主板坏了? 求助,sql语句无法用到索引,执行很慢 我的电脑开机一直卡在asus界面,也进不去bios界面... 电脑开机时一直停留在BIOS界面加载进度,始终进不... 我家电脑进不了bios啊,怎么办,技嘉的 单片机C语言数组,十六进制转十进制 我的电脑为什么进不了BIOS界面 62235英语怎么写? 电脑开机无法进入系统,不能进入bios,停留在主板... 五位数62a3b是45的倍数,这个数最大是多少? 电脑总是bios界面进不去 62A3B是45的倍数,这个五位数最大是多少? 五位数62a3b最是45的倍数这个数最大是多少? 电脑进入不了bios界面怎么办 62235用英语怎么说? 62235什么银行 电脑开机停留在智能主板的界面好久!而且进去不了B... 123456789相加减最终等20 电脑一直重复重启重装系统进不了BIOS 如何解决SQL查询速度太慢? 普洱茶究竟有没有保质期的? 斯诺克各位大师的世界排名。要前二十的。 全国涂料培训班。谁知道? 普洱茶的保质期有多久,是像朋友说的越陈越香吗? 普洱茶生茶保质期几年? 普洱茶有保质期吗 冻水饺用冷水还是热水下锅? 冻饺子是冷水下锅还是热水下锅? 出了事故,只报警了没报保险,事后再走保险可以吗? 车撞石墩走了过后可以报保险吗? 汽车撞到人当场没报保险事后可以再报保险吗? 车撞了,没及时报警,事后可以走保险吗 车辆发生事故后离开了现场可否报保险呢? 我的车子前几天撞得现在还能报保险吗? 车子撞墙了可以走保险吗? 车子前段时间撞上护栏,现在还可以走保险吗?