成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > Oracle SQL tuning 數(shù)據(jù)庫優(yōu)化步驟分享(圖文教程)

Oracle SQL tuning 數(shù)據(jù)庫優(yōu)化步驟分享(圖文教程)

熱門標簽:征服者火車站地圖標注 word地圖標注方向 開封智能外呼系統(tǒng)廠家 百度地圖標注素材 美圖秀秀地圖標注 外呼線路外顯本地號碼 征服眼公司地圖標注 阿爾巴尼亞地圖標注app 人工智能地圖標注自己能做嗎

SQL Turning 是Quest公司出品的Quest Central軟件中的一個工具。Quest Central是一款集成化、圖形化、跨平臺的數(shù)據(jù)庫管理解決方案,可以同時管理 Oracle、DB2 和 SQL server 數(shù)據(jù)庫。

一、SQL Tuning for SQL Server簡介

SQL語句的優(yōu)化對發(fā)揮數(shù)據(jù)庫的最佳性能非常關(guān)鍵。然而不幸的是,應用優(yōu)化通常由于時間和資源的因素而被忽略。SQL Tuning (SQL優(yōu)化)模塊可以對比和評測特定應用中SQL語句的運行性能,提出智能化的優(yōu)化建議,幫助用戶改善應用的響應時間。SQL優(yōu)化模塊具有非介入式SQL采集、自動優(yōu)化和專家建議等功能,全面改善SQL優(yōu)化工作。

二、SQL Tuning for SQL Server的使用

1、打開Quest Database Management Solutions彈出窗口如圖1所示

圖1  

2、在紅色標記處打開SQL Tuning 優(yōu)化SQL    

  (1)建立連接。

在Quest Central主界面上的“Database”樹上選擇“SQL Server”,然后在下方出現(xiàn)的“Tools”框中選擇“SQL Tuning”選項,打開“Lanch SQL Tuning for SQL Server Connections”對話框(圖2、圖3)。我們在這里建立數(shù)據(jù)庫服務器的連接,以后的分析工作都會在它上面完成。 

圖2 “建立連接”對話框 

圖3

     雙擊“New Connection”圖標,在彈出窗口中輸入數(shù)據(jù)庫的信息,單擊“OK”,然后單擊“Connect”即可。

   (2)分析原始SQL語句 ,在單擊“Connect”后將彈出一個新窗口,如圖4 

圖4

在打開窗口的“Oriangal SQL”文本框內(nèi)輸入需要分析的原始SQL語句,紅色標記處選擇對應的數(shù)據(jù)庫名,SQL語句代碼如下:

圖5 分析原始SQL語句

原始SQL語句

然后點擊工具欄上的“Execute”按鈕,執(zhí)行原始的SQL語句,SQL Tuning會自動分析SQL的執(zhí)行計劃,并把分析結(jié)果顯示到界面上(圖5)。

(3)優(yōu)化SQL。

現(xiàn)在我們點擊工具欄上的“Optimize Statement”按鈕,讓SQL Tuning開始優(yōu)化SQL,完成后,可以看到SQL Tuning產(chǎn)生了19條與原始SQL等價的優(yōu)化方案(圖6)。 

圖6 SQL優(yōu)化方案

(4)獲得最優(yōu)SQL。

接下來,我們來執(zhí)行上面產(chǎn)生的優(yōu)化方案,以選出性能最佳的等效SQL語句。在列表中選擇需要執(zhí)行的優(yōu)化方案(默認已全部選中),然后點擊工具欄上的“Execute”按鈕旁邊的下拉菜單,選擇“Execute Selected”。等到所有SQL運行完成后,點擊界面左方的“Tuning Resolution”按鈕,
可以看到最優(yōu)的SQL已經(jīng)出來啦,運行時間竟然可以提高21%?。▓D7)

圖7 “Tuning Resolution”界面 

最優(yōu)的SQL語句如下:

5)學習書寫專家級的SQL語句 。

優(yōu)化后的SQL語句

