最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Oracle數(shù)據(jù)庫找到 Top Hard Parsing SQL 語句的方法

 更新時(shí)間:2025年01月07日 09:33:51   作者:minebmw7  
Oracle數(shù)據(jù)庫中的硬解析是指重新解析SQL語句并創(chuàng)建新的執(zhí)行計(jì)劃的過程,本文給大家介紹Oracle數(shù)據(jù)庫找到 Top Hard Parsing SQL 語句的方法,感興趣的朋友一起看看吧

有一個(gè)數(shù)據(jù)庫應(yīng)用程序存在過多的解析問題,因此需要找到產(chǎn)生大量硬解析的主要語句。

什么是硬解析

Oracle數(shù)據(jù)庫中的硬解析(Hard Parse)是指在執(zhí)行SQL語句時(shí),數(shù)據(jù)庫需要重新解析該SQL語句,并創(chuàng)建新的執(zhí)行計(jì)劃的過程。這個(gè)過程涉及到對SQL語句的完整解析、編譯和生成執(zhí)行計(jì)劃,是數(shù)據(jù)庫性能優(yōu)化中的一個(gè)重要環(huán)節(jié)。以下是硬解析的詳細(xì)過程:

  • 語法、語義及權(quán)限檢查:Oracle首先會(huì)對SQL語句進(jìn)行語法檢查,確保語句的拼寫和結(jié)構(gòu)正確無誤。接著進(jìn)行語義檢查,驗(yàn)證語句中引用的對象是否存在以及執(zhí)行語句的用戶是否具有相應(yīng)的權(quán)限。
  • 查詢轉(zhuǎn)換:Oracle會(huì)應(yīng)用不同的轉(zhuǎn)換技巧,將SQL語句轉(zhuǎn)換為語義上等價(jià)的其他形式。例如,COUNT(1)可能會(huì)被轉(zhuǎn)換為COUNT(*),以優(yōu)化查詢性能。
  • 根據(jù)統(tǒng)計(jì)信息生成執(zhí)行計(jì)劃:這是硬解析中最耗時(shí)的步驟。Oracle會(huì)根據(jù)數(shù)據(jù)庫的統(tǒng)計(jì)信息,如表的大小、索引的統(tǒng)計(jì)數(shù)據(jù)等,來確定執(zhí)行SQL語句的最佳路徑,即成本最低的執(zhí)行計(jì)劃。
  • 將游標(biāo)信息(執(zhí)行計(jì)劃)保存到庫緩存:一旦執(zhí)行計(jì)劃生成,Oracle會(huì)將這個(gè)執(zhí)行計(jì)劃保存在共享池(Shared Pool)的庫緩存(Library Cache)中,以便后續(xù)相同的SQL語句可以重用這個(gè)執(zhí)行計(jì)劃,減少硬解析的發(fā)生。

硬解析的觸發(fā)條件包括:

  • 首次執(zhí)行某個(gè)SQL語句時(shí),因?yàn)閿?shù)據(jù)庫尚未為其生成解析結(jié)果,必須進(jìn)行硬解析。
  • 如果一個(gè)已經(jīng)硬解析過的SQL語句對應(yīng)的解析結(jié)果在共享池中被替換或因其他原因失效(例如,相關(guān)的數(shù)據(jù)庫對象元數(shù)據(jù)發(fā)生變化),那么下次執(zhí)行該語句時(shí)需要重新進(jìn)行硬解析。
  • 即使對于相同的SQL文本,如果其綁定變量值或會(huì)話環(huán)境(如當(dāng)前用戶的權(quán)限、NLS設(shè)置等)發(fā)生變化,導(dǎo)致生成的解析樹或執(zhí)行計(jì)劃與緩存中的不一致,也會(huì)觸發(fā)硬解析。
  • 某些類型的SQL語句,如DDL(數(shù)據(jù)定義語言)語句,由于它們的操作通常是不可緩存的,因此總是進(jìn)行硬解析。

硬解析對數(shù)據(jù)庫性能有顯著影響,因?yàn)樗鼤?huì)消耗大量的CPU資源和內(nèi)存,增加磁盤I/O,延長查詢響應(yīng)時(shí)間,降低用戶體驗(yàn)。因此,在數(shù)據(jù)庫性能優(yōu)化中,通常建議盡量減少硬解析的發(fā)生,通過使用綁定變量、優(yōu)化SQL語句結(jié)構(gòu)等方式來提高軟解析的比例,從而提升數(shù)據(jù)庫的整體性能。

當(dāng)必須將 SQL 語句加載到共享池中時(shí),會(huì)發(fā)生硬解析。在這種情況下,Oracle Server 必須在共享池中分配內(nèi)存并解析語句。

當(dāng)共享池太小時(shí),或者當(dāng)您有沒有綁定變量的不可重用 SQL 語句時(shí),可能會(huì)發(fā)生過多的硬解析。

我們可能會(huì)想到 AWR 報(bào)告,其中有一節(jié)標(biāo)題為“SQL ordered by Parse Calls”,但是這里的數(shù)值不僅是硬解析調(diào)用,而且還包含了軟解析。

alt

因此我們可以使用查詢表中dba_hist_active_sess_history IN_HARD_PARSE='Y' 的語句,查出真正的硬解析語句。

查詢一段時(shí)間以來硬解析次數(shù)最高語句

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;

alt

查詢一段時(shí)間以來所有實(shí)例硬解析top語句???????

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;

alt

TOP_LEVEL_SQL_ID和SQL_ID

很多時(shí)候面對包或者存儲(chǔ)過程,我們看到的"sql_id"僅僅是包或者存儲(chǔ)過程本身的"sql_id",但對于包以及存儲(chǔ)過程里面到底包含了哪些sql是不知道的,這時(shí)候就可以利用這一列,查出包或者存儲(chǔ)過程里的一系列sql_id。

查詢存儲(chǔ)過程中那些sql語句慢

查詢出硬解析語句為存儲(chǔ)過程時(shí),如何查看存儲(chǔ)過程中的sql語句

###查詢存儲(chǔ)過程中那些語句慢
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ù)庫如何找到 Top Hard Parsing SQL 語句?的文章就介紹到這了,更多相關(guān)Oracle Top Hard Parsing SQL 語句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

黄冈市| 贵德县| 额敏县| 桐城市| 确山县| 搜索| 安阳县| 江安县| 清河县| 图片| 孙吴县| 清涧县| 中江县| 梧州市| 建昌县| 娄底市| 亳州市| 宁阳县| 长葛市| 土默特左旗| 平安县| 揭西县| 福贡县| 和田市| 确山县| 新巴尔虎左旗| 城市| 西充县| 北宁市| 古蔺县| 孙吴县| 岳池县| 扶余县| 双牌县| 塘沽区| 夏邑县| 栾城县| 泽库县| 晋宁县| 黄骅市| 望江县|