当前位置:首页 » 编程语言 » 极为缓慢的sql语句
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

极为缓慢的sql语句

发布时间: 2023-01-24 22:59:39

⑴ 如何在mysql查找效率慢的SQL语句

  • 查看慢SQL是否启用,查看命令:show variables like 'log_slow_queries';

    如果结果为ON则是开启了,如果为OFF则表示禁用了。

  • 开启慢查询命令:set global log_slow_queries = on;

  • 查看是否开启:show variables like 'log_slow_queries';

  • 查看慢查询参数,即设置超过多少秒的查询归为了慢查询。参数为:long_query_time,查询命令:showglobal variables like 'long_query_time';

    mysql默认时间为10秒,即10秒及以上的查询被归为了慢查询。我们的实际项目中根本就不可能这么包容你,所以得提供查询效率优化sql,让程序更快的执行。

  • 这里设置时间为1秒,即超过1秒就会被认为慢查询。设置命令:set global long_query_time =1;用命令设置的,会立即生效,不用重启mysql服务。但重启mysql服务后就会失效。

  • 查看设置的时间,show global variables like 'long_query_time';即可看到现在已经变为1秒了

  • 查看慢查询存放日志,命令:show variables like 'slow_query_log_file';

    去相应目录下查看即可。

⑵ 一条查询极为缓慢的sql语句,如何去优化

有时候不一定要优化sql语句,有可能是相关的表没有索引,如果你想让人帮忙的话,最好把相应的语句贴出来,还有相关表结构

⑶ 如何用sql profile 找出执行慢的sql

原SQL语句如下:
update Tindex a set a.object_type='SPECIAL' where a.object_type is not null
and exists (select 1 from Tindex b where b.object_name='TINDEX'
and a.object_name=b.object_name)
使用以下语句查看当前游标执行计划,和预期的不一样
select * from table(dbms_xplan.display_cursor('55j33g4qx7g'));

用explain plan for解释加了hint语句的SQL,或者SQL语句能出现期望的执行计划,例如在不同的版本的数据库上执行会产生不同的执行计划。
SQL> explain plan for
2 update Tindex a
3 set a.object_type = 'SPECIAL'
4 where a.object_type is not null
5 and exists (select /*+full(b)*/1
6 from Tindex b
7 where b.object_name = 'TINDEX'
8 and a.object_name = b.object_name);

Explained