SELECT dbo.Person_BasicInfo.*, 
       dbo.Graduater_GraduaterRegist.RegistNO AS RegistNO, 
       dbo.Graduater_GraduaterRegist.RegistTime AS BaoDaoTime, 
       dbo.Graduater_GraduaterRegist.RegistMan AS RegistMan, 
       dbo.Graduater_Business.ComeFrom AS ComeFrom, 
       dbo.Graduater_Business.Code AS Code, 
       dbo.Graduater_Business.Status AS Status, 
       dbo.Graduater_Business.ApproveResult AS ApproveResult, 
       dbo.Graduater_Business.NewCorp AS NewCorp, 
       dbo.Graduater_Business.CommendNumber AS CommendNumber, 
       dbo.Graduater_Business.EmployStatus AS EmployStatus, 
       dbo.Graduater_Business.NewCommendTime AS NewCommendTime, 
       dbo.Graduater_Business.GetSource AS GetSource, 
       dbo.Graduater_Business.EmployTime AS EmployTime, 
       dbo.Graduater_Business.Job AS Job, 
       dbo.Graduater_Business.FillMan AS FillMan, 
       dbo.Graduater_Business.FillTime AS FillTime, 
       dbo.Graduater_Business.IsCommendOK AS IsCommendOK, 
       dbo.Graduater_Business.ApproveUser AS ApproveUser, 
       dbo.Graduater_Business.ApproveTime AS ApproveTime, 
       dbo.Graduater_Business.RegistTime AS RegistTime, 
       dbo.Graduater_Business.EmployCorp AS EmployCorp, 
       dbo.Graduater_Business.JobRemark AS JobRemark, 
       CASE WHEN dbo.Graduater_Business.ComeFrom = 'WS' THEN '網(wǎng)上登記' 
            WHEN dbo.Graduater_Business.ComeFrom = 'HP' THEN '華普大廈' 
            WHEN dbo.Graduater_Business.ComeFrom = 'JD' THEN '精典大廈' 
            WHEN dbo.Graduater_Business.ComeFrom = 'MC' THEN '賽馬場' 
            WHEN ComeFrom = 'ZX' THEN '高指中心' END AS ComeFromName, 
       dbo.Person_Contact.Address AS Address, 
       dbo.Person_Contact.Zip AS Zip, 
       dbo.Person_Contact.Telephone AS Telephone, 
       dbo.Person_Contact.Mobile AS Mobile, 
       dbo.Person_Contact.Email AS Email, 
       dbo.Person_Contact.IM AS IM, 
       dbo.Person_Skill.ForeignLanguage AS ForeignLanguage, 
       dbo.Person_Skill.ForeignLanguageLevel AS ForeignLanguageLevel, 
       dbo.Person_Skill.CantoneseLevel AS CantoneseLevel, 
       dbo.Person_Skill.MandarinLevel AS MandarinLevel, 
       dbo.Person_Skill.Language AS Language, 
       dbo.Person_Skill.TechnicalTitle AS TechnicalTitle, 
       dbo.Person_Skill.ComputerLevel AS ComputerLevel, 
       dbo.Person_EmployPurpose.JobType AS JobType, 
       dbo.Person_EmployPurpose.Vocation AS Vocation, 
       dbo.Person_EmployPurpose.JobPlace AS JobPlace, 
       dbo.Person_EmployPurpose.Salary AS Salary, 
       dbo.Person_EmployPurpose.OnJobDate AS OnJobDate, 
       dbo.Person_EmployPurpose.CorpType AS CorpType, 
       dbo.Person_EmployPurpose.Job AS RequireJob, 
       YEAR(GETDATE()) - YEAR(dbo.Person_BasicInfo.Birthday) AS Age, 
       dbo.Graduater_Business.EmployType AS EmployType, 
       dbo.Graduater_Business.EmployTypeCode AS EmployTypeCode, 
       dbo.Graduater_Business.EmployCorpType AS EmployCorpType, 
       CASE WHEN dbo.Graduater_Business.PrintStatus = '已打印' THEN '已打印' 
            ELSE '未打印' END AS PrintStatus, 
       dbo.Graduater_Business.PrintTime AS PrintTime, 
       CASE WHEN dbo.Graduater_Business.EmployStatus = '是' THEN '已就業(yè)' 
            ELSE '未就業(yè)' END AS EmployStatusView 
  FROM dbo.Person_BasicInfo 
       INNER JOIN dbo.Graduater_Business 
          ON dbo.Person_BasicInfo.PersonID = dbo.Graduater_Business.PersonID 
       LEFT OUTER JOIN dbo.Graduater_GraduaterRegist 
         ON dbo.Graduater_Business.GradBusinessID = dbo.Graduater_GraduaterRegist.GraduaterGUID 
       INNER JOIN dbo.Person_Contact 
          ON dbo.Person_BasicInfo.PersonID = dbo.Person_Contact.PersonID 
       INNER JOIN dbo.Person_Skill 
          ON dbo.Person_BasicInfo.PersonID = dbo.Person_Skill.PersonID 
       INNER JOIN dbo.Person_EmployPurpose 
          ON dbo.Person_BasicInfo.PersonID = dbo.Person_EmployPurpose.PersonID 
