精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

數據庫SQL的優化

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-09 15:43 ? 次閱讀

數據庫執行SQL都會先進行語義解析,然后將SQL分成一步一步可執行的計劃,然后逐步執行。通過分析執行計劃,我們可以清晰的看到數據庫執行的操作,這對于數據庫SQL的優化具有重大意義。

1. 執行計劃

用戶成功連接數據庫之后,用戶和數據庫成功建立起了會話。此后,用戶每通過會話發出一條SQL語句,數據庫系統都會對其進行一系列檢查、分析、處理。

同時優化器會對SQL進行一些優化,并選擇出一個它覺得最優的執行計劃,然后再去執行這些操作。由于SQL不同的寫法會影響優化器為之生成和選定的執行計劃。所以我們就可以通過改寫SQL語句來改變其執行計劃,從而提升SQL語句性能。

2. 系統統計數據

系統統計數據反映了數據庫系統的處理能力,會對執行計劃中左右操作成本(其實就是性能消耗)計算產生重要影響。系統統計數據主要包括轉速、單塊讀消耗時間、多塊讀消耗時間、多塊讀平均每次讀取的數據塊等。

系統統計數據會影響優化器計算分析SQL語句執行計劃的成本所選擇的算法,也會影響SQL語句生成和選擇的執行計劃。

3. 對象統計數據

優化器對SQL進行解析的時候,會根據系統統計數據和對象統計數據等信息,計算成本,最后選出最低成本的執行計劃。由于系統統計數據認為很難干涉,所以對象統計數據對于SQL執行計劃來說影響更大。

對象統計數據主要包括三個部分:表(分區及子分區)相關統計數據、索引相關統計數據和字段相關統計數據。所以收集這些信息則可以進行對象統計數據的分析,從而進行SQL優化。

4. 獲取執行計劃

獲取執行計劃有多種方法,下面分別介紹一下。

4.1 通過各種GUI工具獲得執行計劃

通過各種GUI可以獲取到執行計劃,其優點是操作簡單,靈活;獲取的信息也比較多。

下面是通過Sql Developer中的工具直接獲取到的執行計劃示例

圖片

4.2 autotrace功能

autotrace功能是Oracle公司產品,其功能強大、使用靈活,因而應用廣泛。

4.2.1使用方法介紹

set autot off  關閉autotrace功能
set autot on 開啟autotrace功能,輸出SQL語句的查詢結果,執行計劃以及相關的性能統計數據
set autot on expl 開啟autotrace功能,輸出SQL語句的查詢結果,執行計劃,不輸出性能統計數據
set autot on stat 開啟autotrace功能,輸出SQL語句的查詢結果以及相關性能數據,不輸出執行計劃
set autot trace 開啟autotrace功能,只輸出SQL語句的執行計劃以及性能數據,不輸出查詢結果
set autot trace expl 開啟autotrace功能,只輸出SQL的執行計劃,不輸出查詢結果及性能數據
set autot trace stat 開啟autotrace功能,只輸出SQL的性能統計數據,不輸出執行計劃以及查詢結果

如下示例:

set autotrace on
select * from emp join DEPT on emp.DEPTNO = DEPT.DEPTNO
where DNAME = 'SALES';

圖片

圖中輸出了執行計劃以及性能數據.

4.3 使用DBMS_XPLAN包

DBMS_XPLAN是Oracel數據庫的內置包,該包提供了多個函數,通過這些函數,用戶可以比較容易的獲取執行計劃等數據。

4.3.1 DISPLAY方法
DBMS_XPLAN.DISPLAY(
 table_name in varchar2 default 'PLAN_TABLE',
    statement_id in varchar2 default null,
    format in varchar2 default 'TYPICAL',
    filter_preds in varchar2 default null);

以上是DISPLAY的語法,默認執行計劃存儲表為PLAN_TABLE,如果要查詢此表需要有SELECT的權限。

其中的參數含義如下:

  • table_name :存儲執行計劃的表名。
  • statement_id :SQL語句的ID ,可以使用set statement_id 來指定其ID。如果為null,則表示獲取最近被解釋的SQL的執行計劃。
  • format :執行計劃的具體輸出級別 其值有
    • 'BASIC' :基本輸出,經輸出執行計劃中每個節點),
    • 'TYPICAL' :典型格式輸出,默認格式。該格式輸出每個節點的ID、操作名、節點的數據行、字節數、優化成本等。
    • 'SERIAL' :串行執行格式,輸出與典型格式類似。
    • 'ALL' :完全格式, 最高用戶級別的輸出格式,除了輸出典型格式的內容,還會輸出投影以及別名的相關信息。

示例如下:

explain plan for 
select * from emp join DEPT on emp.DEPTNO = DEPT.DEPTNO
where DNAME = 'SALES';
select * from table(dbms_xplan.display())

圖片

