當前位置:首頁 » 編程語言 » 極為緩慢的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等函數