OPTION (FORCE ORDER)

 (

    通過上面的步驟,我們已經(jīng)可以實現(xiàn)自動優(yōu)化SQL語句,但更重要的是,我們還可以學習如何書寫這樣高性能的SQL語句。點擊界面左方的“Compare Scenarios”按鈕,我們可以比較優(yōu)化方案和原始SQL中的任意2條SQL語句,SQL Tuning會將它們之間的不同之處以不同顏色表示出來,
還可以在下方的“執(zhí)行計劃”中,通過比較兩條SQL語句的執(zhí)行計劃的不同,來了解其中的差異(圖8)。 

圖8 “Compare Scenarios”界面

Oracle SQL tuning的目標
    Oracle SQL tuning是一個復雜的課題。Oracle Tuning: The Definitive Reference 這整本書描述了關(guān)于SQL tuning的細節(jié)。盡管如此,
    為了提高系統(tǒng)系能,Oracle DBA應當遵從下面一些總的指導原則。

1、SQL tuning 目標
   是以最小的數(shù)據(jù)庫訪問次數(shù)提取更多地數(shù)據(jù)行來生成最佳的執(zhí)行計劃(盡可能最小化物理讀(PIO)與邏輯讀(LIO)。

    指導原則
        移除不必要的大型全表掃描
            大型表的全表掃描將產(chǎn)生龐大的系統(tǒng)I/O且使得整個數(shù)據(jù)庫性能下降。優(yōu)化專家首先會評估當前SQL查詢所返回的行數(shù)。最常見的辦
        法是為走全表掃描的大表增加索引。B樹索引,位圖索引,以及基于函數(shù)的索引等能夠避免全表掃描。有時候,對一些不必要的全表掃
        描通過添加提示的方法來避免全表掃描。

        緩存小表全表掃描
            有時候全表掃描是最快的訪問方式,管理員應當確保專用的數(shù)據(jù)緩沖區(qū)(keep buffer cache,nk buffer cache)對這些表可用。在
            Oracle 8 以后小表可以被強制緩存到 keep 池。

        使用最佳索引
            Oracle 訪問對象有時候會有一個以上的索引選擇。因此應當檢查當前查詢對象上的每一個索引以確保Oracle使用了最佳索引。

        物化聚合運算以靜態(tài)化表統(tǒng)計
            Oracle 10g的特性之一SQL Access advisor 會給出索引建議以及物化視圖的建議。物化視圖可以預連接表和預摘要表數(shù)據(jù)。(譯者
            按,即Oracle可以根據(jù)特定的更新方式來提前更新物化視圖中的數(shù)據(jù),而在查詢時僅僅查詢物化視圖即可得到最終所需的統(tǒng)計數(shù)據(jù)
            結(jié)果。物化視圖實際上是一張實體表)

    以上這些概括了SQL tuning的目標。然而看是簡單,調(diào)整起來并不容易,因為這需要對Oracle SQL內(nèi)部有一個徹底的了解。接下來讓我們從
    整體上來認識 Oracle SQL 優(yōu)化。

2、Oracle SQL 優(yōu)化器
    Oracle DBA首先要查看的是當前數(shù)據(jù)庫缺省的優(yōu)化器模式。Oracle初始化參數(shù)提供很多基于成本優(yōu)化的優(yōu)化器模式以及之前廢棄的基于規(guī)則
    的優(yōu)化器模式(或hint)供選擇?;诔杀镜膬?yōu)化器主要依賴于表對象使用analyze命令收集的統(tǒng)計信息。Oracle根據(jù)表上的統(tǒng)計信息得以決定
    并為當前的SQL生成最高效的執(zhí)行計劃。需要注意的是在一些場合基于成本優(yōu)化器可能會做出不正確的決定?;诔杀镜膬?yōu)化器在不斷的改進,
    但是依然有很多場合使用基于規(guī)則的優(yōu)化器能夠使得查詢更高效。

    在Oracle 10g之前,Oracle 缺省的優(yōu)化器模式是CHOOSE模式。在該模式下,如果表對象上缺乏統(tǒng)計信息則此時Oracle使用基于規(guī)則的優(yōu)化
    器;如果統(tǒng)計信息存在則使用基于成本的優(yōu)化器。使用CHOOSE模式存在的隱患即是對一些復雜得查詢有些對象上有統(tǒng)計信息,而另一些對象
    缺乏統(tǒng)計信息。

    在Oracle 10g開始,缺省的優(yōu)化器模式是 ALL_ROWS,這有助于全表掃描優(yōu)于索引掃描。ALL_ROWS優(yōu)化器模式被設(shè)計成最小化計算資源且有
    助于全表掃描。索引掃描(first_rows_n)增加了額外的I/O開銷。但是他們能更快地返回數(shù)據(jù)。

因此,大多數(shù)OLTP系統(tǒng)選擇first_rows,first_rows_100 或者 first_rows_10以使得Oracle使用索引掃描來減少讀塊數(shù)量。

    注意:從Oracle 9i R2開始,Oracle 性能調(diào)整指導指出了first_rows 優(yōu)化器模式已經(jīng)被廢棄,且使用first_rows_n代替

    當僅有一些表包含CBO統(tǒng)計信息,而另一些缺乏統(tǒng)計信息時,Oracle使用基于成本的優(yōu)化模式來預估其他表在運行時的統(tǒng)計信息(即動態(tài)采樣
    ),這在很大程度上影響單個查詢性能下降。

    總之,Oracle 數(shù)據(jù)庫管理員應當總是將嘗試改變優(yōu)化器模式作為SQL tuning的第一步。Oracle SQL tuning的首要原則是避免可怕的全表掃
    描。一個特性之一是一個非高效的SQL語句為提高查詢性能使用所有的索引此仍然為一個失敗的SQL語句。

    當然,有些時候使用全表掃描是合適的,尤其是在做聚合操作象sum,avg等操作,因為為了獲得結(jié)果,表上的絕大部分數(shù)據(jù)行必須被讀入到
    緩存。SQL tuning 高手應當合理的評估每一個全表掃描并要核實使用索引能否提高性能。

    在大多數(shù)Oracle 系統(tǒng),SQL語句檢索的僅僅是表上數(shù)據(jù)一個子集。Oracle 優(yōu)化器會檢查使用索引是否會導致更多的I/O。然而,如果構(gòu)建了
    一個低效的查詢,基于成本的優(yōu)化器難以選擇最佳的數(shù)據(jù)訪問路徑,轉(zhuǎn)而傾向于使用全表掃描。故Oracle數(shù)據(jù)庫管理員應當總是審查那些走
    全表掃描的SQL語句。

    更多有關(guān)全表掃描的問題,以及選擇正確的優(yōu)化模式請 :"Oracle Tuning: The Definitive Reference"

