當前位置:首頁 » 編程語言 » oracle高性能sql引擎剖析pdf
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

oracle高性能sql引擎剖析pdf

發布時間: 2022-08-11 20:13:14

❶ 關於oracle PLsql

PL/SQL是ORACLE對標准資料庫語言的擴展,ORACLE公司已經將PL/SQL整合到ORACLE 伺服器和其他工具中了,近幾年中更多的開發人員和DBA開始使用PL/SQL,本文將講述PL/SQL基礎語法,結構和組件、以及如何設計並執行一個PL/SQL程序。

PL/SQL的優點

從版本6開始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的優點以及其獨有的數據管理的便利性,那麼你很難想像ORACLE缺了PL/SQL的情形。PL/SQL 不是一個獨立的產品,他是一個整合到ORACLE伺服器和ORACLE工具中的技術,可以把PL/SQL看作ORACLE伺服器內的一個引擎,sql語句執行者處理單個的sql語句,PL/SQL引擎處理PL/SQL程序塊。當PL/SQL程序塊在PL/SQL引擎處理時,ORACLE伺服器中的SQL語句執行器處理pl/sql程序塊中的SQL語句。

PL/SQL的優點如下:

. PL/SQL是一種高性能的基於事務處理的語言,能運行在任何ORACLE環境中,支持所有數據處理命令。通過使用PL/SQL程序單元處理SQL的數據定義和數據控制元素。

. PL/SQL支持所有SQL數據類型和所有SQL函數,同時支持所有ORACLE對象類型

. PL/SQL塊可以被命名和存儲在ORACLE伺服器中,同時也能被其他的PL/SQL程序或SQL命令調用,任何客戶/伺服器工具都能訪問PL/SQL程序,具有很好的可重用性。

. 可以使用ORACLE數據工具管理存儲在伺服器中的PL/SQL程序的安全性。可以授權或撤銷資料庫其他用戶訪問PL/SQL程序的能力。

. PL/SQL代碼可以使用任何ASCII文本編輯器編寫,所以對任何ORACLE能夠運行的操作系統都是非常便利的

. 對於SQL,ORACLE必須在同一時間處理每一條SQL語句,在網路環境下這就意味作每一個獨立的調用都必須被oracle伺服器處理,這就佔用大量的伺服器時間,同時導致網路擁擠。而PL/SQL是以整個語句塊發給伺服器,這就降低了網路擁擠。

PL/SQL塊結構

PL/SQL是一種塊結構的語言,組成PL/SQL程序的單元是邏輯塊,一個PL/SQL 程序包含了一個或多個邏輯塊,每個塊都可以劃分為三個部分。與其他語言相同,變數在使用之前必須聲明,PL/SQL提供了獨立的專門用於處理異常的部分,下面描述了PL/SQL塊的不同部分:

聲明部分(Declaration section)

聲明部分包含了變數和常量的數據類型和初始值。這個部分是由關鍵字DECLARE開始,如果不需要聲明變數或常量,那麼可以忽略這一部分;需要說明的是游標的聲明也在這一部分。

執行部分(Executable section)

執行部分是PL/SQL塊中的指令部分,由關鍵字BEGIN開始,所有的可執行語句都放在這一部分,其他的PL/SQL塊也可以放在這一部分。

異常處理部分(Exception section)

這一部分是可選的,在這一部分中處理異常或錯誤,對異常處理的詳細討論我們在後面進行。

PL/SQL塊語法

[DECLARE]
---declaration statements
BEGIN
---executable statements
[EXCEPTION]
---exception statements
END

PL/SQL塊中的每一條語句都必須以分號結束,SQL語句可以使多行的,但分號表示該語句的結束。一行中可以有多條SQL語句,他們之間以分號分隔。每一個PL/SQL塊由BEGIN或DECLARE開始,以END結束。注釋由--標示。

PL/SQL塊的命名和匿名

PL/SQL程序塊可以是一個命名的程序塊也可以是一個匿名程序塊。匿名程序塊可以用在伺服器端也可以用在客戶端。

命名程序塊可以出現在其他PL/SQL程序塊的聲明部分,這方面比較明顯的是子程序,子程序可以在執行部分引用,也可以在異常處理部分引用。

PL/SQL程序塊可背獨立編譯並存儲在資料庫中,任何與資料庫相連接的應用程序都可以訪問這些存儲的PL/SQL程序塊。ORACLE提供了四種類型的可存儲的程序:

. 函數

. 過程

. 包

. 觸發器

函數

函數是命名了的、存儲在資料庫中的PL/SQL程序塊。函數接受零個或多個輸入參數,有一個返回值,返回值的數據類型在創建函數時定義。定義函數的語法如下:

FUNCTION name [{parameter[,parameter,...])] RETURN datatypes IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers]
END [name]

過程

存儲過程是一個PL/SQL程序塊,接受零個或多個參數作為輸入(INPUT)或輸出(OUTPUT)、或既作輸入又作輸出(INOUT),與函數不同,存儲過程沒有返回值,存儲過程不能由SQL語句直接使用,只能通過EXECUT命令或PL/SQL程序塊內部調用,定義存儲過程的語法如下:

PROCEDURE name [(parameter[,parameter,...])] IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers ]
END [name]

包(package)

包其實就是被組合在一起的相關對象的集合,當包中任何函數或存儲過程被調用,包就被載入入內存中,包中的任何函數或存儲過程的子程序訪問速度將大大加快。
包由兩個部分組成:規范和包主體(body),規范描述變數、常量、游標、和子程序,包體完全定義子程序和游標。

觸發器(trigger)

觸發器與一個表或資料庫事件聯系在一起的,當一個觸發器事件發生時,定義在表上的觸發器被觸發。

變數和常量

變數存放在內存中以獲得值,能被PL/SQL塊引用。你可以把變數想像成一個可儲藏東西的容器,容器內的東西是可以改變的。

聲明變數

變數一般都在PL/SQL塊的聲明部分聲明,PL/SQL是一種強壯的類型語言,這就是說在引用變數前必須首先聲明,要在執行或異常處理部分使用變數,那麼變數必須首先在聲明部分進行聲明。

聲明變數的語法如下:

Variable_name [CONSTANT] databyte [NOT NULL][:=|DEFAULT expression]

注意:可以在聲明變數的同時給變數強制性的加上NOT NULL約束條件,此時變數在初始化時必須賦值。

給變數賦值

給變數賦值有兩種方式:

. 直接給變數賦值

X:=200;
Y=Y+(X*20);

. 通過SQL SELECT INTO 或FETCH INTO給變數賦值