為了更好的控制執行計劃的輸出格式,如下的關鍵字可以添加到標準格式后面,用來自定義輸出格式以及信息。

  • ROWS 輸出優化器估算出的數據行數
  • BYTES 輸出優化器估算出的字節數
  • COST 輸出優化器估算出的成本
  • PARTITION 輸出分區裁剪相關信息
  • PREDICATE 輸出謂詞部分相關信息
  • PARALLEL 輸出并行操作(PX)相關信息
  • PROJECTION 輸出字段映射部分相關信息
  • ALIAS 輸出查詢塊/對象 別名相關信息
  • REMOTE 輸出分布式查詢相關信息
  • NOTE 輸出執行計劃的提醒部分相關信息

示例如下:

explain plan for 
select * from emp join DEPT on emp.DEPTNO = DEPT.DEPTNO
where DNAME = 'SALES';
select * from table(dbms_xplan.display());
select * from table(dbms_xplan.display(null,null,'BASIC ROWS BYTES'));
select * from table(dbms_xplan.display(null,null,'ALL -PROJECTION -NOTE'));
select * from table(dbms_xplan.display(null,null,'ALL PROJECTION NOTE'));
4.3.2 DISPLAY_CURSOR方法

語法如下

DBMS_XPLAN.DISPLAY_CURSOR(
 sql_id in varchar2 default null,--默認獲取會話最后一個游標處的執行計劃
    child_number in number default null,--游標的子號
    format in varchar2 default 'TYPICAL' --輸出級別,與之前介紹相同
);

此函數可以獲取內存游標緩存處的執行計劃和統計信息。

示例如下:

alter session set statistics_level = all;
select * from emp join DEPT on emp.DEPTNO = DEPT.DEPTNO
where DNAME = 'SALES';
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

執行結果:

圖片

以下函數使用較少,所以僅介紹其語法及功能。

4.3.3 DISPLAY_AWR

語法如下

DBMS_XPLAN.DISPLAY_AWR(
    sql_id IN varchar2
 plan_hash_value in number default null,
    db_id in number default null,
    format in varchar2 default 'TYPICAL');

DISPLAY_AWR函數獲取存儲在AWR歷史庫中SQL語句的執行計劃相關信息。

4.3.4 DISPLAY_PLAN

語法如下

DBMS_XPLAN.DISPLAY_PLAN(
    table_name in varchar2 default 'PLAN_TABLE',
    statement_id in varchar2 default null,
    format in varchar2 default 'TYPICAL',
    filter_preds in varchar2 default null,
    type in varchar2 default null --輸出類型,其值為'TEXT','ACTIVE','HTML','XML'
);

該函數可獲取執行計劃存儲表的內容。可顯示CLOB類型信息,包括執行計劃以及相關統計信息。

4.3.5 DISPLAY_SQL_PLAN_BASELINE

語法如下

DISPLAY_XPLAN.DISPLAU_SQL_PLAN_BASELINE(
    sql_handle in varchar2 := null,
    plan_name in varchar2 := null,
    format in varchar2 := 'TYPICAL')
return dbms_xpaln_type_table;

此函數和獲取存儲在系統視圖中SQL語句計劃基線的執行計劃相關的信息。

4.3.6 DISPLAY_SQLSET
DBMS_XPLAN.DISPLAY_SQLSET(
 sqlset_name in varchar2,
    sql_id in varchar2,
    plan_hash_value in number := null,
    format in varchar2 := 'TYPICAL',
    sqlset_owner in varchar2 := null
)
return DBMS_XPLAN_TYPE_TABLE PIPELINED;

此函數獲取存儲在SQL調優集中SQL語句的執行計劃以及相關信息。

4.4 查詢PLAN_TABLE獲取執行計劃

我們可以通過編寫的SQL語句來查詢執行計劃。即直接查詢執行計劃存儲表(默認為PLAN_TABLE)

explain plan SET STATEMENT_ID = 'TEST1' for 
select * from emp join DEPT on emp.DEPTNO = DEPT.DEPTNO
where DNAME = 'SALES';

SELECT  ID, PARENT_ID ,OPERATION ,OBJECT_NAME NAME , BYTES ,IO_COST ,CPU_COST
FROM PLAN_TABLE WHERE STATEMENT_ID = 'TEST1' ORDER BY ID ;

圖片

或者使用如下SQL查詢

SELECT  ID, PARENT_ID ,
    LPAD(' ', LEVEL-1)||OPERATION||' '||OPTIONS||' '||OBJECT_NAME NAME
FROM PLAN_TABLE 
CONNECT BY prior id = parent_id 
    and prior statement_id = statement_id 
start with id = 0 
    and statement_id = 'TEST1'
 ORDER BY ID ;

結果如下

圖片

4.5 跟蹤計劃

通過對SQL語句進行跟蹤,從而獲取相關執行計劃等。