三、SQL 調(diào)整戰(zhàn)略步驟
    很多人問SQL tuning從哪里著手。首先應當是從Library cache去根據(jù)他們的活動狀況捕獲SQL語句。

1、尋找影響較大的SQL語句
    我們可以根據(jù)SQL語句執(zhí)行次數(shù)的多少進行排序來獲得執(zhí)行次數(shù)較多的SQL語句。在v$sqlarea視圖中executions 列以及表stats$sql_summary
    或 dba_hist_sql_summary 能夠去定位當前最頻繁使用的SQL語句。注:也可以按照下列方式列出SQL語句。
        Rows processed
            處理的行數(shù)越多,則相應會有很高的I/O,也有可能耗用大量的臨時表空間

        Buffer gets
            Buffer gets過高可能表明資源被過度集中化查詢,存在熱塊現(xiàn)象

        Disk reads
            高的磁盤讀將引起過度的I/O

        Memory KB
            內(nèi)存的分配大小可以鑒別該SQL語句是否在內(nèi)存中使用了大量的表連接

        CPU secs
            CPU的開銷表明哪些SQL語句耗用了大量的CPU資源

        Sorts
            排序越多,則SQL性能越差,而且會占用大量的臨時表空間

        Executions
            執(zhí)行次數(shù)表明了當前SQL語句的頻繁度,應當被首先考慮調(diào)整,因為這些語句影響了數(shù)據(jù)庫的整體性能

2、決定SQL的執(zhí)行計劃
    每一個SQL語句都可以根據(jù)SQL_ID來獲得其執(zhí)行計劃。有大量的第三方工具來獲得SQL語句的執(zhí)行計劃。而獲得執(zhí)行最常用的方式是使用Oracle
    自帶的explain plan程序。通過使用該程序,Oracle DBA能夠在不執(zhí)行SQL 語句的情形下解析并顯示該SQL語句的執(zhí)行計劃。

    查看SQL執(zhí)行計劃的輸出,必須首先創(chuàng)建一個plan table. Oracle提供一個utlxplan.sql腳本來創(chuàng)建該表。執(zhí)行該腳本并且為該表創(chuàng)建一個
    公共同義詞。

    sqlplus > @utlxplan
    Table created.

    sqlplus > create public synonym plan_table for sys.plan_table;
    Synonym created.

    大多數(shù)關(guān)系數(shù)據(jù)庫使用解釋程序?qū)QL語句作為輸入,然后運行SQL優(yōu)化器,輸出訪問的路徑信息到一個plan_table。以便我們能夠查看及調(diào)
    整其訪問方式。下面的是一個復雜的SQL查詢。

    EXPLAIN PLAN SET STATEMENT_ID = 'test1' FOR
    SET STATEMENT_ID = 'RUN1'
    INTO plan_table
    FOR
    SELECT   'T'||plansnet.terr_code, 'P'||detplan.pac1
    || detplan.pac2 || detplan.pac3, 'P1', sum(plansnet.ytd_d_ly_tm),
     sum(plansnet.ytd_d_ty_tm),
     sum(plansnet.jan_d_ly),
     sum(plansnet.jan_d_ty),
    FROM plansnet, detplan
    WHERE
        plansnet.mgc = detplan.mktgpm
    AND
        detplan.pac1 in ('N33','192','195','201','BAI',
        'P51','Q27','180','181','183','184','186','188',
        '198','204','207','209','211')
    GROUP BY 'T'||plansnet.terr_code, 'P'||detplan.pac1 || detplan.pac2 || detplan.pac3;

    這個語法使用管道輸入到SQL優(yōu)化器,解析SQL,存儲執(zhí)行計劃信息到表plan_table,且RUN1作為鑒別當前SQL語句的標識符。注意,該查詢
    并沒有執(zhí)行,它僅僅是創(chuàng)建了一個內(nèi)部訪問信息且輸出到plan_table。plan 表包含下列字段。

        operation
            表明當前語句完成的操作,通常包括table access, table merge, sort, or index operation

        options
            補充說明operation,像full table, range table, join

        object_name
            查詢組件的名字

        Process ID
            查詢組件的ID號

        Parent_ID
            查詢組建的父ID,注意,有些查詢會有一個相同的父ID

    現(xiàn)在plan_table已經(jīng)被填充,可以使用下面的查詢來查看當前SQL語句的執(zhí)行計劃。

        plan.sql - displays contents of the explain plan table
        SET PAGES 9999;
        SELECT  lpad(' ',2*(level-1))||operation operation,
                options,
                object_name,
                position
        FROM plan_table
        START WITH id=0
        AND
        statement_id = 'RUN1'
        CONNECT BY prior id = parent_id
        AND
        statement_id = 'RUN1';

    下面給出了當前語句執(zhí)行計劃信息以及各個部分的執(zhí)行順序。
    SQL> @list_explain_plan

    OPERATION
    -------------------------------------------------------------------------------------
    OPTIONS                           OBJECT_NAME                    POSITION
    ------------------------------ -------------------------------------------------------
    SELECT STATEMENT
    SORT
    GROUP BY                                                      1
           CONCATENATION                                   1
    NESTED LOOPS                                    1
    TABLE ACCESS FULL         PLANSNET                   1
    TABLE ACCESS BY ROWID     DETPLAN                    2
              INDEX RANGE SCAN       DETPLAN_INDEX5             1
    NESTED LOOPS

    從上面的執(zhí)行計劃中得知當前的SQL語句存在表掃描現(xiàn)象。去調(diào)整該SQL語句,我們應當尋找表where 子句中為planset上的列。在這里我們
    看到了在where子句存在一個且屬于表planset上的列mgc被用作連接條件。這說明一個基于表planset.mgs列上的索引是必要的。

    plan table并不能展現(xiàn)整個SQL語句的細節(jié),但對于獲得數(shù)據(jù)訪問路徑是非常有用的。SQL優(yōu)化器知道每一個表的行數(shù)(基數(shù))以及一些索引字
    段的狀況。但并不了解數(shù)據(jù)的分布象如一個組件期待返回的行數(shù)。