SELECT SUM(SALARY),SUM(SALARY*0.1)
INTO TOTAL_SALARY,TATAL_COMMISSION
FROM EMPLOYEE
WHERE DEPT=10;

常量

常量與變數相似,但常量的值在程序內部不能改變,常量的值在定義時賦予,,他的聲明方式與變數相似,但必須包括關鍵字CONSTANT。常量和變數都可被定義為SQL和用戶定義的數據類型。

ZERO_VALUE CONSTANT NUMBER:=0;

這個語句定了一個名叫ZERO_VALUE、數據類型是NUMBER、值為0的常量。

標量(scalar)數據類型

標量(scalar)數據類型沒有內部組件,他們大致可分為以下四類:

. number
. character
. date/time
. boolean

表1顯示了數字數據類型;表2顯示了字元數據類型;表3顯示了日期和布爾數據類型。

表1 Scalar Types:Numeric

Datatype
Range
Subtypes
description

BINARY_INTEGER
-214748-2147483647
NATURAL
NATURAL
NPOSITIVE
POSITIVEN
SIGNTYPE
用於存儲單位元組整數。
要求存儲長度低於NUMBER值。
用於限制范圍的子類型(SUBTYPE):
NATURAL:用於非負數
POSITIVE:只用於正數
NATURALN:只用於非負數和非NULL值
POSITIVEN:只用於正數,不能用於NULL值
SIGNTYPE:只有值:-1、0或1.

NUMBER
1.0E-130-9.99E125
DEC
DECIMAL
DOUBLE
PRECISION
FLOAT
INTEGERIC
INT
NUMERIC
REAL
SMALLINT
存儲數字值,包括整數和浮點數。可以選擇精度和刻度方式,語法:
number[([,])]。
預設的精度是38,scale是0.

PLS_INTEGER
-2147483647-2147483647

與BINARY_INTEGER基本相同,但採用機器運算時,PLS_INTEGER提供更好的性能 。

表2 字元數據類型

datatype
rang
subtype
description

CHAR
最大長度32767位元組
CHARACTER
存儲定長字元串,如果長度沒有確定,預設是1

LONG
最大長度2147483647位元組

存儲可變長度字元串

RAW
最大長度32767位元組

用於存儲二進制數據和位元組字元串,當在兩個資料庫之間進行傳遞時,RAW數據不在字元集之間進行轉換。

LONGRAW
最大長度2147483647

與LONG數據類型相似,同樣他也不能在字元集之間進行轉換。

ROWID
18個位元組

與資料庫ROWID偽列類型相同,能夠存儲一個行標示符,可以將行標示符看作資料庫中每一行的唯一鍵值。

VARCHAR2
最大長度32767位元組
STRINGVARCHAR
與VARCHAR數據類型相似,存儲可變長度的字元串。聲明方法與VARCHAR相同

表3 DATE和BOOLEAN

datatype
range
description

BOOLEAN
TRUE/FALSE
存儲邏輯值TRUE或FALSE,無參數

DATE
01/01/4712 BC
存儲固定長的日期和時間值,日期值中包含時間

❷ 怎麼使用 基於oracle的sql優化