主要方法有SQL_TRACE 和OPTIMIZER_TRACE ,前者會在跟蹤文件里輸出執行計劃及性能統計等相關數據。OPTIMIZER_TRACE 在跟蹤文件里記錄優化器分析、選擇執行計劃的過程。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • SQL
    SQL
    +關注

    關注

    1

    文章

    760

    瀏覽量

    44081
  • 數據庫
    +關注

    關注

    7

    文章

    3767

    瀏覽量

    64279
  • 函數
    +關注

    關注

    3

    文章

    4308

    瀏覽量

    62444
  • GUI
    GUI
    +關注

    關注

    3

    文章

    650

    瀏覽量

    39553
收藏 人收藏

    評論

    相關推薦

    數據庫設計及開發規范之sql性能優化

    數據庫設計及開發規范,sql性能優化
    發表于 05-08 10:58

    如何修復置疑SQL數據庫

    如何修復置疑SQL數據庫 如果 SQL Server 因為磁盤可用空間不足,而不能完成數據庫的恢復,那么  SQL Server
    發表于 03-29 10:42 ?941次閱讀

    數據庫SQL語句電子教程

    電子發燒友為您提供了數據庫SQL語句電子教程,幫助您了解數據庫 SQL語句 ,學習讀懂數據庫SQL
    發表于 07-14 17:09 ?0次下載

    Oracle數據庫SQL優化培訓

    數據庫講解
    發表于 12-16 21:46 ?0次下載

    醫院SQL數據庫系統語句優化

    本文就如何優化大型數據庫的性能進行了一些探索,提出了優化數據庫訪問性能的若干策略,特別是對SQL語句進行了有效的分析設計的問題,以使其加快執
    的頭像 發表于 02-17 20:26 ?5294次閱讀

    創建新的數據庫和更改SQL Server CE數據庫中的數據操作教程免費下載

    SQL Server CE 中的數據庫是存儲結構化數據的表集合。在可以存儲數據庫之前,必須創建數據庫。在創建
    發表于 09-19 11:28 ?5次下載

    ACCESS數據庫SQL語言

    ACCESS數據庫SQL語言(電源技術版面費5400)-ACCESS數據庫SQL語言,有需要的可以參考!
    發表于 08-31 12:13 ?21次下載
    ACCESS<b class='flag-5'>數據庫</b><b class='flag-5'>SQL</b>語言

    基于LABVIEW的SQL Server數據庫操作教程

    基于LABVIEW的SQL Server數據庫操作教程
    發表于 09-13 14:54 ?92次下載

    ORACLE數據庫教程-SQL使用講解

    ORACLE數據庫教程-SQL使用講解(普德新星電源技術有限公司最新招聘信息)-該文檔為ORACLE數據庫教程-SQL使用講解文檔,是一份還算不錯的參考文檔,感興趣的可以下載看看,,,
    發表于 09-28 10:27 ?4次下載
    ORACLE<b class='flag-5'>數據庫</b>教程-<b class='flag-5'>SQL</b>使用講解

    SQL SERVER數據庫數據恢復案例

    數據庫數據恢復環境: 某品牌存儲存放大小約80TB的SQL SERVER數據庫數據庫包含兩個LDF文件,每10天生成一個500GB大小的
    的頭像 發表于 09-29 11:39 ?1204次閱讀
    <b class='flag-5'>SQL</b> SERVER<b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復案例

    使用SQL語句創建數據庫

    使用SQL語句創建數據庫 在今天的信息社會中,數據庫是信息化建設的關鍵要素之一,已經成為企業和組織的重要管理工具。創建數據庫數據庫操作的第
    的頭像 發表于 08-28 17:09 ?4091次閱讀

    sql怎么用代碼創建數據庫

    sql怎么用代碼創建數據庫 SQL是一種結構化查詢語言,用于通過編程語言與數據庫進行通信。它允許用戶從數據庫中檢索、修改和刪除
    的頭像 發表于 08-28 17:09 ?2712次閱讀

    數據庫優化那些事

    數據庫 表設計 sql語句優化 數據庫 大型項目拆分為小項目,每個項目有自己獨立的數據庫 原來所有
    的頭像 發表于 10-08 11:49 ?573次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>優化</b>那些事

    sql數據庫入門基礎知識

    SQL(Structured Query Language,結構化查詢語言)是一種用于管理關系型數據庫的編程語言。它被廣泛應用于企業應用、數據倉庫和網站開發等領域。了解SQL的基礎知識
    的頭像 發表于 11-23 14:24 ?1914次閱讀

    數據庫數據恢復—SQL Server數據庫出現823錯誤的數據恢復案例

    SQL Server數據庫故障: SQL Server附加數據庫出現錯誤823,附加數據庫失敗。數據庫
    的頭像 發表于 09-20 11:46 ?294次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—<b class='flag-5'>SQL</b> Server<b class='flag-5'>數據庫</b>出現823錯誤的<b class='flag-5'>數據</b>恢復案例