Oracle數(shù)據(jù)庫(kù)找到 Top Hard Parsing SQL 語(yǔ)句的方法
有一個(gè)數(shù)據(jù)庫(kù)應(yīng)用程序存在過(guò)多的解析問(wèn)題,因此需要找到產(chǎn)生大量硬解析的主要語(yǔ)句。
什么是硬解析
Oracle數(shù)據(jù)庫(kù)中的硬解析(Hard Parse)是指在執(zhí)行SQL語(yǔ)句時(shí),數(shù)據(jù)庫(kù)需要重新解析該SQL語(yǔ)句,并創(chuàng)建新的執(zhí)行計(jì)劃的過(guò)程。這個(gè)過(guò)程涉及到對(duì)SQL語(yǔ)句的完整解析、編譯和生成執(zhí)行計(jì)劃,是數(shù)據(jù)庫(kù)性能優(yōu)化中的一個(gè)重要環(huán)節(jié)。以下是硬解析的詳細(xì)過(guò)程:
- 語(yǔ)法、語(yǔ)義及權(quán)限檢查:Oracle首先會(huì)對(duì)SQL語(yǔ)句進(jìn)行語(yǔ)法檢查,確保語(yǔ)句的拼寫(xiě)和結(jié)構(gòu)正確無(wú)誤。接著進(jìn)行語(yǔ)義檢查,驗(yàn)證語(yǔ)句中引用的對(duì)象是否存在以及執(zhí)行語(yǔ)句的用戶(hù)是否具有相應(yīng)的權(quán)限。
- 查詢(xún)轉(zhuǎn)換:Oracle會(huì)應(yīng)用不同的轉(zhuǎn)換技巧,將SQL語(yǔ)句轉(zhuǎn)換為語(yǔ)義上等價(jià)的其他形式。例如,
COUNT(1)
可能會(huì)被轉(zhuǎn)換為COUNT(*)
,以?xún)?yōu)化查詢(xún)性能。 - 根據(jù)統(tǒng)計(jì)信息生成執(zhí)行計(jì)劃:這是硬解析中最耗時(shí)的步驟。Oracle會(huì)根據(jù)數(shù)據(jù)庫(kù)的統(tǒng)計(jì)信息,如表的大小、索引的統(tǒng)計(jì)數(shù)據(jù)等,來(lái)確定執(zhí)行SQL語(yǔ)句的最佳路徑,即成本最低的執(zhí)行計(jì)劃。
- 將游標(biāo)信息(執(zhí)行計(jì)劃)保存到庫(kù)緩存:一旦執(zhí)行計(jì)劃生成,Oracle會(huì)將這個(gè)執(zhí)行計(jì)劃保存在共享池(Shared Pool)的庫(kù)緩存(Library Cache)中,以便后續(xù)相同的SQL語(yǔ)句可以重用這個(gè)執(zhí)行計(jì)劃,減少硬解析的發(fā)生。
硬解析的觸發(fā)條件包括:
- 首次執(zhí)行某個(gè)SQL語(yǔ)句時(shí),因?yàn)閿?shù)據(jù)庫(kù)尚未為其生成解析結(jié)果,必須進(jìn)行硬解析。
- 如果一個(gè)已經(jīng)硬解析過(guò)的SQL語(yǔ)句對(duì)應(yīng)的解析結(jié)果在共享池中被替換或因其他原因失效(例如,相關(guān)的數(shù)據(jù)庫(kù)對(duì)象元數(shù)據(jù)發(fā)生變化),那么下次執(zhí)行該語(yǔ)句時(shí)需要重新進(jìn)行硬解析。
- 即使對(duì)于相同的SQL文本,如果其綁定變量值或會(huì)話(huà)環(huán)境(如當(dāng)前用戶(hù)的權(quán)限、NLS設(shè)置等)發(fā)生變化,導(dǎo)致生成的解析樹(shù)或執(zhí)行計(jì)劃與緩存中的不一致,也會(huì)觸發(fā)硬解析。
- 某些類(lèi)型的SQL語(yǔ)句,如DDL(數(shù)據(jù)定義語(yǔ)言)語(yǔ)句,由于它們的操作通常是不可緩存的,因此總是進(jìn)行硬解析。
硬解析對(duì)數(shù)據(jù)庫(kù)性能有顯著影響,因?yàn)樗鼤?huì)消耗大量的CPU資源和內(nèi)存,增加磁盤(pán)I/O,延長(zhǎng)查詢(xún)響應(yīng)時(shí)間,降低用戶(hù)體驗(yàn)。因此,在數(shù)據(jù)庫(kù)性能優(yōu)化中,通常建議盡量減少硬解析的發(fā)生,通過(guò)使用綁定變量、優(yōu)化SQL語(yǔ)句結(jié)構(gòu)等方式來(lái)提高軟解析的比例,從而提升數(shù)據(jù)庫(kù)的整體性能。
當(dāng)必須將 SQL 語(yǔ)句加載到共享池中時(shí),會(huì)發(fā)生硬解析。在這種情況下,Oracle Server 必須在共享池中分配內(nèi)存并解析語(yǔ)句。
當(dāng)共享池太小時(shí),或者當(dāng)您有沒(méi)有綁定變量的不可重用 SQL 語(yǔ)句時(shí),可能會(huì)發(fā)生過(guò)多的硬解析。
我們可能會(huì)想到 AWR 報(bào)告,其中有一節(jié)標(biāo)題為“SQL ordered by Parse Calls”,但是這里的數(shù)值不僅是硬解析調(diào)用,而且還包含了軟解析。
因此我們可以使用查詢(xún)表中dba_hist_active_sess_history IN_HARD_PARSE='Y' 的語(yǔ)句,查出真正的硬解析語(yǔ)句。
查詢(xún)一段時(shí)間以來(lái)硬解析次數(shù)最高語(yǔ)句
select INSTANCE_NUMBER,TOP_LEVEL_SQL_ID,SQL_ID,count(*) from dba_hist_active_sess_history where IN HARD_PARSE='Y' and snap_id>=39072 and snap_id<=39073 and sample_time>to_date('20240814 09:09','yyyymmdd hh24:mi') and sample_time<to_date('20240814 10:10','yyyymmdd hh24:mi') group by INSTANCE_NUMBER,TOP_LEVEL_SQL_ID,SQL_ID having count(*)>10 order by count(*) desc;
查詢(xún)一段時(shí)間以來(lái)所有實(shí)例硬解析top語(yǔ)句???????
select TOP_LEVEL_SQL_ID,SQL_ID,count(* from dba_hist_active_sess_history where IN_HARD_PARSE='Y' and snap_id>=39072 and snap_id<=39093 and sample_time>to_date('20240814 09:08','yyyymmdd hh24:mi') and sample_time<to_date('20240814 16:15','yyyymmdd hh24:mi') group by TOP_LEVEL_SQL_ID,SQL_ID having count(*)>10 order by count(*) desc;
TOP_LEVEL_SQL_ID和SQL_ID
很多時(shí)候面對(duì)包或者存儲(chǔ)過(guò)程,我們看到的"sql_id"僅僅是包或者存儲(chǔ)過(guò)程本身的"sql_id",但對(duì)于包以及存儲(chǔ)過(guò)程里面到底包含了哪些sql是不知道的,這時(shí)候就可以利用這一列,查出包或者存儲(chǔ)過(guò)程里的一系列sql_id。
查詢(xún)存儲(chǔ)過(guò)程中那些sql語(yǔ)句慢
查詢(xún)出硬解析語(yǔ)句為存儲(chǔ)過(guò)程時(shí),如何查看存儲(chǔ)過(guò)程中的sql語(yǔ)句
###查詢(xún)存儲(chǔ)過(guò)程中那些語(yǔ)句慢 set verify on set echo on set lines 250 set head on set tab off WITH snaps AS (SELECT /*+ materialize*/ snap_id, dbid FROM dba_hist_snapshot WHERE begin_interval_time > SYSDATE - &days), obj AS (SELECT /*+ materialize*/ object_id, subprogram_id FROM DBA_PROCEDURES WHERE object_name = UPPER ('&package_name') AND procedure_name = UPPER('&procedure_name')) SELECT /*+ push_subq(snp) opt_param('_optimizer_use_feedback' 'false') */ t.* FROM (SELECT sql_id, event, a.SQL_PLAN_HASH_VALUE, COUNT(DISTINCT sql_exec_id || sql_exec_start) calls, count(1) cnt FROM dba_hist_active_sess_history a WHERE (PLSQL_ENTRY_OBJECT_ID, PLSQL_ENTRY_SUBPROGRAM_ID) IN (SELECT object_id, subprogram_id FROM obj) AND (dbid, SNAP_ID) IN (SELECT /*+qb_name(snp)*/ dbid, SNAP_ID FROM snaps) GROUP BY sql_id, SQL_PLAN_HASH_VALUE, event) t ORDER BY sql_id, SQL_PLAN_HASH_VALUE, event, cnt DESC / CLEAR COLUMNS
到此這篇關(guān)于Oracle數(shù)據(jù)庫(kù)如何找到 Top Hard Parsing SQL 語(yǔ)句?的文章就介紹到這了,更多相關(guān)Oracle Top Hard Parsing SQL 語(yǔ)句內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Oracle查看正在執(zhí)行的sql語(yǔ)句的方法大全
- oracle數(shù)據(jù)庫(kù)查看鎖表的sql語(yǔ)句整理
- oracle轉(zhuǎn)mysql語(yǔ)句轉(zhuǎn)換實(shí)例代碼
- Oracle中sql語(yǔ)句如何執(zhí)行日志查詢(xún)
- Oracle如何在SQL語(yǔ)句中對(duì)時(shí)間操作、運(yùn)算
- oracle數(shù)據(jù)庫(kù)導(dǎo)入.dmp腳本的sql 語(yǔ)句
- ORACLE中如何找到未提交事務(wù)的SQL語(yǔ)句詳解
- SELECT INTO 和 INSERT INTO SELECT 兩種表復(fù)制語(yǔ)句詳解(SQL數(shù)據(jù)庫(kù)和Oracle數(shù)據(jù)庫(kù)的區(qū)別)
相關(guān)文章
Oracle使用EMCC監(jiān)控當(dāng)前所有數(shù)據(jù)庫(kù)的流程步驟
EMCC,全稱(chēng)Oracle Enterprise Manager Cloud Control,是Oracle提供的一套集中化監(jiān)控工具,可以對(duì)數(shù)據(jù)庫(kù)、操作系統(tǒng)、中間件等進(jìn)行監(jiān)控,本文小編給大家介紹了Oracle使用EMCC監(jiān)控當(dāng)前所有數(shù)據(jù)庫(kù)的流程步驟,需要的朋友可以參考下2024-09-09Oracle Connect to Idle Instance解決方法
本文將介紹Oracle如何解決Connect to Idle Instance問(wèn)題,需要了解的朋友可以參考下2012-11-11Oracle數(shù)據(jù)庫(kù)中基本的查詢(xún)優(yōu)化與子查詢(xún)優(yōu)化講解
這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)中基本的查詢(xún)優(yōu)化與子查詢(xún)優(yōu)化講解,舉了實(shí)例來(lái)分析子查詢(xún)對(duì)性能的影響,需要的朋友可以參考下2016-01-01解決Oracle?DISTINCT?報(bào)錯(cuò)?inconsistent?datatypes:?expected?
這篇文章主要介紹了Oracle DISTINCT報(bào)錯(cuò)inconsistent datatypes:expected-got CLOB(數(shù)據(jù)類(lèi)型不一致:?應(yīng)為-,但卻獲得?CLOB),本文給大家分享三種解決方案,需要的朋友可以參考下2023-07-07