(1) 選擇最有效率的表名順序(只在基於規則的優化器中有效):
ORACLE的解析器按照從右到左的順序處理FROM子句中的表名,FROM子句中寫在最後的表(基礎表 driving table)將被最先處理,在FROM子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表。如果有3個以上的表連接查詢, 那就需要選擇交叉表(intersection table)作為基礎表, 交叉表是指那個被其他表所引用的表.
(2) WHERE子句中的連接順序.:
ORACLE採用自下而上的順序解析WHERE子句,根據這個原理,表之間的連接必須寫在其他WHERE條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾.
(3) SELECT子句中避免使用 『 * 『:
ORACLE在解析的過程中, 會將'*' 依次轉換成所有的列名, 這個工作是通過查詢數據字典完成的, 這意味著將耗費更多的時間
(4) 減少訪問資料庫的次數:
ORACLE在內部執行了許多工作: 解析SQL語句, 估算索引的利用率, 綁定變數 , 讀數據塊等;
(5) 在SQL*Plus , SQL*Forms和Pro*C中重新設置ARRAYSIZE參數, 可以增加每次資料庫訪問的檢索數據量 ,建議值為200
(6) 使用DECODE函數來減少處理時間:
使用DECODE函數可以避免重復掃描相同記錄或重復連接相同的表.
(7) 整合簡單,無關聯的資料庫訪問:
如果你有幾個簡單的資料庫查詢語句,你可以把它們整合到一個查詢中(即使它們之間沒有關系)
(8) 刪除重復記錄:
最高效的刪除重復記錄方法 ( 因為使用了ROWID)例子:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
(9) 用TRUNCATE替代DELETE:
當刪除表中的記錄時,在通常情況下, 回滾段(rollback segments ) 用來存放可以被恢復的信息. 如果你沒有COMMIT事務,ORACLE會將數據恢復到刪除之前的狀態(准確地說是恢復到執行刪除命令之前的狀況) 而當運用TRUNCATE時, 回滾段不再存放任何可被恢復的信息.當命令運行後,數據不能被恢復.因此很少的資源被調用,執行時間也會很短. (譯者按: TRUNCATE只在刪除全表適用,TRUNCATE是DDL不是DML)
(10) 盡量多使用COMMIT:
只要有可能,在程序中盡量多使用COMMIT, 這樣程序的性能得到提高,需求也會因為COMMIT所釋放的資源而減少:
COMMIT所釋放的資源:
a. 回滾段上用於恢復數據的信息.
b. 被程序語句獲得的鎖
c. redo log buffer 中的空間
d. ORACLE為管理上述3種資源中的內部花費
(11) 用Where子句替換HAVING子句:
避免使用HAVING子句, HAVING 只會在檢索出所有記錄之後才對結果集進行過濾. 這個處理需要排序,總計等操作. 如果能通過WHERE子句限制記錄的數目,那就能減少這方面的開銷. (非oracle中)on、where、having這三個都可以加條件的子句中,on是最先執行,where次之,having最後,因為on是先把不符合條件的記錄過濾後才進行統計,它就可以減少中間運算要處理的數據,按理說應該速度是最快的,where也應該比having快點的,因為它過濾數據後才進行sum,在兩個表聯接時才用on的,所以在一個表的時候,就剩下where跟having比較了。在這單表查詢統計的情況下,如果要過濾的條件沒有涉及到要計算欄位,那它們的結果是一樣的,只是where可以使用rushmore技術,而having就不能,在速度上後者要慢如果要涉及到計算的欄位,就表示在沒計算之前,這個欄位的值是不確定的,根據上篇寫的工作流程,where的作用時間是在計算之前就完成的,而having就是在計算後才起作用的,所以在這種情況下,兩者的結果會不同。在多表聯接查詢時,on比where更早起作用。系統首先根據各個表之間的聯接條件,把多個表合成一個臨時表後,再由where進行過濾,然後再計算,計算完後再由having進行過濾。由此可見,要想過濾條件起到正確的作用,首先要明白這個條件應該在什麼時候起作用,然後再決定放在那裡
(12) 減少對表的查詢:
在含有子查詢的SQL語句中,要特別注意減少對表的查詢.例子:
SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT
TAB_NAME,DB_VER FROM TAB_COLUMNS WHERE VERSION = 604)
(13) 通過內部函數提高SQL效率.:
復雜的SQL往往犧牲了執行效率. 能夠掌握上面的運用函數解決問題的方法在實際工作中是非常有意義的
(14) 使用表的別名(Alias):
當在SQL語句中連接多個表時, 請使用表的別名並把別名前綴於每個Column上.這樣一來,就可以減少解析的時間並減少那些由Column歧義引起的語法錯誤.
(15) 用EXISTS替代IN、用NOT EXISTS替代NOT IN:
在許多基於基礎表的查詢中,為了滿足一個條件,往往需要對另一個表進行聯接.在這種情況下, 使用EXISTS(或NOT EXISTS)通常將提高查詢的效率. 在子查詢中,NOT IN子句將執行一個內部的排序和合並. 無論在哪種情況下,NOT IN都是最低效的 (因為它對子查詢中的表執行了一個全表遍歷). 為了避免使用NOT IN ,我們可以把它改寫成外連接(Outer Joins)或NOT EXISTS.
例子:
(高效)SELECT * FROM EMP (基礎表) WHERE EMPNO > 0 AND EXISTS (SELECT 『X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = 『MELB')
(低效)SELECT * FROM EMP (基礎表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = 『MELB')
(16) 識別'低效執行'的SQL語句:
雖然目前各種關於SQL優化的圖形化工具層出不窮,但是寫出自己的SQL工具來解決問題始終是一個最好的方法:
SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,
ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,
ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,
SQL_TEXT
FROM V$SQLAREA
WHERE EXECUTIONS>0
AND BUFFER_GETS > 0
AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8
ORDER BY 4 DESC;

(17) 用索引提高效率:
索引是表的一個概念部分,用來提高檢索數據的效率,ORACLE使用了一個復雜的自平衡B-tree結構. 通常,通過索引查詢數據比全表掃描要快. 當ORACLE找出執行查詢和Update語句的最佳路徑時, ORACLE優化器將使用索引. 同樣在聯結多個表時使用索引也可以提高效率. 另一個使用索引的好處是,它提供了主鍵(primary key)的唯一性驗證.。那些LONG或LONG RAW數據類型, 你可以索引幾乎所有的列. 通常, 在大型表中使用索引特別有效. 當然,你也會發現, 在掃描小表時,使用索引同樣能提高效率. 雖然使用索引能得到查詢效率的提高,但是我們也必須注意到它的代價. 索引需要空間來存儲,也需要定期維護, 每當有記錄在表中增減或索引列被修改時, 索引本身也會被修改. 這意味著每條記錄的INSERT , DELETE , UPDATE將為此多付出4 , 5 次的磁碟I/O . 因為索引需要額外的存儲空間和處理,那些不必要的索引反而會使查詢反應時間變慢.。定期的重構索引是有必要的.:
ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>
(18) 用EXISTS替換DISTINCT:
當提交一個包含一對多表信息(比如部門表和雇員表)的查詢時,避免在SELECT子句中使用DISTINCT. 一般可以考慮用EXIST替換, EXISTS 使查詢更為迅速,因為RDBMS核心模塊將在子查詢的條件一旦滿足後,立刻返回結果. 例子:
(低效):
SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E
WHERE D.DEPT_NO = E.DEPT_NO
(高效):
SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT 『X'
FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);
(19) sql語句用大寫的;因為oracle總是先解析sql語句,把小寫的字母轉換成大寫的再執行
(20) 在java代碼中盡量少用連接符「+」連接字元串!
(21) 避免在索引列上使用NOT 通常,
我們要避免在索引列上使用NOT, NOT會產生在和在索引列上使用函數相同的影響. 當ORACLE」遇到」NOT,他就會停止使用索引轉而執行全表掃描.
(22) 避免在索引列上使用計算.
WHERE子句中,如果索引列是函數的一部分.優化器將不使用索引而使用全表掃描.
舉例:
低效:
SELECT … FROM DEPT WHERE SAL * 12 > 25000;
高效:
SELECT … FROM DEPT WHERE SAL > 25000/12;
(23) 用>=替代>
高效:
SELECT * FROM EMP WHERE DEPTNO >=4
低效:
SELECT * FROM EMP WHERE DEPTNO >3
兩者的區別在於, 前者DBMS將直接跳到第一個DEPT等於4的記錄而後者將首先定位到DEPTNO=3的記錄並且向前掃描到第一個DEPT大於3的記錄.
(24) 用UNION替換OR (適用於索引列)
通常情況下, 用UNION替換WHERE子句中的OR將會起到較好的效果. 對索引列使用OR將造成全表掃描. 注意, 以上規則只針對多個索引列有效. 如果有column沒有被索引, 查詢效率可能會因為你沒有選擇OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引.
高效:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10
UNION
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE REGION = 「MELBOURNE」
低效:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10 OR REGION = 「MELBOURNE」
如果你堅持要用OR, 那就需要返回記錄最少的索引列寫在最前面.
(25) 用IN來替換OR
這是一條簡單易記的規則,但是實際的執行效果還須檢驗,在ORACLE8i下,兩者的執行路徑似乎是相同的.
低效:
SELECT…. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30
高效
SELECT… FROM LOCATION WHERE LOC_IN IN (10,20,30);
(26) 避免在索引列上使用IS NULL和IS NOT NULL
避免在索引中使用任何可以為空的列,ORACLE將無法使用該索引.對於單列索引,如果列包含空值,索引中將不存在此記錄. 對於復合索引,如果每個列都為空,索引中同樣不存在此記錄.如果至少有一個列不為空,則記錄存在於索引中.舉例: 如果唯一性索引建立在表的A列和B列上, 並且表中存在一條記錄的A,B值為(123,null) , ORACLE將不接受下一條具有相同A,B值(123,null)的記錄(插入). 然而如果所有的索引列都為空,ORACLE將認為整個鍵值為空而空不等於空. 因此你可以插入1000 條具有相同鍵值的記錄,當然它們都是空! 因為空值不存在於索引列中,所以WHERE子句中對索引列進行空值比較將使ORACLE停用該索引.
低效: (索引失效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;
高效: (索引有效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0;
(27) 總是使用索引的第一個列:
如果索引是建立在多個列上, 只有在它的第一個列(leading column)被where子句引用時,優化器才會選擇使用該索引. 這也是一條簡單而重要的規則,當僅引用索引的第二個列時,優化器使用了全表掃描而忽略了索引
(28) 用UNION-ALL 替換UNION ( 如果有可能的話):
當SQL語句需要UNION兩個查詢結果集合時,這兩個結果集合會以UNION-ALL的方式被合並, 然後在輸出最終結果前進行排序. 如果用UNION ALL替代UNION, 這樣排序就不是必要了. 效率就會因此得到提高. 需要注意的是,UNION ALL 將重復輸出兩個結果集合中相同記錄. 因此各位還是要從業務需求分析使用UNION ALL的可行性. UNION 將對結果集合排序,這個操作會使用到SORT_AREA_SIZE這塊內存. 對於這塊內存的優化也是相當重要的. 下面的SQL可以用來查詢排序的消耗量
低效:
SELECT ACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = '31-DEC-95'
UNION
SELECT ACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = '31-DEC-95'
高效:
SELECT ACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = '31-DEC-95'
UNION ALL
SELECT ACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = '31-DEC-95'
(29) 用WHERE替代ORDER BY:
ORDER BY 子句只在兩種嚴格的條件下使用索引.
ORDER BY中所有的列必須包含在相同的索引中並保持在索引中的排列順序.
ORDER BY中所有的列必須定義為非空.
WHERE子句使用的索引和ORDER BY子句中所使用的索引不能並列.
例如:
表DEPT包含以下列:
DEPT_CODE PK NOT NULL
DEPT_DESC NOT NULL
DEPT_TYPE NULL
低效: (索引不被使用)
SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE
高效: (使用索引)
SELECT DEPT_CODE FROM DEPT WHERE DEPT_TYPE > 0
(30) 避免改變索引列的類型.:
當比較不同數據類型的數據時, ORACLE自動對列進行簡單的類型轉換.
假設 EMPNO是一個數值類型的索引列.
SELECT … FROM EMP WHERE EMPNO = 『123'
實際上,經過ORACLE類型轉換, 語句轉化為:
SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(『123')
幸運的是,類型轉換沒有發生在索引列上,索引的用途沒有被改變.
現在,假設EMP_TYPE是一個字元類型的索引列.
SELECT … FROM EMP WHERE EMP_TYPE = 123
這個語句被ORACLE轉換為:
SELECT … FROM EMP WHERETO_NUMBER(EMP_TYPE)=123
因為內部發生的類型轉換, 這個索引將不會被用到! 為了避免ORACLE對你的SQL進行隱式的類型轉換, 最好把類型轉換用顯式表現出來. 注意當字元和數值比較時, ORACLE會優先轉換數值類型到字元類型
(31) 需要當心的WHERE子句:
某些SELECT 語句中的WHERE子句不使用索引. 這里有一些例子.
在下面的例子里, (1)『!=' 將不使用索引. 記住, 索引只能告訴你什麼存在於表中, 而不能告訴你什麼不存在於表中. (2) 『||'是字元連接函數. 就象其他函數那樣, 停用了索引. (3) 『+'是數學函數. 就象其他數學函數那樣, 停用了索引. (4)相同的索引列不能互相比較,這將會啟用全表掃描.
(32) a. 如果檢索數據量超過30%的表中記錄數.使用索引將沒有顯著的效率提高.
b. 在特定情況下, 使用索引也許會比全表掃描慢, 但這是同一個數量級上的區別. 而通常情況下,使用索引比全表掃描要塊幾倍乃至幾千倍!
(33) 避免使用耗費資源的操作:
帶有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL語句會啟動SQL引擎
執行耗費資源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要執行兩次排序. 通常, 帶有UNION, MINUS , INTERSECT的SQL語句都可以用其他方式重寫. 如果你的資料庫的SORT_AREA_SIZE調配得好, 使用UNION , MINUS, INTERSECT也是可以考慮的, 畢竟它們的可讀性很強
(34) 優化GROUP BY:
提高GROUP BY 語句的效率, 可以通過將不需要的記錄在GROUP BY 之前過濾掉.下面兩個查詢返回相同結果但第二個明顯就快了許多.
低效:
SELECT JOB , AVG(SAL)
FROM EMP
GROUP JOB
HAVING JOB = 『PRESIDENT'
OR JOB = 『MANAGER'
高效:
SELECT JOB , AVG(SAL)
FROM EMP
WHERE JOB = 『PRESIDENT'
OR JOB = 『MANAGER'
GROUP JOB

❸ 推薦幾本關於oracle資料庫優化方面的好書

這幾本書不錯,你可以看看,參考來源:酷瓜書單

1. 《深入解析Oracle》 豆瓣評分:8.7
只看頭兩章就已經超出預期,的確物有所值。

2. 《Oracle DBA手記》 豆瓣評分:8
蓋國強、楊廷琨、熊軍等幾位牛人一起寫的,不解釋了。

3. 《Oracle資料庫性能優化》 豆瓣評分:7
實戰性很強。

4. 《Oracle性能診斷藝術》 豆瓣評分:9
書翻譯的不錯,是國內為數不多的針對sql性能診斷方面比較深入全面的書籍。

5. 《構建Oracle高可用環境》 豆瓣評分:8
淘寶首席DBA、Oracle ACE、ITpub版主陳吉平力作

❹ 如何排除與Oracle SQL語句的性能問題

一、問題的提出

在應用系統開發初期,由於開發資料庫數據比較少,對於查詢SQL語句,復雜視圖的的編寫等體會不出SQL語句各種寫法的性能優劣,但是如果將應用系統提交實際應用後,隨著資料庫中數據的增加,系統的響應速度就成為目前系統需要解決的最主要的問題之一。系統優化中一個很重要的方面就是SQL語句的優化。對於海量數據,劣質SQL語句和優質SQL語句之間的速度差別可以達到上百倍,可見對於一個系統不是簡單地能實現其功能就可,而是要寫出高質量的SQL語句,提高系統的可用性。

在多數情況下,Oracle使用索引來更快地遍歷表,優化器主要根據定義的索引來提高性能。但是,如果在SQL語句的where子句中寫的SQL代碼不合理,就會造成優化器刪去索引而使用全表掃描,一般就這種SQL語句就是所謂的劣質SQL語句。在編寫SQL語句時我們應清楚優化器根據何種原則來刪除索引,這有助於寫出高性能的SQL語句。

二、SQL語句編寫注意問題

下面就某些SQL語句的where子句編寫中需要注意的問題作詳細介紹。在這些where子句中,即使某些列存在索引,但是由於編寫了劣質的SQL,系統在運行該SQL語句時也不能使用該索引,而同樣使用全表掃描,這就造成了響應速度的極大降低。

1. IS NULL 與 IS NOT NULL

不能用null作索引,任何包含null值的列都將不會被包含在索引中。即使索引有多列這樣的情況下,只要這些列中有一列含有null,該列就會從索引中排除。也就是說如果某列存在空值,即使對該列建索引也不會提高性能。任何在where子句中使用is null或is not null的語句優化器是不允許使用索引的。

2. 聯接列

對於有聯接的列,即使最後的聯接值為一個靜態值,優化器是不會使用索引的。我們一起來看一個例子,假定有一個職工表(employee),對於一個職工的姓和名分成兩列存放(FIRST_NAME和LAST_NAME),現在要查詢一個叫比爾.柯林頓(Bill Cliton)的職工。

下面是一個採用聯接查詢的SQL語句:

select * from employss

where

first_name||''||last_name ='Beill Cliton';

上面這條語句完全可以查詢出是否有Bill Cliton這個員工,但是這里需要注意,系統優化器對基於last_name創建的索引沒有使用。

當採用下面這種SQL語句的編寫,Oracle系統就可以採用基於last_name創建的索引。

❺ 《高性能MySQL第3版》pdf下載在線閱讀,求百度網盤雲資源

《高性能MySQL(第3版)》(施瓦茨 (Baron Schwartz))電子書網盤下載免費在線閱讀

資源鏈接:

鏈接:

提取碼:enz6

書名:高性能MySQL(第3版)

作者:施瓦茨 (Baron Schwartz)

譯者:寧海元

豆瓣評分:9.3

出版社:電子工業出版社

出版年份:2013-5-1

頁數:764

內容簡介:

《高性能mysql(第3版)》是mysql 領域的經典之作,擁有廣泛的影響力。第3 版更新了大量的內容,不但涵蓋了最新mysql 5.5版本的新特性,也講述了關於固態盤、高可擴展性設計和雲計算環境下的資料庫相關的新內容,原有的基準測試和性能優化部分也做了大量的擴展和補充。全書共分為16 章和6 個附錄,內容涵蓋mysql 架構和歷史,基準測試和性能剖析,資料庫軟硬體性能優化,復制、備份和恢復,高可用與高可擴展性,以及雲端的mysql 和mysql相關工具等方面的內容。每一章都是相對獨立的主題,讀者可以有選擇性地單獨閱讀。

《高性能mysql(第3版)》不但適合資料庫管理員(dba)閱讀,也適合開發人員參考學習。不管是資料庫新手還是專家,相信都能從本書有所收獲。

作者簡介:

關於作者

Baron Schwartz 是一位軟體工程師,居住在弗吉尼亞州的Charlottesville,網路常用名是Xaprb,這是按照QWERTY 鍵盤的順序在Dvorak 鍵盤上打出來的名字。在不忙於解決有趣的編程挑戰時,Baron 會和他的妻子Lynn 以及小狗Carbon 一起享受閑暇的時光。他有一個軟體工程方面的博客,地址是http://www.xaprb.com/blog/

Peter Zaitsev 曾經是MySQL AB 公司高性能組的經理,目前在運作mysqlperformance

blog.com 網站。他擅長於幫助那些每天有數以百萬計訪問量的網站的管理員解決問題,這些網站通常需要幾百台機器來處理TB 級的數據。他常常為了解決一個問題而不停地升級硬體和軟體(比如查詢優化)。Peter 還經常在各種會議上演講。

Vadim Tkachenko 曾經是MySQL AB 公司的性能工程師。作為一名在多線程編程和同步方面的專家,他的主要工作是基準測試、性能剖析,以及找出系統的性能瓶頸。他還在性能監控和調優方面做了一些工作,使得MySQL 在多核機器上有更好的可擴展性。

================================================================

譯者簡介

寧海元 有超過十年的資料庫管理經驗,從最初到SQL Server 2000到Oracle到MySQL,擅長資料庫高可用架構,性能優化和故障診斷。2007年加入淘寶,帶領淘寶DBA團隊支撐了淘寶業務的快速增長,完成了資料庫的垂直拆分、水平拆分,遷移到MySQL體系等主要工作。目前專注於無線數據領域。網路常用名NinGoo,個人博客:http://www.ningoo.net

周振興 畢業於北京師范大學數學系,09年加入淘寶資料庫團隊負責MySQL運維管理工作,有豐富的MySQL性能優化、Troubleshooting經驗,對MySQL主要模塊的實現和原理有深入的研究,經歷淘寶MySQL實例從30到3000的發展,對系統架構、高可用環境規劃都有深入理解。個人博客:http://orczhou.com

彭立勛 2010年大學畢業後加入阿里巴巴運維部。作為一名MySQL DBA,在運維MySQL的過程中,對MySQL和InnoDB的一些功能和缺陷就進行了補充,編寫了多主復制和數據閃回等補丁。目前在阿里集團核心系統研發部資料庫組,專注於MySQL資料庫相關的開發工作。後來一些補丁被MySQL之父Mony看中,成為MariaDB提交組(Maria-captains)成員,並且把多主復制,線程內存監控等補丁合並到了MariaDB 10.0版本。

翟衛祥 畢業於武漢大學,研究生階段從事資料庫相關研究。畢業後就職於阿里巴巴集團資料庫技術團隊至今,主要負責阿里內部MySQL代碼分支維護,包括MySQL Bug Fix及新特性開發。對MySQL內核有一定的研究。

劉輝 2008年畢業於西安電子科技大學計算機系,碩士學位。2011年加入阿里巴巴集團資料庫技術團隊,花名希羽,MySQL內核開發工程師。

❻ 1.1 什麼是Oracle資料庫

在這里我必須插幾句,說說我對拉里•埃里森的崇拜之情。我曾經崇拜過喬布斯,不過那是我對80年代發明蘋果電腦的喬布斯的崇拜,也許iPhone是喬布斯人生輝煌的頂點,但是我只崇拜發明了那台綠色字元的小電腦的喬布斯;我也曾崇拜比爾•蓋茨,不過那是我對DOS 3.0的崇拜。但自從聽說了拉里用錘子為辦公室開辟網線通道的故事(不管這個故事是不是真實的),我就開始崇拜他了。用聖跡來命名一家公司和一個產品,這不是我們這種凡夫俗子能夠做到的。Oracle也確實像聖跡一樣,深深地影響著全世界。 Oracle RDBMS是一款十分優秀的關系型資料庫產品,Oracle從頭到尾都是一個RDBMS,是針對OLTP系統進行設計的,這一點從它底層的塊結構就可以看出。Oracle在大並發量和海量數據關系型檢索方面具有十分優越的性能,但是它並不擅長OLAP,因為它不支持列壓縮存儲(當然,從exadata開始,Oracle也能夠支持混合列壓縮,這是一種行存儲和列壓縮的混合模式,目前只在exadata資料庫一體機上實現)。與其他關系型資料庫相比,Oracle在某些方面更為優秀,但也有其不足的地方,因此它絕對不是萬能的。優勢和劣勢都是與生俱來的,這是由Oracle資料庫的基本架構和數據存儲的基礎結構所決定的,優化只能解決局部性的問題,有限度地提升其性能,但是絕對無法完全掩蓋結構性問題帶來的負面影響。Oracle的優勢在於大並發量下的高吞吐能力,因此很適合大型企業級應用。但是如果我們在一個並發量和數據量都不是很大的系統中,對Oracle和MS SQL Server進行比較,就不難發現Oracle並沒有多大的優勢,甚至在某些方面還不如後者。 再往更為本質的方面去探討,Oracle是一個RDBMS系統,也是一款應用軟體。Oracle資料庫除了將數據存儲於文件中外,還通過一個被稱為實例的後台機制向外提供服務,這兩部分我們將在隨後的兩節中詳細介紹,這里不做過多的描述。我們在這里僅僅討論作為應用程序的Oracle RDBMS系統,它必須依賴於某個操作系統或硬體體系。和我們自己編寫的程序一樣,Oracle必須適應於某個操作系統,並充分利用操作系統提供的資源,反過來,操作系統也必須能夠將資源提供給Oracle資料庫使用。在一個僅僅運行Oracle RDBMS的系統上,操作系統應該被調整為能夠將絕大多數的資源都提供給Oracle資料庫。這樣,Oracle的進程就能夠最大可能地得到足夠的系統資源。 討論這個似乎又有點跑題了,其實不然,只有充分了解Oracle的本質,我們才不會神化Oracle。Oracle的本質就是一款軟體、一個程序,那麼它就具備程序的一切特徵,包括可能出現的bug。 但是Oracle不是一個簡單的程序,而是十分復雜的體系。首先,Oracle需要將數據存儲在數據文件中,為了能夠支持大量的並發用戶訪問資料庫,並且提高資料庫的訪問性能,Oracle需要引入共享內存,從而實現資源的共享。比如,針對SQL引擎,每個SQL最終將會被解析為一系列的執行步驟,這就是我們常說的執行計劃。如果同一個SQL執行多次,每次都要重新生成執行計劃,那麼效率就比較低下了,Oracle引入了共享池來實現這方面的共享。同樣,如果一個數據塊每次讀取都要訪問文件,那麼效率就不高了,於是Oracle引入了DB Cache來緩存這些數據。同一個數據塊可能被多個用戶修改,如果每次修改就要直接存檔,那麼效率也會降低,於是Oracle設計了DBWR進程,來專門負責將數據塊寫入文件。這似乎很復雜,不過這一切對於架構師來說很好理解。架構設計的目的就是有效地將功能劃分成不同的組成部分,然後讓這些部分能夠很好地協同工作,從而達到最好的效果,因此架構師很容易做出類似的設計。 實際上,作為一個應用程序的Oracle,它的實現原理是十分朴實的,並不像我們想像的那麼神秘。前幾天我碰到一個案例,有個客戶的Oracle 9.2.0.6資料庫突然出現了故障,sqlplus通過sysdba能夠登錄,並且能夠訪問一些系統視圖,比如v$session,但如果使用普通用戶登錄就會被掛起。通過HANGANALYZE工具分析,沒有發現任何異常。然而,在檢查Oracle後台進程的時候,我們發現所有的Oracle後台進程和絕大多數前台進程都消失了。客戶很是不解,為什麼會這樣呢?檢查日誌,沒有發現任何異常。於是我們使用shutdown abort關閉了實例,並且進行了重啟。我們都覺得沒有日誌,很難分析,也就沒有深入研究。 第二天,客戶又找到了我,說資料庫又出現了昨天的情況,這回所有的Oracle進程,包括前台進程、後台進程,統統沒有了,而且沒有任何的日誌產生。我考慮了半天,突然有所感悟,Oracle的實例實際上也是一款應用軟體,由多個進程組成,任何一個進程發現系統存在異常,都會第一時間記錄日誌,如果問題十分嚴重,就會關閉實例。我們可以使用sysdba賬號登錄系統,並且能夠在HANGANALYZE工具中看到會話的信息,說明Oracle的共享內存還存在,只是所有的進程都沒有了。這種情況只有一種可能,就是所有的Oracle後台進程都是在同一個時間點被終止的,而且不是程序自己退出的(因為程序自己退出,應該有機會完成自己的退出業務邏輯,比如寫日誌記錄故障),而是被外力強行終止的。 從上面的分析,很自然就能聯想到Oracle的後台進程很可能是被人為殺掉了。於是我做了一個實驗,發現如果殺掉所有的後台進程,Oracle的共享內存還是存在的,並且能夠通過sysdba賬號訪問,普通用戶登錄由於缺乏後台進程的支持,會被掛起。這個現象和客戶目前碰到的問題十分相似。 發現這個問題的真相只有一個渠道,就是從應用程序本質上去考慮,這樣才能得出所有的後台進程都是在同一時間被終止的結論,並找出其原因。只有外部力量的介入,才有可能出現所有後台進程全部終止,而共享內存還保持正常的現象,這絕對不是某個bug能產生的結果。排除了bug的影響,我們才能把主要精力集中在正確的方向上。 到這里,對於這個案例的分析就接近尾聲了,本節並沒有很深入地介紹什麼是Oracle,而是更加直接地介紹了Oracle的本質。Oracle在本質上就是一組應用軟體,它也具備所有應用軟體所具備的特徵。了解這一點,是我們今後解決任何問題的基礎。任何看似妖異的現象,都離不開Oracle作為應用軟體的本質,都無法違背應用軟體所遵循的規律。 作為應用程序的Oracle,必須依賴於其運行的系統環境,Oracle資料庫的處理能力和性能也依賴於主機硬體、存儲、網路和操作系統等因素,因此作為DBA不能僅僅就Oracle而論Oracle,還必須熟悉Oracle運行所依賴的環境。作為應用程序的Oracle,會和操作系統中的其他進程競爭有限的系統資源,因此,在資料庫伺服器上做一些比較大的操作時,一定要謹慎,因為這些操作可能會使Oracle資料庫出現問題。 Oracle不僅是特殊的應用程序,更是龐大的資料庫管理系統,它包含了一個RDBMS管理系統和其他一系列應用程序。Oracle的核心RDBMS管理系統包含在$ORACLE_HOME/bin/oracle映像、$ORACLE_HOME/lib/libclntsh.so等中,而sqlplus、exp等則是一些Oracle資料庫的工具。tnslsnr是Oracle的網路連接部件,用於連接客戶端到RDBMS。這些應用程序都被安裝在ORACLE HOME目錄下。 通過上述應用程序,RDBMS管理系統及其工具,用戶就可以創建、管理資料庫。另外,用戶還可以通過sqlplus工具,使用create database命令去創建一個資料庫,也可以使用startup和shutdown命令去啟動和關閉資料庫。 資料庫是獨立的,從物理結構上看,它是由一系列文件組成的,包括參數文件、口令文件、控制文件、數據文件、日誌文件等。一套完整的資料庫,只要其所有的文件都是完整的,那麼即使資料庫的RDBMS管理系統遭到破壞,只要重新安裝和資料庫版本一致的RDBMS管理系統,該資料庫就可以重新啟用。其實所謂重新啟用,本質上就是可以在某個實例中打開這個資料庫,供客戶使用。 另外需要注意的是,Oracle資料庫是一個RDBMS管理系統,其本質是關系型資料庫。關系型資料庫是十分適合OLTP應用的,因為它存儲的是一系列的關系,各種關系以表的形式被存儲起來。比如,春節前鐵路網上售票系統崩潰,有人分析這是由於鐵路系統固步自封,沒有使用國外某大廠商的產品,而選用了通用RDBMS資料庫產品所導致的性能問題,如果選用了某國際知名廠商的網狀資料庫,就不會有問題了。這個說法看似有理,實際上,如果足夠了解RDBMS,就知道其不值一駁了,因為鐵路售票系統是十分典型的OLTP應用。 另外,由於Oracle是行存儲的RDBMS資料庫,這一特點也使其十分適合OLTP應用。從Oracle資料庫的內部數據結構可以看出,Oracle在行存儲數據方面下足了功夫,甚至連行鎖都是設置在行頭中的。在行鎖的性能方面,Oracle的表現極為優秀,這一點毋庸置疑。不過這種設計,可能不適合一些經常以列為訪問對象的OLAP系統,列壓縮技術才是實現這類應用的最佳解決方案。

❼ ORACLE DBA 性能優化的視頻; 最好是講SQL優化 執行計劃等等的

【視頻教學:性能優化】Maclean Liu的Oracle性能優化講座第一回《真正讀懂Oracle SQL執行計劃》
【技術分享】開Oracle調優鷹眼,深入理解AWR性能報告 第一講 地址
【技術分享】開Oracle調優鷹眼,深入理解AWR性能報告 第二講
【AskMaclean技術分享Oracle資料庫優化】AWR鷹眼系列AWR報告全面指標分析

❽ 如何對Oracle sql 進行性能優化的調整

在SQL查詢中,為了提高查詢的效率,我們常常採取一些措施對查詢語句進行SQL性能優化。本文我們總結了一些優化措施,接下來我們就一一介紹。
1.查詢的模糊匹配
盡量避免在一個復雜查詢裡面使用 LIKE '%parm1%'—— 紅色標識位置的百分號會導致相關列的索引無法使用,最好不要用。
解決辦法:
其實只需要對該腳本略做改進,查詢速度便會提高近百倍。改進方法如下:
a、修改前台程序——把查詢條件的供應商名稱一欄由原來的文本輸入改為下拉列表,用戶模糊輸入供應商名稱時,直接在前台就幫忙定位到具體的供應商,這樣在調用後台程序時,這列就可以直接用等於來關聯了。
b、直接修改後台——根據輸入條件,先查出符合條件的供應商,並把相關記錄保存在一個臨時表裡頭,然後再用臨時表去做復雜關聯。
2.索引問題
在做性能跟蹤分析過程中,經常發現有不少後台程序的性能問題是因為缺少合適索引造成的,有些表甚至一個索引都沒有。這種情況往往都是因為在設計表時,沒去定義索引,而開發初期,由於表記錄很少,索引創建與否,可能對性能沒啥影響,開發人員因此也未多加重視。然一旦程序發布到生產環境,隨著時間的推移,表記錄越來越多。這時缺少索引,對性能的影響便會越來越大了。
法則:不要在建立的索引的數據列上進行下列操作:
避免對索引欄位進行計算操作
避免在索引欄位上使用not,<>,!=
避免在索引列上使用IS NULL和IS NOT NULL
避免在索引列上出現數據類型轉換
避免在索引欄位上使用函數
避免建立索引的列中使用空值
3.復雜操作
部分UPDATE、SELECT 語句 寫得很復雜(經常嵌套多級子查詢)——可以考慮適當拆成幾步,先生成一些臨時數據表,再進行關聯操作。
4.update
同一個表的修改在一個過程里出現好幾十次,如:

update table1 set col1=... where col2=...; update table1 set col1=... where col2=... ...

這類腳本其實可以很簡單就整合在一個UPDATE語句來完成(前些時候在協助xxx項目做性能問題分析時就發現存在這種情況)
5.在可以使用UNION ALL的語句里,使用了UNION
UNION 因為會將各查詢子集的記錄做比較,故比起UNION ALL ,通常速度都會慢上許多。一般來說,如果使用UNION ALL能滿足要求的話,務必使用UNION ALL。還有一種情況大家可能會忽略掉,就是雖然要求幾個子集的並集需要過濾掉重復記錄,但由於腳本的特殊性,不可能存在重復記錄,這時便應該使用 UNION ALL,如xx模塊的某個查詢程序就曾經存在這種情況,見,由於語句的特殊性,在這個腳本中幾個子集的記錄絕對不可能重復,故可以改用UNION ALL)。
6.在WHERE 語句中,盡量避免對索引欄位進行計算操作
這個常識相信絕大部分開發人員都應該知道,但仍有不少人這么使用,我想其中一個最主要的原因可能是為了編寫寫簡單而損害了性能,那就不可取了。9月份在對XX系統做性能分析時發現,有大量的後台程序存在類似用法,如:where trunc(create_date)=trunc(:date1),雖然已對create_date 欄位建了索引,但由於加了TRUNC,使得索引無法用上。此處正確的寫法應該是where create_date>=trunc(:date1) and create_date< pre=""><>或者是where create_date between trunc(:date1) and trunc(:date1)+1-1/(24*60*60)。
注意:因between 的范圍是個閉區間(greater than or equal to low value and less than or equal to high value.),故嚴格意義上應該再減去一個趨於0的小數,這里暫且設置成減去1秒(1/(24*60*60)),如果不要求這么精確的話,可以略掉這步。
7.對Where 語句的法則
7.1 避免在WHERE子句中使用in,not in,or 或者having。
可以使用 exist 和not exist代替in和not in。
可以使用表鏈接代替 exist。Having可以用where代替,如果無法代替可以分兩步處理。
例子

SELECT * FROM ORDERS WHERE CUSTOMER_NAME NOT IN (SELECT CUSTOMER_NAME FROM CUSTOMER)
優化

SELECT * FROM ORDERS WHERE CUSTOMER_NAME not exist (SELECT CUSTOMER_NAME FROM CUSTOMER)

7.2 不要以字元格式聲明數字,要以數字格式聲明字元值。(日期同樣)否則會使索引無效,產生全表掃描。
例子使用:
SELECT emp.ename, emp.job FROM emp WHERE emp.empno = 7369;
--不要使用:
SELECT emp.ename, emp.job FROM emp WHERE emp.empno = '7369'
8.對Select語句的法則
在應用程序、包和過程中限制使用select * from table這種方式。看下面例子
--使用
SELECT empno,ename,category FROM emp WHERE empno = '7369'
--而不要使用
SELECT * FROM emp WHERE empno = '7369'
9. 排序
避免使用耗費資源的操作,帶有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL語句會啟動SQL引擎 執行,耗費資源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要執行兩次排序。
10.臨時表
慎重使用臨時表可以極大的提高系統性能。
關於SQL性能優化的知識就介紹到這里了

❾ oracle入門經典書籍

oracle書籍一、《Oracle Database 11g性能優化攻略》
三位經驗豐富的頂級oracle dba 再次聯手,為讀者呈現這本oracle 資料庫性能優化攻略。本書由表及裡地深入分析了造成oracle 資料庫性能緩慢的各種原因,然後給出標本兼治的性能調優方案。

oracle書籍二、《收獲,不止Oracle》
在這《收獲,不止oracle》里讀者將會跟隨作者一同對oracle資料庫的相關知識進行梳理,最終共同提煉出必須最先掌握的那部分知識,無論你是資料庫開發、管理、優化、設計人員,還是從事java、c的開發人員。

oracle書籍三、《Oracle 高性能SQL引擎剖析:SQL優化與調優機制詳解》
oracle資料庫的性能優化直接關繫到系統的運行效率,而影響資料庫性能的一個重要因素就是sql性能問題。本書是作者十年磨一劍的成果之一,深入分析與解剖oracle sql優化與調優技術。

oracle書籍四、《Oracle PL/SQL實戰》
《oracle pl/sql實戰》共15章,分別由15位業內頂級專家擔綱撰寫。一條sql語句的誤用,可能導致作業的運行時間增加幾百倍,riyaj shamsudeen巧妙地回答了何時使用pl/sql這一問題;michael rosenblum說明了如果只有到最終運行時,才知道所要運行的sql語句到底是什麼。

❿ 《資料庫查詢優化器的藝術原理解析與SQL性能優化》epub下載在線閱讀全文,求百度網盤雲資源

《資料庫查詢優化器的藝術原理解析與SQL性能優化》(李海翔)電子書網盤下載免費在線閱讀

鏈接: https://pan..com/s/1mCvCWSKcLyMlwqj2QPPmEg

提取碼: 1gnh

書名:資料庫查詢優化器的藝術原理解析與SQL性能優化

豆瓣評分:8.4

作者:李海翔

出版社:機械工業出版社

副標題:原理解析與SQL性能優化

出版年:2014-1-1

頁數:532

內容簡介:

《資料庫技術叢書·資料庫查詢優化器的藝術:原理解析與SQL性能優化》是資料庫查詢優化領域的里程碑之作,由Oracle公司MySQL全球開發團隊、資深專家撰寫,作者有10餘年資料庫內核和查詢優化器研究經驗。資料庫領域泰斗王珊教授親自作序推薦,PostgreSQL中國社區和中國用戶會發起人以及來自Oracle、新浪、網易、華為等企業的數位資深資料庫專家聯袂推薦。從原理角度深度解讀和展示資料庫查詢優化器的技術細節和全貌;從源碼實現角度全方位深入分析MySQL和PostgreSQL兩大主流開源資料庫查詢優化器的實現原理;從工程實踐的角度對比了兩大資料庫的查詢優化器的功能異同和實現異同。它是所有數據開發工程師、內核工程師、DBA以及其他資料庫相關工作人員值得反復研讀的一本書。

《資料庫技術叢書·資料庫查詢優化器的藝術:原理解析與SQL性能優化》共19章,分為四個部分:第一篇(第1~4章)對資料庫查詢優化技術的范圍、邏輯查詢優化、物理查詢優化,以及查詢優化器與其他模塊的關系做了非常細致、深入的講解;第二篇(第5~10章)首先從源碼角度對PostgreSQL查詢優化器的架構、層次、設計思想、相關數據結構和實現原理進行了深入、系統的分析,然後從功能角度對PostgreSQL的邏輯查詢優化、物理查詢優化、查詢優化器的關鍵演算法,以及PostgreSQL查詢優化器與其他模塊的關系做了深入的講解;第三篇(第11~16章)首先從源碼角度對MySQL查詢優化器的架構、層次、設計思想、相關數據結構和實現原理進行了深入、系統的分析,然後從功能角度對MySQL的邏輯查詢優化、物理查詢優化、查詢優化器的關鍵演算法,以及MySQL查詢優化器與其他模塊的關系做了深入的講解;第四篇(第17~19章)對PostgreSQL與MySQL的邏輯查詢優化技術、物理查詢優化技術、設計思想和編碼規范等各方面進行了深度的比較。

作者簡介:

李海翔,網名「那海藍藍」,資深資料庫專家,從事資料庫研發、資料庫測試與技術管理等工作10餘年,對資料庫的內核有深入的研究,長於PostgreSQL和MySQL等開源資料庫的內核與架構。現任職於Oracle公司MySQL全球開發團隊,從事查詢優化技術的研究和MySQL查詢優化器的開發工作。曾參與了863、核高基、工信部、科技部、發改委、北京市科委等多個重大科技項目。2005年獲得北京市科學技術進步獎一等獎,2006年獲高級工程師(系統分析師)。