3、調(diào)整SQL語句
    對于那些存在可優(yōu)化的子執(zhí)行計劃,SQL應當按照下面的方式進行調(diào)整。

    通過添加提示來修改SQL的執(zhí)行計劃

    使用全局臨時表來重寫SQL

    使用PL/SQL來重寫SQL。對于一些特定查詢該方法能夠有20倍左右的提升。將這些SQL封裝到包含存儲過程的包中去完成查詢。

    使用提示來調(diào)整SQL

    大多數(shù)SQL tuning工具中使用較多的莫過于使用提示。一個提示添加的SQL語句后使得SQL查詢的按指定路徑訪問。

    Troubleshooting tip! 
    為便于測試,我們能夠隨時使用alter session命令來修改一個優(yōu)化參數(shù)的值來觀察調(diào)整前后的結(jié)果比較。使用新的 opt_param 提示能獲得
    同樣的效果。

    select /*+ opt_param('optimizer_mode','first_rows_10') */ col1, col2 . . .
    select /*+ opt_param('optimizer_index_cost_adj',20) */ col1, col2 . .

    Oracle 發(fā)布了大量的SQL提示,而且提示隨著Oracle版本的不同不斷的增強和復雜化。

    注意:提示通常用于調(diào)試SQL,最佳的辦法是調(diào)整優(yōu)化器的統(tǒng)計信息使的CBO模式自動獲取最佳執(zhí)行路徑,等同于使用提示的功能。
    我們來看看提高性能最常用的提示

        Mode hints:  first_rows_10, first_rows_100
        Oracle leading and ordered hints  Also see how to tune table join order with histograms

        Dynamic sampling: dynamic_sampling

        Oracle SQL undocumented tuning hints - Guru's only
        The cardinality hint    

    表連接順序
        當表連接的順序可優(yōu)化時,我們可以使用 ORDERED提示來強制表按照from子句中出現(xiàn)的先后順序來進行連接

    first_rows_n提示
        Oracle 有兩個基于成本優(yōu)化的提示,一個是first_rows_n,一個是all_rows。first_rows模式將盡可能在一查詢到數(shù)據(jù)時就返回個客
        戶端。而 all_rows 模式則為優(yōu)化資源而設(shè)計,需要等到所有結(jié)果計算執(zhí)行完畢才返回數(shù)據(jù)給客戶端。

        SELECT /*+ first_rows */

4、案例
    同一個SQL語句有不同的寫法。即簡單的SQL查詢能夠以不同的方式來產(chǎn)生相同的結(jié)果集,但其執(zhí)行效率和訪問方式則千差萬別。

    下面的例子中的SQL語句使用了3種不同的寫法來返回相同的結(jié)果

    A standard join:  -->標準連接

    SELECT *
    FROM STUDENT, REGISTRATION
    WHERE
        STUDENT.student_id = REGISTRATION.student_id
    AND
        REGISTRATION.grade = 'A';

    A nested query:  -->嵌套查詢

    SELECT *
    FROM STUDENT
    WHERE
        student_id =
        (SELECT student_id
            FROM REGISTRATION
            WHERE
           grade = 'A'
        );

    A correlated subquery:  -->相關(guān)子查詢

    SELECT *
    FROM STUDENT
    WHERE
        0
        (SELECT count(*)
            FROM REGISTRATION
            WHERE
            grade = 'A'
            AND
            student_id = STUDENT.student_id
        );

    我們應該根據(jù)基本的SQL原則來優(yōu)化當前的SQL語句。

