当前位置:首页 » 编程语言 » sql耗时

sql耗时

发布时间: 2022-09-13 04:48:00

Ⅰ 如何解决sql查询速度太慢

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 查询的优化,添加更合适的索引可以避免性能问题:执行计划使用索引并不意味着就能执行快。

Ⅱ oracle数据库执行sql很慢怎么回事

一条sql突然执行变慢,耗时9秒,应用是不能改的,只能从数据库方面下手解决
步骤思路:
1:查看sql是否走索引
2:查看索引是否失效
3:hint 强制走索引(只是用来查看hint状态下,查询是否更改,应用是不能改的)
4:收集该表所有信息(包括索引)
5:分析该表所有信息(包括索引)
6:再次执行并查看
注意:哪个用户执行较慢,就用哪个用户进行操作,这样才准确

Ⅲ SQL查询一块查,和分开查的时间一样吗

你好,很高兴回答你的问题。
这两张查询方式的耗时是不一样的。
如果索引合适,数据量也不是太大的话,一个sql执行的耗时是远小于按天查询执行31个sql的耗时的。
如果有帮助到你,请点击采纳。

Ⅳ sql存储过程耗时太长

多长都有可能,40是很正常的。
1.尽量优化语句,尽量少用游标。
2.修改较为常用的表要注意,最好先在临时表中作好运算和其它处理,最后在修改这些表,以免较慢的存储过程长时间锁定表记录,影响数据正常使用。
3.将连接超时和命令超时适当扩大,以免超时错误。

Ⅳ PL/SQL 耗时的原因有哪些

1.索引建的有问题
2.数据量过大
3.sql写的不合理

最好的办法是优化索引和优化sql语句,定期删除无用数据也行

Ⅵ MySQL怎么查询比较耗时的sql语句

开启慢查询日志即可
文件方式配置
MySQL
慢查询的方法:

mysql
配置文件
my.cnf
中增加:
log-slow-queries=/opt/data/slowquery.log
long_query_time=2
log-queries-not-using-indexes
命令方式配置
MySQL
慢查询的方法:
set
global
slow_query_log=on;
set
global
long_query_time=1;
set
global
slow_query_log_file=‘/opt/data/slow_query.log’;
查询
MySQL
慢查询状态的方法:
SHOW
VARIABLES
LIKE
'%query%';
解析
MySQL
慢查询日志的方法:
按照
sql
执行时间最长的前
20

sql:
mysqlmpslow
-s
t
-t
20
-g
'select'
/opt/data/slowquery.log

Ⅶ 在MySQL 中,哪些原因导致一条简单的 SQL 插入耗时很长

Count: 6 Time=25.33s (152s) Lock=0.00s (0s) Rows=0.0 (0), xxx[xxx]@xxx
INSERT INTO tablename(f_uid,uid,create_time) VALUES (N,N,N)
分析原因如下:
1.不可能是锁等待,因为记录的Lock时间为0;
2.若是InnoDB引擎,则跟主键为啥存在一定关系,但是应该不是特别大,从你的SQL语句看;
3.数据库主机的负载过高,导致处理不过,是最可能的原因;

Ⅷ 怎么统计最近最耗时的SQL

--1.不用CROSSAPPLYsys.dm_exec_sql_text(qs.sql_handle)

SELECTTOP50
(selecttextfromsys.dm_exec_sql_text(sql_handle))as[SQL]
,CAST(((qs.total_elapsed_time/1000000.0)/qs.execution_count)ASDECIMAL(28,2))AS[平均消耗秒数]
,qs.last_execution_timeAS[最后执行时间]
,CAST(qs.last_elapsed_time/1000000.0ASDECIMAL(28,2))AS[最后完成消耗秒数]
,CAST(qs.min_elapsed_time/1000000.0ASDECIMAL(28,2))AS[最小消耗秒数]
,CAST(qs.max_elapsed_time/1000000.0ASDECIMAL(28,2))AS[最大消耗秒数]
,CAST(qs.total_elapsed_time/1000000.0ASDECIMAL(28,2))AS[总消耗秒数]
,(qs.execution_count)AS[总执行次数]
,creation_timeAS[编译计划的时间]
,qs.*
fromsys.dm_exec_query_statsqs
ORDERBYqs.last_elapsed_timeDESC


--2.用CROSSAPPLYsys.dm_exec_sql_text(qs.sql_handle)

SELECTTOP50
SUBSTRING(st.text,(qs.statement_start_offset/2)+1,
((CASEstatement_end_offset
WHEN-1THENDATALENGTH(st.text)
ELSEqs.statement_end_offsetEND
-qs.statement_start_offset)/2)+1)as[Statement_SQL]
,CAST(((qs.total_elapsed_time/1000000.0)/qs.execution_count)ASDECIMAL(28,2))AS[平均消耗秒数]
,qs.last_execution_timeAS[最后执行时间]
,CAST(qs.last_elapsed_time/1000000.0ASDECIMAL(28,2))AS[最后完成消耗秒数]
,CAST(qs.min_elapsed_time/1000000.0ASDECIMAL(28,2))AS[最小消耗秒数]
,CAST(qs.max_elapsed_time/1000000.0ASDECIMAL(28,2))AS[最大消耗秒数]
,CAST(qs.total_elapsed_time/1000000.0ASDECIMAL(28,2))AS[总消耗秒数]
,(qs.execution_count)AS[总执行次数]
,creation_timeAS[编译计划的时间]
,qs.*
fromsys.dm_exec_query_statsqs
CROSSAPPLYsys.dm_exec_sql_text(qs.sql_handle)ASst
ORDERBYqs.last_elapsed_timeDESC
热点内容
手机怎样给程序加密软件 发布:2025-01-12 06:47:11 浏览:824
地平线最高画质笔记本要什么配置才能玩 发布:2025-01-12 06:47:10 浏览:369
原神过主线任务脚本 发布:2025-01-12 06:34:51 浏览:514
医保电子密码在哪里找到 发布:2025-01-12 06:34:38 浏览:349
安卓手机有网却不能使用怎么办 发布:2025-01-12 06:25:20 浏览:213
arm存储器映射 发布:2025-01-12 06:25:12 浏览:250
安卓系统个人字典有什么用 发布:2025-01-12 06:13:37 浏览:929
geventpython安装 发布:2025-01-12 06:13:34 浏览:339
放松解压助睡眠直播 发布:2025-01-12 06:13:00 浏览:829
车载wince和安卓哪个好用 发布:2025-01-12 05:58:18 浏览:840