获取outline:
SQL> select * from table(dbms_xplan.display(null,null,'outline'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2122516761
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%
--------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 1 | 59 | 570
| 1 | UPDATE | TINDEX | | |
|* 2 | TABLE ACCESS BY INDEX ROWID| TINDEX | 1 | 34 | 3
| 3 | NESTED LOOPS | | 1 | 59 | 570
| 4 | SORT UNIQUE | | 7 | 175 | 566
|* 5 | TABLE ACCESS FULL | TINDEX | 7 | 175 | 566
|* 6 | INDEX RANGE SCAN | IDX_TINDEX_NAME | 1 | | 2
--------------------------------------------------------------------------------
Outline Data
-------------
/*+
BEGIN_OUTLINE_DATA
USE_NL(@"SEL$3FF8579E" "A"@"UPD$1")
LEADING(@"SEL$3FF8579E" "B"@"SEL$1" "A"@"UPD$1")
INDEX(@"SEL$3FF8579E" "A"@"UPD$1" ("TINDEX"."OBJECT_NAME"))
FULL(@"SEL$3FF8579E" "B"@"SEL$1")
OUTLINE(@"SEL$1")
OUTLINE(@"UPD$1")
UNNEST(@"SEL$1")
OUTLINE_LEAF(@"SEL$3FF8579E")
ALL_ROWS
OPT_PARAM('star_transformation_enabled' 'true')
OPTIMIZER_FEATURES_ENABLE('10.2.0.4')
IGNORE_OPTIM_EMBEDDED_HINTS
END_OUTLINE_DATA
*/
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("A"."OBJECT_TYPE" IS NOT NULL)
5 - filter("B"."OBJECT_NAME"='TINDEX')
6 - access("A"."OBJECT_NAME"='TINDEX')
filter("A"."OBJECT_NAME"="B"."OBJECT_NAME")

41 rows selected

由于dbms_sqltune.import_sql_profile需要使用sql text的文本内容,如果SQL语句较长且有换行或大小写的问题,如果直接写SQL,可能和原来的SQL语句不同。

使用outline的内容创建profile
declare
v_hints sys.sqlprof_attr;
sql_txt clob;
begin
v_hints:=sys.sqlprof_attr(
'BEGIN_OUTLINE_DATA',
'USE_NL(@"SEL$3FF8579E" "A"@"UPD$1")',
'LEADING(@"SEL$3FF8579E" "B"@"SEL$1" "A"@"UPD$1")',
'INDEX(@"SEL$3FF8579E" "A"@"UPD$1" ("TINDEX"."OBJECT_NAME"))',
'FULL(@"SEL$3FF8579E" "B"@"SEL$1")',
'OUTLINE(@"SEL$1")',
'OUTLINE(@"UPD$1")',
'UNNEST(@"SEL$1")',
'OUTLINE_LEAF(@"SEL$3FF8579E")',
'ALL_ROWS',
'OPT_PARAM(''star_transformation_enabled'' ''true'')',
'OPTIMIZER_FEATURES_ENABLE(''10.2.0.4'')',
'IGNORE_OPTIM_EMBEDDED_HINTS',
'END_OUTLINE_DATA'
);
select sql_fulltext into sql_txt from v$sql where sql_id='55j33g4qx7g';
dbms_sqltune.import_sql_profile(sql_text => sql_txt,
profile => v_hints,name => 'SQLPROF_INC_CUST_999',
replace => TRUE,force_match => TRUE);
end;
/
新产生了一个SQL的子句执行计划
SQL> select sql_fulltext,buffer_gets,executions,sql_id,child_number from v$sql where sql_id='55j33g4qx7g';
SQL_FULLTEXT BUFFER_GETS EXECUTIONS SQL_ID CHILD_NUMBER
-------------------------------------------------------------------------------- ----------- ---------- ------------- ------------
update Tindex a set a.object_type='SPECIAL' where a.object_type is not null 48 3 55j33g4qx7g 0
update Tindex a set a.object_type='SPECIAL' where a.object_type is not null 14249 5 55j33g4qx7g 1

可以看到使用了SQL profile
select * from table(dbms_xplan.display_cursor('55j33g4qx7g',1));
SQL_ID 55j33g4qx7g, child number 1
-------------------------------------
update Tindex a set a.object_type='SPECIAL' where a.object_type is not null and
exists (select 1 from Tindex b where b.object_name='TINDEX' and
a.object_name=b.object_name)

Plan hash value: 2122516761

------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | | | 570 (100)| |
| 1 | UPDATE | TINDEX | | | | |
|* 2 | TABLE ACCESS BY INDEX ROWID| TINDEX | 1 | 34 | 3 (0)| 00:00:01 |
| 3 | NESTED LOOPS | | 1 | 59 | 570 (1)| 00:00:07 |
| 4 | SORT UNIQUE | | 7 | 175 | 566 (1)| 00:00:07 |
|* 5 | TABLE ACCESS FULL | TINDEX | 7 | 175 | 566 (1)| 00:00:07 |
|* 6 | INDEX RANGE SCAN | IDX_TINDEX_NAME | 1 | | 2 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - filter("A"."OBJECT_TYPE" IS NOT NULL)
5 - filter("B"."OBJECT_NAME"='TINDEX')
6 - access("A"."OBJECT_NAME"='TINDEX')
filter("A"."OBJECT_NAME"="B"."OBJECT_NAME")

Note
-----
- SQL profile "SQLPROFILE_full" used for this statement

刷新共享池或重启数据库之后仍然生效

如果想要删除profile,可以用以下命令:
exec dbms_sqltune.drop_sql_profile(name => 'SQLPROFILE_full');

⑷ 如何查找MySQL中查询慢的SQL语句

如何查找mysql中查询慢的sql语句
一、mysql数据库有几个配置选项可以帮助我们及时捕获低效sql语句
1,slow_query_log
这个参数设置为on,可以捕获执行时间超过一定数值的sql语句。
2,long_query_time
当sql语句执行时间超过此数值时,就会被记录到日志中,建议设置为1或者更短。
3,slow_query_log_file
记录日志的文件名。
4,log_queries_not_using_indexes
这个参数设置为on,可以捕获到所有未使用索引的sql语句,尽管这个sql语句有可能执行得挺快。
二、检测mysql中sql语句的效率的方法
1、通过查询日志
(1)、windows下开启mysql慢查询
mysql在windows系统中的配置文件一般是是my.ini找到[mysqld]下面加上
代码如下
log-slow-queries
=
f:/mysql/log/mysqlslowquery。log
long_query_time
=
2
(2)、linux下启用mysql慢查询
mysql在windows系统中的配置文件一般是是my.cnf找到[mysqld]下面加上
代码如下
log-slow-queries=/data/mysqldata/slowquery。log
long_query_time=2

⑸ 如果输入一条查询一张表的sql语句,但数据库执行缓慢,如何并采取什么样的方法对数据库进行优化

1.对表格进行优化。创建索引可以大大的加快查询的速度。
2。对你的语句进行优化。where语句中执行的顺序是:从右往左,从下往上。所以
(1)能排除最多数据的条件应该写在最外面。
(2)如果是多表关联的,那么关联表应该放在中间,数据少的表放最后
(3)尽量不要用select *,因为这样数据库是进行全表扫描,相当于select 所有字段,尽量选需要的吧

⑹ 如何用慢查询快速定位执行慢的SQL

慢查询可以帮助企业找到执行慢的SQL,开启了慢查询日志,并设置了相应的慢查询时间阈值之后,只需要查询时间大于这个阈值的SQL语句都会保存在慢查询日志中,然后就可以通过工具提取到想要查找的SQL语句了。对于懂这方面知道的技术人才可能并不是很难,但对于没有接触过的人员来说还是比较复杂的,其实你可以可以找第三方提供商帮你做这些服务,听云有了解过吗?听云提供数字化业务运维解决方案,围绕企业的信息化与数字化业务提供一套覆盖用户端、网络、服务器端全栈实时的监控与大数据智能分析平台,对于慢的SQL就可以快递的跟踪定位问题、解决问题。

⑺ 一条查询极为缓慢的sql语句,如何去优化呢

1、将查询条件字段简历index;
2、将尽可能筛选掉最大数据量的条件放到where条件最后面,因为sql执行时,where条件是由右往左执行。
3、尽可能少用like、in等函数