5、書寫高效SQL語句的技巧
        下面給出一些編寫高效SQL語句的總的指導原則,而不論Oracle優(yōu)化器選擇何種優(yōu)化模式。這些看是簡單的方式但是按照他們
    去做將收到事半功倍的效果(已經(jīng)在實踐中被證實)。

    a.使用臨時表重寫復雜的子查詢
        Oracle 使用全局臨時表以及WITH操作符去解決那些復雜的SQL子查詢。尤其是那些where子句中的子查詢,SELECT 字句標量子查詢,
        FROM 子句的內(nèi)聯(lián)視圖。使用臨時表實現(xiàn)SQL tuning(以及使用WITH的物化視圖)能夠使得性能得以驚人的提升。

    b.使用MINUS 代替EXIST子查詢
        使用MINUS操作代替NOT IN 或NOT EXISTS將產(chǎn)生更高效的執(zhí)行計劃(譯者按:此需要測試)。

    c.使用SQL分析函數(shù)
        Oracle 分析函數(shù)能夠一次提取數(shù)據(jù)來做多維聚合運算(象ROLLUP,CUBE)以提高性能。

    d.重寫NOT EXISTS和查詢作為外部連接NOT EXISTS 子查詢
        在一些案例中的NOT 查詢(where 中一個列被定義為NULL值),能夠?qū)⑵涓膶戇@個非相關(guān)子查詢到IS NULL 的外部鏈接。如下例:
        select book_key from book
        where
        book_key NOT IN (select book_key from sales);

        下面我們在where子句中使用了外部連接來替代原來的not exits,得到一個更高效的執(zhí)行計劃。

        select b.book_key from book b, sales s
        where
           b.book_key = s.book_key(+)
        and
           s.book_key IS NULL;

    e.索引NULL值列
        如果你的SQL語句頻繁使用到NULL值,應當考慮基于NULL值創(chuàng)建索引。為使該查詢最優(yōu)化,可以創(chuàng)建一個使用基于NULL值索引函數(shù)。
        (譯者按,如 create index i_tb_col on tab(nvl(col,null)); create index i_tb_col on tab(col,0);)

    f.避免基于索引的運算
        不要基于索引列做任何運算,除非你創(chuàng)建了一個相應的索引函數(shù)。或者重設(shè)設(shè)計列以使得where子句列上的謂詞不需要轉(zhuǎn)換。
        -->下面都是低效的SQL寫法
        where salary*5            > :myvalue   
        where substr(ssn,7,4)     = "1234"
        where to_char(mydate,mon) = "january"

    g.避免使用NOT IN 和HAVING 
        在合適的時候使用not exists子查詢更高效。

    h.避免使用LIKE謂詞
        在合適地時候,如果能夠使用 = 運算應盡可能避免LIKE操作。

    i.避免數(shù)據(jù)類型轉(zhuǎn)換
        如果一個where 子句列是數(shù)字型,則不要使用引號。而對一個字符索引列,總是使用引號。下面是數(shù)據(jù)類型混用的情形。
        where cust_nbr = "123"
        where substr(ssn,7,4) = 1234

    j.使用decode與case
        使用decode 與case 函數(shù)能夠最小化查詢表的次數(shù)。

    k.不要害怕全表掃描
        并不是所有的OLTP系統(tǒng)在使用索引時是最優(yōu)化的。如果你的查詢返回了表中的絕大部分數(shù)據(jù),則全表掃描性能優(yōu)于索引掃描。這取決于
        一些因素包括你的配置(db_file_multiblock_read_count, db_block_size),并行查詢,以及表塊和索引塊在buffer cache中的數(shù)量。

    l.使用別名
        在參照列的地方總是使用表別名。
    --> Author : Robinson Cheng
    --> Blog   : http://blog.csdn.net/robinson_0612

您可能感興趣的文章:
  • Oracle 表三種連接方式使用介紹(sql優(yōu)化)
  • oracle數(shù)據(jù)庫sql的優(yōu)化總結(jié)
  • oracle下一條SQL語句的優(yōu)化過程(比較詳細)
  • Oracle SQL性能優(yōu)化系列學習一
  • Oracle SQL性能優(yōu)化系列學習二
  • Oracle SQL性能優(yōu)化系列學習三
  • ORACLE SQL語句優(yōu)化技術(shù)要點解析

標簽:六安 海北 宜春 淮南 葫蘆島 孝感 酒泉 泰安

巨人網(wǎng)絡通訊聲明:本文標題《Oracle SQL tuning 數(shù)據(jù)庫優(yōu)化步驟分享(圖文教程)》,本文關(guān)鍵詞  Oracle,SQL,tuning,數(shù)據(jù)庫,優(yōu)化,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Oracle SQL tuning 數(shù)據(jù)庫優(yōu)化步驟分享(圖文教程)》相關(guān)的同類信息!
  • 本頁收集關(guān)于Oracle SQL tuning 數(shù)據(jù)庫優(yōu)化步驟分享(圖文教程)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产欧美日韩中文字幕| 97在线视频免费| 欧美午夜一区二区三区免费大片| 在线免费观看一区二区| 亚洲一级生活片| 18国产免费视频| 久久精品首页| 香蕉国产成人午夜av影院| 老牛精品亚洲成av人片| 久久午夜夜伦鲁鲁一区二区| 欧美不卡一区二区三区四区| 欧美激情777| 动漫精品一区二区| 日本在线一区二区三区| jjzzjjzz欧美69巨大| 欧美精品一区二区三区三州| 成年在线电影| 国产欧美二区| 亚洲一二区在线| 国产a∨精品一区二区三区仙踪林| 一个人看的www在线免费观看| 欧美大片免费高清观看| 成人一级片网站| 日韩欧美国产高清| 久热久精久品这里在线观看| 一区二区三区四区在线免费观看| 5g国产欧美日韩视频| 黄色激情视频网址| 日韩有吗在线观看| 欧洲日本亚洲国产区| 国产精品一区二区3区| 亚洲日本一区二区三区| 亚洲国产精品狼友在线观看| 亚洲专区一二三| 国产日产精品一区二区三区四区的观看方式| 韩国国内大量揄拍精品视频| 丝袜美腿亚洲色图| 五月天色婷婷综合| 可以在线观看的av网站| 91精品在线观看入口| 国产中文一区| 日本不卡一区二区三区四区| 在线视频福利一区| 日韩女优av电影| 在线观看免费黄色片| 日韩一区二区三区资源| 欧美精品在线观看| 欧美肥老妇视频| 久久精品一二三四| 欧美午夜视频在线观看| 国产精品一卡二卡三卡| 在线免费观看色| 亚洲精品午夜| 伊人久久大香线蕉综合四虎小说| 两根大肉大捧一进一出好爽视频| 欧洲一区在线电影| 全网国产福利在线播放| 69精品无码成人久久久久久| 黄色国产在线观看| 国产国产国产国产国产国产| 欧美精品自拍偷拍动漫精品| 一本大道av一区二区在线播放| 岛国电影中文在线| 欧美精品久久久久久久久25p| 五月天精品一区二区三区| 手机在线观看av| 成人国产精品免费观看| 欧美黑人巨大精品一区二区| 91视频精品在这里| 国产精品嫩草影院com| 免费不卡中文字幕在线| 粉嫩av一区二区三区免费观看| 亚洲欧美自拍偷拍色图| 久久亚洲私人国产精品va媚药| 亚洲电影免费观看高清完整版在线观看| 青青草视频在线免费直播| 成人精品在线| 不卡的电视剧免费网站有什么| 国产黄色激情视频| 国产精品自在在线| 日本在线播放一区二区| 国产有码一区二区| 在线一区二区三区精品| 久久亚洲AV成人无码国产野外| 最美情侣韩剧在线播放| 国产亚洲欧美中文| 国产亚洲欧美另类中文| 精品视频在线免费看| 精品sm在线观看| 精品国产一区二区三区在线| 欧美xxxxxxxx| 亚洲靠逼com| 欧美精品播放| 国产成人8x视频一区二区| 亚洲国产综合色| 精品一区二区三区蜜桃| 最近国产精品视频| 中国黄色在线视频| 媚黑女一区二区| 亚洲精品电影| 精品精品国产高清一毛片一天堂| 欧美日韩亚洲一二三| 日韩精品在线免费观看视频| 欧美日韩国产免费| 欧美人与禽猛交乱配| av一区二区三区| 欧美一级二级视频| 91成品人影院| 国产精品一区二区久久| 7777精品伊久久久大香线蕉语言| 九九热国产视频| 国产精品一级视频| 国产美女在线看| 一二三在线视频社区| 久久精品国产99久久6| 免费无码国产v片在线观看| 美女喷水网站| 日韩jizzz| 免费污污网站| 91av在线精品| 不卡区在线中文字幕| 51久久精品夜色国产麻豆| 国产精品久久久一区二区三区| 国产精品欧美激情在线观看| 国产超碰在线观看| 亚洲国产小视频在线观看| 亚洲人亚洲人色久| 亚洲福利av在线| 男女啪啪999亚洲精品| 日韩av不卡一区二区| 麻豆国产精品一区二区三区| 国产欧美一区二区三区网站| 国内精品免费在线观看| 粉色视频免费看| 三上悠亚在线一区二区| 久久久精品人妻一区二区三区| 国产99在线免费| 国产成人精品视频ⅴa片软件竹菊| 中文字幕在线网| 无码中文字幕色专区| 日韩精品系列| 三级av在线免费观看| 日本一区二区三区免费视频| 欧美国产极品| 九九热播视频在线精品6| 国产一区视频免费观看| 日韩欧美一区二区三区免费看| 亚洲动漫在线观看| 国产主播在线播放| 日韩欧美激情一区| 国产欧美一区二区精品婷婷| 国产精品超碰97尤物18| 亚洲欧美在线视频免费| 51成人做爰www免费看网站| 97欧美在线视频| 成人动漫视频在线观看免费| 国产欧美一区二区在线观看| 亚洲free性xxxx护士白浆| 91精品国产综合久久久久久久久| 欧美日本另类xxx乱大交| 岛国av一区二区在线在线观看| 欧美大胆一级视频| 国产成人午夜视频网址| 91福利国产在线观看菠萝蜜| 8888四色奇米在线观看| 日韩不卡的av| 亚洲成人男人天堂| 日韩美女视频中文字幕| 国产乱码午夜在线视频| 久久国产成人午夜av影院宅| **欧美日韩vr在线| 欧美少妇在线观看| 国产欧美综合一区| 免费一级欧美在线大片| 伊人亚洲综合网| 拍拍拍在线观看视频免费| 亚洲免费影视第一页| 国产亚洲一区精品| 在线亚洲欧美| 欧美久久久久久久久久久久| 日本一区二区三区视频在线| 超碰在线国产| 国产精品免费在线视频| 国产一区二区三区黄网站| 国产小视频免费| 久久久久黄色片| 欧美一级在线播放| 成人av资源站| 久久一日本道色综合| 超碰激情在线| 欧美激情第六页| 成都免费高清电影| 国产呦精品一区二区三区网站| 日韩成年人视频| 日韩美女国产精品| 国产欧美日韩综合一区在线播放| 香港三级经典全部种子下载| 国产+高潮+白浆+无码| 69av视频在线播放| 一区二区三区我不卡| 最新中文在线视频| 99久久精品免费视频| wwww在线观看免费视频| 成人午夜视频精品一区| 精品国产乱码久久久久酒店| 综合国产第二页| 精品制服美女久久| 欧美精品一区二区三区高清aⅴ| 91精品视频专区| 亚洲视频日韩| 国产麻豆精品视频| 免费看精品久久片| 欧美精品xxxxbbbb| 国产一级大片| 3d动漫精品啪啪一区二区三区免费| 91激情视频| 精品一区二区三区四区五区| 欧美国产精品va在线观看| 国产在线xxxx| 国产性xxxx高清| 8x8x视频在线| 一个色综合网站| 欧美精品xxxxbbbb| julia京香一区二区三区| 91国模少妇一区二区三区| 色哟哟精品视频| 欧美 变态 另类 人妖| 国产一级免费观看| 欧美一区二区三区另类| 亚洲第一综合色| 成人在线手机视频| 欧美一区二区三区影院| 亚洲精品自拍第一页| 手机av免费观看| 三级国产在线观看| 欧美日韩精品久久| 宅男视频免费在线观看视频| 精灵使的剑舞无删减版在线观看| 久久99国产精品免费| 欧美老肥妇做.爰bbww| 亚洲小说欧美另类婷婷| 日韩精品一区二区三区国语自制| 欧美日本韩国国产| 日本一本草久在线中文| 九色视频网站入口| 在线看一级片| 国产高清不卡一区二区| 国产精品入口免费软件| 99久久免费视频.com| 成人免费短视频| 吉吉日韩欧美| 日韩精品亚洲专区在线观看| 浮力影院欧美三级日本三级| 日韩精品成人| 三级毛片网站| 一本色道综合久久欧美日韩精品| 91极品尤物在线播放国产| 欧美一区二区性放荡片| 久久一区激情| 日本激情视频网站| 欧美日韩一区二区国产| 91色在线视频| 成人欧美在线| 国产三级香港三韩国三级| 成人黄色片视频网站| 国产一区二区三区在线观看网站| 亚洲人成网站色ww在线| 亚洲精品1234| 午夜激情视频网| 日韩欧美精品在线不卡| 亚洲综合一区在线| 亚洲综合另类小说| 99福利在线观看| 亚洲激情精品| 激情五月婷婷网| 国产精品国产a| www国产成人免费观看视频 深夜成人网| 精品久久久三级丝袜| 欧美日韩久久久久久| 99精品国产99久久久久久白柏| 国产成人av一区二区三区在线| 国产成人在线视频免费播放| 亚洲ai欧洲av| 国产精品短视频| 2023国产一二三区日本精品2022| 久久久99精品视频| 亚洲自拍偷拍网址| 116极品美女视频在线观看| 国产性生活毛片| 天堂网2014av| 欧美顶级少妇做爰| 毛片基地网站| 一本二本三本亚洲码| 成色在线视频| 中文字幕无码乱码人妻日韩精品| 白浆视频在线观看| 精品久久久久久中文字幕人妻最新| 51视频国产精品一区二区| a视频在线免费看| 日韩视频一区二区在线观看| 粉嫩一区二区三区四区公司1| 一本色道综合亚洲| 国产三区二区一区久久| 亚洲精品tv久久久久久久久久| 成人日韩在线观看| 中文字幕在线直播| 亚洲一区在线不卡| 国产福利精品一区二区三区| 久久精品女同亚洲女同13| 国产人妻精品久久久久野外| eeuss鲁丝片eeuss影院| 日韩精品免费一区二区在线观看| 亚洲欧美日韩系列| 初尝黑人巨炮波多野结衣电影| 国产精品无码永久免费888| 欧美日韩美女在线| 国产精品久久天天影视| 一级黄色在线| 国产精品久久久久久影院8一贰佰| 蜜桃av在线播放| 2025韩国大尺度电影| 91精品一区二区三区在线观看| 亚洲国产日韩一级| 99久久精品免费精品国产| 午夜视频www| 中文字幕久热精品视频在线| 制服丝袜国产精品| 国产精品一区二区久久不卡|