1 首先看看,先分析慢的原因,一部分是因為循環次數多,一部分是因為查詢數據量大慢。
2 可以從優化查詢入手,比如某次查詢的sql裡面的數據,條件欄位沒有建索引,導致了全表掃描,
是不是 只需要幾個欄位,但是你寫了 select * 等等,總之要優化數據的速度。
2 可以從循環邏輯看起,有些循環可能是不必要的,能不能通過條件查詢來替代循環,總之要從邏輯上優化代碼
2. 優化資料庫大幅度提高Oracle的性能
幾個簡單的步驟大幅提高Oracle性能 我優化資料庫的三板斧
資料庫優化的討論可以說是一個永恆的主題 資深的Oracle優化人員通常會要求提出性能問題的人對資料庫做一個statspack 貼出資料庫配置等等 還有的人認為要抓出執行最慢的語句來進行優化 但實際情況是 提出疑問的人很可能根本不懂執行計劃 更不要說statspack了 而我認為 資料庫優化 應該首先從大的方面考慮 網路 伺服器硬體配置 操作系統配置 Oracle伺服器配置 數據結構組織 然後才是具體的調整 實際上網路 硬體等往往無法決定更換 應用程序一般也無法修改 因此應該著重從資料庫配置 數據結構上來下手 首先讓資料庫有一個良好的配置 然後再考慮具體優化某些過慢的語句 我在給我的用戶系統進行優化的過程中 總結了一些基本的 簡單易行的辦法來優化資料庫 算是我的三板斧 呵呵 不過請注意 這些不一定普遍使用 甚至有的會有副作用 但是對OLTP系統 基於成本的資料庫往往行之有效 不妨試試 (注 附件是Burleson寫的用來報告資料庫性能等信息的腳本 本文用到)
一.設置合適的SGA
常常有人抱怨伺服器硬體很好 但是Oracle就是很慢 很可能是內存分配不合理造成的 ( )假設內存有 M 這通常是小型應用 建議Oracle的SGA大約 M 其中 共享池(SHARED_POOL_SIZE)可以設置 M到 M 根據實際的用戶數 查詢等來定 數據塊緩沖區可以大致分配 M M i下需要設置DB_BLOCK_BUFFERS DB_BLOCK_BUFFER*DB_BLOCK_SIZE等於數據塊緩沖區大小 i 下的數據緩沖區可以用db_cache_size來直接分配
( )假設內存有 G Oracle 的SGA可以考慮分配 M 共享池分配 M到 M 數據緩沖區分配 M到 M
( )內存 G SGA可以考慮分配 G 共享池 M到 M 剩下的給數據塊緩沖區
( )內存 G以上 共享池 M到 M就足夠啦 再多也沒有太大幫助 (Biti_rainy有專述)數據緩沖區是盡可能的大 但是一定要注意兩個問題 一是要給操作系統和其他應用留夠內存 二是對於 位的操作系統 Oracle的SGA有 G的限制 有的 位操作系統上可以突破這個限制 方法還請看Biti的大作吧
二.分析表和索引 更改優化模式
Oracle默認優化模式是CHOOSE 在這種情況下 如果表沒有經過分析 經常導致查詢使用全表掃描 而不使用索引 這通常導致磁碟I/O太多 而導致查詢很慢 如果沒有使用執行計劃穩定性 則應該把表和索引都分析一下 這樣可能直接會使查詢速度大幅提升 分析表命令可以用ANALYZE TABLE 分析索引可以用ANALYZE INDEX命令 對於少於 萬的表 可以考慮分析整個表 對於很大的表 可以按百分比來分析 但是百分比不能過低 否則生成的統計信息可能不準確 可以通過DBA_TABLES的LAST_ANALYZED列來查看錶是否經過分析或分析時間 索引可以通過DBA_INDEXES的LAST_ANALYZED列
下面通過例子來說明分析前後的速度對比 (表CASE_GA_AJZLZ大約有 萬數據 有主鍵)首先在SQLPLUS中打開自動查詢執行計劃功能 (第一次要執行RDBMSADMINutlxplan sql來創建PLAN_TABLE這個表)
SQL> SET AUTOTRACE ON SQL>SET TIMING ON
通過SET AUTOTRACE ON 來查看語句的執行計劃 通過SET TIMING ON 來查看語句運行時間
SQL> select count(*) from CASE_GA_AJZLZ; COUNT(*) 已用時間: : : Execution Plan SELECT STATEMENT Optimizer=CHOOSE SORT (AGGREGATE) TABLE ACCESS (FULL) OF CASE_GA_AJZLZ ……………………
請注意上面分析中的TABLE ACCESS(FULL) 這說明該語句執行了全表掃描 而且查詢使用了 秒 這時表還沒有經過分析 下面我們來對該表進行分析
SQL> *** yze table CASE_GA_AJZLZ pute statistics;
表已分析 已用時間: : : 然後再來查詢
SQL> select count(*) from CASE_GA_AJZLZ; COUNT(*) 已用時間: : : Execution Plan SELECT STATEMENT Optimizer=FIRST_ROWS (Cost= Card= ) SORT (AGGREGATE) INDEX (FAST FULL SCAN) OF PK_AJZLZ (UNIQUE) (Cost= Card= ) …………………………
請注意 這次時間僅僅用了 秒!這要歸功於INDEX(FAST FULL SCAN) 通過分析表 查詢使用了PK_AJZLZ索引 磁碟I/O大幅減少 速度也大幅提升!下面的實用語句可以
用來生成分析某個用戶的所有表和索引 假設用戶是GAXZUSR
SQL> set pagesize SQL> spool d: *** yze_tables sql; SQL> select *** yze table ||owner|| ||table_name|| pute statistics; from dba_tables where owner= GAXZUSR ; SQL> spool off SQL> spool spool d: *** yze_indexes sql; SQL> select *** yze index ||owner|| ||index_name|| pute statistics; from dba_indexes where owner= GAXZUSR ; SQL> spool off SQL> @d: *** yze_tables sql SQL> @d: *** yze_indexes sql
解釋 上面的語句生成了兩個sql文件 分別分析全部的GAXZUSR的表和索引 如果需要按照百分比來分析表 可以修改一下腳本 通過上面的步驟 我們就完成了對表和索引的分析 可以測試一下速度的改進啦 建議定期運行上面的語句 尤其是數據經過大量更新
當然 也可以通過dbms_stats來分析表和索引 更方便一些 但是我仍然習慣上面的方法 因為成功與否會直接提示出來
另外 我們可以將優化模式進行修改 optimizer_mode值可以是RULE CHOOSE FIRST_ROWS和ALL_ROWS 對於OLTP系統 可以改成FIRST_ROWS 來要求查詢盡快返回結果 這樣即使不用分析 在一般情況下也可以提高查詢性能 但是表和索引經過分析後有助於找到最合適的執行計劃
三.設置cursor_sharing=FORCE 或SIMILAR
這種方法是 i才開始有的 oracle 不支持 通過設置該參數 可以強制共享只有文字不同的語句解釋計劃 例如下面兩條語句可以共享
SQL> SELECT * FROM MYTABLE WHERE NAME= tom SQL> SELECT * FROM MYTABLE WHERE NAME= turner
這個方法可以大幅降低緩沖區利用率低的問題 避免語句重新解釋 通過這個功能 可以很大程度上解決硬解析帶來的性能下降的問題 個人感覺可根據系統的實際情況 決定是否將該參數改成FORCE 該參數默認是exact 不過一定要注意 修改之前 必須先給ORACLE打補丁 否則改之後oracle會佔用 %的CPU 無法使用 對於ORACLE i 可以設置成SIMILAR 這個設置綜合了FORCE和EXACT的優點 不過請慎用這個功能 這個參數也可能帶來很大的負面影響!
四.將常用的小表 索引釘在數據緩存KEEP池中
內存上數據讀取速度遠遠比硬碟中讀取要快 據稱 內存中數據讀的速度是硬碟的 倍!如果資源比較豐富 把常用的小的 而且經常進行全表掃描的表給釘內存中 當然是在好不過了 可以簡單的通過ALTER TABLE tablename CACHE來實現 在ORACLE i之後可以使用ALTER TABLE table STORAGE(BUFFER_POOL KEEP) 一般來說 可以考慮把 數據塊之內的表放在keep池中 當然要根據內存大小等因素來定 關於如何查出那些表或索引符合條件 可以使用本文提供的access sql和access_report sql 這兩個腳本是著名的Oracle專家 Burleson寫的 你也可以在讀懂了情況下根據實際情況調整一下腳本 對於索引 可以通過ALTER INDEX indexname STORAGE(BUFFER_POOL KEEP)來釘在KEEP池中
將表定在KEEP池中需要做一些准備工作 對於ORACLE i 需要設置DB_KEEP_CACHE_SIZE 對於 i 需要設置buffer_pool_keep 在 i中 還要修改db_block_lru_latches 該參數默認是 無法使用buffer_pool_keep 該參數應該比 * *CPU數量少 但是要大於 才能設置DB_KEEP_CACHE_BUFFER buffer_pool_keep從db_block_buffers中分配 因此也要小於db_block_buffers 設置好這些參數後 就可以把常用對象永久釘在內存里
五.設置optimizer_max_permutations
對於多表連接查詢 如果採用基於成本優化(CBO) ORACLE會計算出很多種運行方案
從中選擇出最優方案 這個參數就是設置oracle究竟從多少種方案來選擇最優 如果設置太大 那麼計算最優方案過程也是時間比較長的 Oracle 和 i默認是 建議改成 對於 i 已經默認是 了
六.調整排序參數
( ) SORT_AREA_SIZE:默認的用來排序的SORT_AREA_SIZE大小是 K 通常顯得有點小 一般可以考慮設置成 M( ) 這個參數不能設置過大 因為每個連接都要分配同樣的排序內存
lishixin/Article/program/Oracle/201311/18879
3. Oracle資料庫大數據量表如何優化
表設計可以採取拆分表的方式
縱向拆分表:根據欄位拆分為多個表,每個表都有關聯欄位,可以將他們關聯起來
(例如:訂單表,幾個根據欄位拆分的表中都有1個訂單號欄位)
橫向拆分表:不知道你具體什麼數據,假定其中有時間欄位,根據時間來拆分
(例如:1年有12個月,1個月的數據放入一個表中)
4. oracle資料庫的性能優化有哪些方法
你最好買一本專門講ORACLE性能優化的書,好好看看\x0d\x0a1、調整資料庫伺服器的性能\x0d\x0aOracle資料庫伺服器是整個系統的核心,它的性能高低直接影響整個系統的性能,為了調整Oracle資料庫伺服器的性能,主要從以下幾個方面考慮: \x0d\x0a1.1、調整操作系統以適合Oracle資料庫伺服器運行\x0d\x0aOracle資料庫伺服器很大程度上依賴於運行伺服器的操作系統,如果操作系統不能提供最好性能,那麼無論如何調整,Oracle資料庫伺服器也無法發揮其應有的性能。 \x0d\x0a1.1.1、為Oracle資料庫伺服器規劃系統資源 \x0d\x0a據已有計算機可賀察裂用資源, 規劃分配給Oracle伺服器資源原則是:盡可能使Oracle伺服器使用資源最大化,特別在Client/Server中盡量讓伺服器上所有資源都來運行Oracle服務。 \x0d\x0a1.1.2、調整計算機系統中的內存配置 \x0d\x0a多數操作系統都用虛存來模擬計算機上更大的內存,它實際上是硬碟上的一定的磁碟空間。當實際的內存空間不能滿足應用軟體的要求時,操作系統就將用這部分的磁碟空間對內存中的信息進行頁面替換,這將引起大量的磁碟I/O操作,使整個伺服器的性能下降。為了避免過多地使用虛存,應加大計算機的內存。 \x0d\x0a1.1.3、為Oracle資料庫伺服器設置操作系統進程優先順序 \x0d\x0a不要在操作系統中調整Oracle進程的優先順序,因為在Oracle資料庫系統中,所有的後台和前台資料庫伺服器進程執行的是同等重要的工作,需要同等的優先順序。所以在安裝時,讓所有的資料庫伺服器進程都使用預設的優先順序運行。 \x0d\x0a1.2、調整內存分配\x0d\x0aOracle資料庫伺服器保留3個基本的內存高速緩存,分別對應3種不同類型的數據:庫高速緩存,字典高速緩存和緩沖區高速緩存。庫高速緩存和字典高速緩存一起構成共享池,共享池再加上緩沖區高速緩存便構成了系統全程區(SGA)。SGA是對資料庫數據進行快速訪問的一個系統全程區,若SGA本身需要頻繁地進行釋放、分配,則不能達到快速訪問數據的目的,因此應把SGA放在主存中,不要放在虛擬內存中。內存的調整主要是指調整組成SGA的內存結構沒斗的大小來提高系統性能,由於Oracle資料庫伺服器的內存結構需求與應用密切相關,所以內存結構的調整應在磁碟I/O調整之前進行。 \x0d\x0a1.2.1、庫緩沖區的調整 \x0d\x0a庫緩沖區中包含私用和共享SQL和PL/SQL區,通過比較庫緩沖區的命中率決定它的大小。要調整庫緩沖區,必須首先了解該庫緩沖區的活動情況,庫緩沖區的活動統計信息保留在動態性能表v$librarycache數據字典中,可通過查詢該表來了解其活動情況,以決定如何調整。 \x0d\x0a \x0d\x0aSelect sum(pins),sum(reloads) from v$librarycache; \x0d\x0a \x0d\x0aPins列給出SQL語句,PL/SQL塊及被訪問對象定義的總次數;Reloads列給出SQL 和PL/SQL塊的隱式分析或對象定義重裝載時在庫程序緩沖區中發生的錯誤。如果sum(pins)/sum(reloads) ≈0,則庫緩沖區的命中率合適;若sum(pins)/sum(reloads)>1, 則需調整初始化參數 shared_pool_size來重新調整分配給共享禪閉池的內存量。 \x0d\x0a1.2.2、數據字典緩沖區的調整 \x0d\x0a數據字典緩沖區包含了有關資料庫的結構、用戶、實體信息。數據字典的命中率,對系統性能影響極大。數據字典緩沖區的使用情況記錄在動態性能表v$librarycache中,可通過查詢該表來了解其活動情況,以決定如何調整。 \x0d\x0a \x0d\x0aSelect sum(gets),sum(getmisses) from v$rowcache; \x0d\x0a \x0d\x0aGets列是對相應項請求次數的統計;Getmisses 列是引起緩沖區出錯的數據的請求次數。對於頻繁訪問的數據字典緩沖區,sum(getmisses)/sum(gets)<10%~15%。若大於此百分數,則應考慮增加數據字典緩沖區的容量,即需調整初始化參數shared_pool_size來重新調整分配給共享池的內存量。 \x0d\x0a1.2.3、緩沖區高速緩存的調整 \x0d\x0a用戶進程所存取的所有數據都是經過緩沖區高速緩存來存取,所以該部分的命中率,對性能至關重要。緩沖區高速緩存的使用情況記錄在動態性能表v$sysstat中,可通過查詢該表來了解其活動情況,以決定如何調整。 \x0d\x0a \x0d\x0aSelect name,value from v$sysstat where name in ('dbblock gets','consistent gets','physical reads'); \x0d\x0a \x0d\x0adbblock gets和consistent gets的值是請求數據緩沖區中讀的總次數。physical reads的值是請求數據時引起從盤中讀文件的次數。從緩沖區高速緩存中讀的可能性的高低稱為緩沖區的命中率,計算公式: \x0d\x0a \x0d\x0aHit Ratio=1-(physical reds/(dbblock gets+consistent gets)) \x0d\x0a \x0d\x0a如果Hit Ratio<60%~70%,則應增大db_block_buffers的參數值。db_block_buffers可以調整分配給緩沖區高速緩存的內存量,即db_block_buffers可設置分配緩沖區高速緩存的數據塊的個數。緩沖區高速緩存的總位元組數=db_block_buffers的值*db_block_size的值。db_block_size 的值表示數據塊大小的位元組數,可查詢 v$parameter 表: \x0d\x0a \x0d\x0aselect name,value from v$parameter where name='db_block_size'; \x0d\x0a \x0d\x0a在修改了上述資料庫的初始化參數以後,必須先關閉資料庫,在重新啟動資料庫後才能使新的設置起作用。
5. oracle 資料庫很慢,應該如何優化
1、是這樣的。
2、這個說不好,我沒這么做過。你手邊應該有oralce的全套電子文檔吧。關鍵是你要找對系統表或者視圖。我記得索引的系統視圖不是這個。
3、這些與你要做的有關系嗎?別像沒頭蒼蠅一樣瞎撞了。
4、不用刪表,如果你連基本的語句命令都不懂,那隻能看書了。
5、慢的原因有好多,逐步排除吧,等找到真正原因再說。急沒用的。
6、默認情況下,是會建到用戶的默認表空間的。
7、這個看你的維護需要。最起碼先弄明白你的庫是怎麼回事再說吧。就從這些問題看,你根本就是門外漢,連庫是怎麼回事都沒弄明白。
6. ORACLE資料庫性能優化概述
實際上 為了保證ORACLE資料庫運行在最佳的性能狀態下 在信息系統開發之前就應該考慮資料庫的優化策略 優化策略一般包括伺服器操作系統參數調整 ORACLE資料庫參數調整 網路性能調整 應用程序SQL語句分析及設計等幾個方面 其中應用程序的分析與設計是在信息系統開發之前完成的
分析評價ORACLE資料庫性能主要有資料庫吞吐量 資料庫用戶響應時間兩項指標 資料庫吞吐量是指單位時間內資料庫完成的SQL語句數目 資料庫用戶響應時間是指用戶從提交SQL語句開始到獲得結果的那一段時間 資料庫用戶響應時間又可以分為系統服務時間和用戶等待時間兩項 即
資料庫用戶響應時間=系統服務時間 + 用戶等待時間
上述公式告訴我們 獲得滿意的用戶響應時間有兩個途徑 一是減少系統服務時間 即提高資料庫的吞吐量 二是減少用戶等待時間 即減少用戶訪問同一資料庫資源的沖突率
性能優化包括如下幾個部分
ORACLE資料庫性能優化之一 調整數據結構的設計
這一部分在開發信息系統之前完成 程序員需要考慮是否使用ORACLE資料庫的分區功能 對於經常訪問的資料庫表是否需要建立索引等
ORACLE資料庫性能優化之二 調整應用程序結構設計
這一部分也是在開發信息系統之前完成 程序員在這一步需要考慮應用程序使用什麼樣的體系結構 是使用傳統的Client/Server兩層體系結構 還是使用Browser/Web/Database的三層體系結構 不同的應用程序體系結構要求的資料庫資源是不同的
ORACLE資料庫性能優化之三 調整資料庫SQL語句
應用程序的執行最終將歸結為資料庫中的SQL語句執行 因此SQL語句的執行效率最終決定了ORACLE資料庫的性能 ORACLE公司推薦使用ORACLE語句優化器(Oracle Optimizer)和行鎖管理器(row level manager)來調整優化SQL語句
ORACLE資料庫性能優化之四 調整伺服器內存分配
內存分配是在信息系統運行過程中優化配置的 資料庫管理員可以根據資料庫運行狀況調整資料庫系統全局區(SGA區)的數據緩沖區 日誌緩沖區和共享池的大小 還可以調整程序全局區(PGA區)的大小 需要注意的是 SGA區不是越大越好 SGA區過大會佔用操作系統使用的內存而引起虛擬內存的頁面交換 這樣反而會降低系統
ORACLE資料庫性能優化之五 調整硬碟I/O 這一步是在信息系統開發之前完成的
資料庫管理員可以將組成同一個表空間的數據文件放在不同的硬碟上 做到硬碟之間I/O負載均衡
ORACLE資料庫性能優化之六 調整操作系統參數
例如 運行在UNIX操作系統上的ORACLE資料庫 可以調整UNIX數據緩沖池的大小 每個進程所能使用的內存大小等參數
lishixin/Article/program/Oracle/201311/17687
7. Oracle資料庫系統性能優化策略
一個資料庫系統的生命周期可以分成設計 開發和成品三個階段 在設計階段進行資料庫性能優化的成本最低 收益最大 在成品階段進行資料庫性能優化的成本最高 收益最小 資料庫的優化可以通過對網路 硬體 操作系統 資料庫參數和應用程序的優化來進行 最常見的優化手段就是對硬體的升級 據統計 對網路辯敬 硬體 操作系統 資料庫參數進行優化所獲得的性能提升 全部加起來只佔資料庫系統性能提升的 %左右 其餘的 %系統性能提升來自對應用程序的優化 許多優化專家認為 對應用程序的優化可以得到 %的系統性能的提升
一 資料庫性能的優化
資料庫設計是應用程序設計的基礎 其性能直接影響應用程序的性能 資料庫性能包括存儲空間需求量的大小和查詢響應時間的長短兩個方面 為了優化資料庫性能 需要對資料庫中的表進行規范化 規范化的範式可分為第一範式 第二範式 第三範式 BCNF範式 第四範式和第五範式 一般來說 邏輯資料庫設計會滿足規范化的前 級標准 但由於滿足第三範式的表結構容易維護且基本滿足實際應用的要求 因此 實際應用中一般都按照第三範式的標准進行規范化 但是 規范化也有缺點 由於將一個表拆分成為多個表 在查詢時需要多表連接 降低了查詢速度
由於規范化有可能導致查詢速度慢的缺點 考慮到一些應用需要較快的響應速度 在設計表時應同時考慮對某些表進行反規范化 反規范化可以採用以下幾種方法
分割表
分割表包括水平分割和垂直分割
水平分割是按照行將一個表分割為多個表 這可以提高每個表的查詢速度 但查詢 更新時要選擇不同的表 統計時要匯總多個表 因此應用程序會更復雜
垂直分割是對於一個列很多的表 若某些列的訪問頻率遠遠高於其它列 就可以將主鍵和這些列作為一個表 將主鍵和其它列作為另外一個表 通過減少列的寬度 增加了絕山每個數據頁的行數 一次I/O就可以掃描更多的行 從而提高了訪問每一個表的速度 但是由於造成了多表連接 所以應該在同時查詢或更新不同分割表中的列的情況比較少的情況下使用
保留冗餘列
當兩個或多個表在查詢中經常需要連接時 可以在其中一個表上增加若干冗餘的列 以避免表之間的連接過於頻繁 由於對冗餘列的更新操作必須對多個表同步進行 所以一般在冗餘列的數據不經常變動的情況下使用
增加派生列
派生列是由表中的其它多個列計算所得 增加派生列可以減少統計運算 在數據匯總時可以大大縮短運算時間
二 應用程序性能的優化
應用程序的優化通常可分為兩個方面 源代碼和SQL語句 由於涉及到對程序邏輯的改變 源代碼的優化在時間成本和風險上代價很高 而對資料庫系統性能的提升收效有限 因此應用程序的優化應著重在SQL語句的優化 對於海量數據 劣質SQL語句和優質SQL語句之間的速度差別可以達到上百倍 可見對於一個系統不是簡單地能實現其功能就行 而是要寫出高質量的SQL語句 提高系統的可用性
下面就某些SQL語句的where子句編寫中需要注意的問題作詳細介紹 在這些where子句中 即使某些列存在索引 但是由於編寫了劣質的SQL 系統在運行該SQL語句時也不能使用該索引 而同樣使用全表掃描 這就造成了響應速度的極大降低
IS NULL 與 IS NOT NULL
攜宏慎不能用null作索引 任何包含null值的列都將不會被包含在索引中 即使索引有多列的情況下 只要這些列中有一列含有null 該列就會從索引中排除 也就是說如果某列存在空值 即使對該列建索引也不會提高性能
任何在where子句中使用is null或is not null的語句優化器是不允許使用索引的
聯接列
對於有聯接的列 即使最後的聯接值為一個靜態值 優化器不會使用索引的 例如 假定有一個職工表(employee) 對於一個職工的姓和名分成兩列存放(FIRST_NAME和LAST_NAME) 現在要查詢一個叫喬治?布希(Gee Bush)的職工 下面是一個採用聯接查詢的SQL語句
select * from employee where first_name|| ||last_name = Gee Bush
上面這條語句完全可以查詢出是否有Gee Bush這個員工 但是這里需要注意 系統優化器對基於last_name創建的索引沒有使用
當採用下面這種SQL語句的編寫 Oracle系統就可以採用基於last_name創建的索引
Select * From employee where first_name = Gee and last_name = Bush
遇到下面這種情況又如何處理呢?如果一個變數(name)中存放著Gee Bush這個員工的姓名 對於這種情況我們又如何避免全程遍歷使用索引呢?可以使用一個函數 將變數name中的姓和名分開就可以了 但是有一點需要注意 這個函數是不能作用在索引列上 下面是SQL查詢腳本
select * from employee where first_name = SUBSTR( &&name INSTR( &&name ) )
and last_name = SUBSTR( &&name INSTR( &&name )+ )
帶通配符(%)的like語句
同樣以上面的例子來看這種情況 目前的需求是這樣的 要求在職工表中查詢名字中包含Bush的人 可以採用如下的查詢SQL語句
select * from employee where last_name like %Bush%
這里由於通配符(%)在搜尋詞首出現 所以Oracle系統不使用last_name的索引 在很多情況下可能無法避免這種情況 但是一定要心中有底 通配符如此使用會降低查詢速度 然而當通配符出現在字元串其他位置時 優化器就能利用索引 例如 在下面的查詢中索引得到了使用
select * from employee where last_name like c%
Order by語句
Order by語句決定了Oracle如何將返回的查詢結果排序 Order by語句對要排序的列沒有什麼特別的限制 也可以將函數加入列中(象聯接或者附加等) 任何在Order by語句的非索引項或者有計算表達式都將降低查詢速度
仔細檢查order by語句以找出非索引項或者表達式 它們會降低性能 解決這個問題的辦法就是重寫order by語句以使用索引 也可以為所使用的列建立另外一個索引 同時應絕對避免在order by子句中使用表達式
NOT
我們在查詢時經常在where子句使用一些邏輯表達式 如大於 小於 等於以及不等於等等 也可以使用and(與) or(或)以及not(非) NOT可用來對任何邏輯運算符號取反 下面是一個NOT子句的例子
…… where not (status = VALID )
如果要使用NOT 則應在取反的短語前面加上括弧 並在短語前面加上NOT運算符 NOT運算符包含在另外一個邏輯運算符中 這就是不等於(<>)運算符 換句話說 即使不在查詢where子句中顯式地加入NOT詞 NOT仍在運算符中 見下例
…… where status <> INVALID
再看下面這個例子
select * from employee wheresalary<>
對這個查詢 可以改寫為不使用NOT的語句
select * from employee wheresalary< or salary>
雖然這兩種查詢的結果一樣 但是第二種查詢方案會比第一種查詢方案更快些 第二種查詢允許Oracle對salary列使用索引 而第一種查詢則不能使用索引
IN和EXISTS
有時候會將一列和一系列值相比較 最簡單的辦法就是在where子句中使用子查詢 在where子句中可以使用兩種格式的子查詢
第一種格式是使用IN操作符 …… where column in(select * from …… where ……)
第二種格式是使用EXIST操作符 …… where exists (select X from ……where ……)
絕大多數人會使用第一種格式 因為它比較容易編寫 而實際上第二種格式要遠比第一種格式的效率高 在Oracle中可以將幾乎所有的IN操作符子查詢改寫為使用EXISTS的子查詢
第二種格式中 子查詢以 select X 開始 運用EXISTS子句不管子查詢從表中抽取什麼數據它只查看where子句 這樣優化器就不必遍歷整個表而僅根據索引就可完成工作(這里假定在where語句中使用的列存在索引) 相對於IN子句來說 EXISTS使用相連子查詢 構造起來要比IN子查詢困難一些
通過使用EXISTS Oracle系統會首先檢查主查詢 然後運行子查詢直到找到第一個匹配項 這就節省了時間 Oracle系統在執行IN子查詢時 首先執行子查詢 並將獲得的結果列表存放在一個加了索引的臨時表中 在執行子查詢之前 系統先將主查詢掛起 待子查詢執行完畢 存放在臨時表中以後再執行主查詢 這也就是使用EXISTS比使用IN通常查詢速度快的原因
同時應盡可能使用NOT EXISTS來代替NOT IN 盡管二者都使用了NOT(不能使用索引而降低速度) 但NOT EXISTS要比NOT IN查詢效率更高
lishixin/Article/program/Oracle/201311/17060
8. Oracle資料庫大數據量表如何優化
要看數據多到何種程度。
比如一個表的筆數只是幾百,如果不需要和其他大表關聯查詢數據,連索引都不用建。
如果是幾十萬級別的表,一般正確建索引就可以。
如果是千萬級別的表,不但要正確建索引,而且要定時手工進行收集統計信息維護,不建議系統自動維護,以免影響使用性能。
如果是億以上級別的表,則可考慮按一定條件拆分表資料,將舊資料歸檔,這樣可改善生成表的使用。
資料庫優化的同時,程序也要進行相應優化,程序和
數據科學
搭配,才能使性能達到最佳。
9. 資料庫性能優化有哪些措施
1、調整數據結構的設計。這一部分在開發信息系統之前完成,程序員需要考慮是否使用ORACLE資料庫的分區功能,對於經常訪問的資料庫表是否需要建立索引等。
2、調整應用程序結構設計。這一部分也是在開發信息系統之前完成,程序員在這一步需要考慮應用程序使用什麼樣的體系結構,是使用傳統的Client/Server兩層體系結構,還是使用Browser/Web/Database的三層體系結構。不同的應用程序體系結構要求的資料庫資源是不同的。
3、調整資料庫SQL語句。應用程序的執行最終將歸結為資料庫中的SQL語句執行,因此SQL語句的執行效率最終決定了ORACLE資料庫的性能。ORACLE公司推薦使用ORACLE語句優化器(Oracle Optimizer)和行鎖管理器(row-level manager)來調整優化SQL語句。
4、調整伺服器內存分配。內存分配是在信息系統運行過程中優化配置的,資料庫管理員可以根據資料庫運行狀況調整資料庫系統全局區(SGA區)的數據緩沖區、日誌緩沖區和共享池的大小;還可以調整程序全局區(PGA區)的大小。需要注意的是,SGA區不是越大越好,SGA區過大會佔用操作系統使用的內存而引起虛擬內存的頁面交換,這樣反而會降低系統。
5、調整硬碟I/O,這一步是在信息系統開發之前完成的。資料庫管理員可以將組成同一個表空間的數據文件放在不同的硬碟上,做到硬碟之間I/O負載均衡。
6、調整操作系統參數,例如:運行在UNIX操作系統上的ORACLE資料庫,可以調整UNIX數據緩沖池的大小,每個進程所能使用的內存大小等參數。
資料庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,它產生於距今六十多年前,隨著信息技術和市場的發展,特別是二十世紀九十年代以後,數據管理不再僅僅是存儲和管理數據,而轉變成用戶所需要的各種數據管理的方式。資料庫有很多種類型,從最簡單的存儲有各種數據的表格到能夠進行海量數據存儲的大型資料庫系統都在各個方面得到了廣泛的應用。
在信息化社會,充分有效地管理和利用各類信息資源,是進行科學研究和決策管理的前提條件。資料庫技術是管理信息系統、辦公自動化系統、決策支持系統等各類信息系統的核心部分,是進行科學研究和決策管理的重要技術手段。
在經濟管理的日常工作中,常常需要把某些相關的數據放進這樣的「倉庫」,並根據管理的需要進行相應的處理。
例如,企業或事業單位的人事部門常常要把本單位職工的基本情況(職工號、姓名、年齡、性別、籍貫、工資、簡歷等)存放在表中,這張表就可以看成是一個資料庫。有了這個"數據倉庫"我們就可以根據需要隨時查詢某職工的基本情況,也可以查詢工資在某個范圍內的職工人數等等。這些工作如果都能在計算機上自動進行,那我們的人事管理就可以達到極高的水平。此外,在財務管理、倉庫管理、生產管理中也需要建立眾多的這種"資料庫",使其可以利用計算機實現財務、倉庫、生產的自動化管理。
(9)oracle資料庫優化方案擴展閱讀
資料庫,簡單來說是本身可視為電子化的文件櫃--存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。
資料庫指的是以一定方式儲存在一起、能為多個用戶共享、具有盡可能小的冗餘度的特點、是與應用程序彼此獨立的數據集合。
在經濟管理的日常工作中,常常需要把某些相關的數據放進這樣的"倉庫",並根據管理的需要進行相應的處理。
例如,企業或事業單位的人事部門常常要把本單位職工的基本情況(職工號、姓名、年齡、性別、籍貫、工資、簡歷等)存放在表中,這張表就可以看成是一個資料庫。有了這個"數據倉庫"我們就可以根據需要隨時查詢某職工的基本情況,也可以查詢工資在某個范圍內的職工人數等等。這些工作如果都能在計算機上自動進行,那我們的人事管理就可以達到極高的水平。此外,在財務管理、倉庫管理、生產管理中也需要建立眾多的這種"資料庫",使其可以利用計算機實現財務、倉庫、生產的自動化管理。
10. 資料庫性能優化有哪些措施
1、調整數據結構的設計
這一部分在開發信息系統之前完成,程序員需要考慮是否使用ORACLE資料庫的分區功能,對於經常訪問的資料庫表是否需要建立索引等。
2、調整應用程序結構設計
這一部分也是在開發信息系統之前完成,程序員在這一步需要考慮應用程序使用什麼樣的體系結構,是使用傳統的Client/Server兩層體系結構,還是使用Browser/Web/Database的三層體系結構。不同的應用程序體系結構要求的資料庫資源是不同的。
3、調整資料庫SQL語句
應用程序的執行最終將歸結為資料庫中的SQL語句執塌巧行,因此SQL語句的執行效率最終決定了ORACLE資料庫的性能。ORACLE公司推薦使用ORACLE語句優化器(OracleOptimizer)和行鎖管理器(row-levelmanager)來調整優化SQL語句。
4、調整伺服器內存分配
內存分配是在信息系統運行過程中優化配置的,資料庫管理員可以根據資料庫運行狀況調整資料庫系統全局區(SGA區)的數據緩沖區、日誌緩沖區和共享池的大小;還可以調整程序全局區(PGA區)的大小。需要注意的是,SGA區不是越大越好,SGA區過大會佔用操作系統使用的內存而引起虛擬內存的頁面交換,這樣反而會降低系統。
5、調整硬碟I/O
這一步是在信息系統開發之前完成的。資料庫管理員可以將組成同一個表空間的數據文件放在不同的硬碟上,做到硬碟之間I/O負載均衡。
6、調整操作系統參數
例如:運行在UNIX操作系統上的ORACLE資料庫,可以調整UNIX數據緩沖池的大小,每個進程所能使用的內存大小等參數。
實際上,上述資料庫優化措施之間是相互聯系的。ORACLE資料庫性能惡化表現基本上都是用戶響應時間比較長,需要用戶長時間的等待。但性能惡化的原因卻是多種多樣的,有時是多個因素共同造成了性能惡化的結果,這就需要資料庫管理員有比較全面的計算機知識,能夠敏感地察覺到影響資料庫性能的主要原因所在。另外,良好的資料庫管理工具對於優化資料庫性能也是很重要的。
一、ORACLE資料庫性能優化工具
常用的資料庫性能優化工具有:
ORACLE資料庫在線數據字典,ORACLE在線數據字典能夠反映出ORACLE動態運行情況,對於調整資料庫性能是很有幫助的。
操作系統工具,例如UNIX操作系統的vmstat,iostat等命令可以查看到系統系統級內存和硬碟I/O的使用情況,這些工具對於管理員弄清出系統瓶頸出現在什麼地方有時候很有用。
SQL語言跟蹤工雀皮具(SQLTRACEFACILITY),SQL語言跟蹤工具可以記錄SQL語句的執行情況,管理員可以使用虛擬表來調整實例,使用SQL語句跟蹤文件調整應用程序性能。SQL語言跟蹤工具將結果輸出成一個操作系統的文件,管理員可以使用TKPROF工具查看這些文件。
ORACLEEnterpriseManager(OEM),這是一個圖形的用戶管理界面,用戶可以使用它方便地進行資料庫管理而不必記住復雜的ORACLE資料庫管理的命令。
EXPLAINPLAN——SQL語言優化命令,使用這個命令可以幫助程序員寫出高效的SQL語言。
二、ORACLE資料庫的系統性能評估
信息系統的類型不同,需要關注的資料庫參數也是不同的。資料庫管理員需要根據自己的信息系統的類型著重考慮不同的資料庫參數。
1、在線事務處理信息系統(OLTP),這種類型的信息系統一般需要有大量的Insert、Update操作,典型的系統包括民航機票發售系統、銀行儲蓄系統等。OLTP系統需要保證資料庫的並發性、可靠性和最終用戶的速度,這類系統使用的ORACLE資料庫需要主要考慮下述參數:
資料庫回滾段團歲鍵是否足夠?
是否需要建立ORACLE資料庫索引、聚集、散列?
系統全局區(SGA)大小是否足夠?
SQL語句是否高效?
2、數據倉庫系統(DataWarehousing),這種信息系統的主要任務是從ORACLE的海量數據中進行查詢,得到數據之間的某些規律。資料庫管理員需要為這種類型的ORACLE資料庫著重考慮下述參數:
是否採用B*-索引或者bitmap索引?
是否採用並行SQL查詢以提高查詢效率?
是否採用PL/SQL函數編寫存儲過程?
有必要的話,需要建立並行資料庫提高資料庫的查詢效率
三、SQL語句的調整原則
SQL語言是一種靈活的語言,相同的功能可以使用不同的語句來實現,但是語句的執行效率是很不相同的。程序員可以使用EXPLAINPLAN語句來比較各種實現方案,並選出最優的實現方案。總得來講,程序員寫SQL語句需要滿足考慮如下規則:
1、盡量使用索引。試比較下面兩條SQL語句:
語句A:SELECTdname,
(SELECTdeptnoFROMemp);
語句B:SELECTdname,deptnoFROMdeptWHERENOTEXISTS
(SELECTdeptnoFROMempWHEREdept.deptno=emp.deptno);
這兩條查詢語句實現的結果是相同的,但是執行語句A的時候,ORACLE會對整個emp表進行掃描,沒有使用建立在emp表上的deptno索引,執行語句B的時候,由於在子查詢中使用了聯合查詢,ORACLE只是對emp表進行的部分數據掃描,並利用了deptno列的索引,所以語句B的效率要比語句A的效率高一些。
2、選擇聯合查詢的聯合次序。考慮下面的例子:
SELECTstuffFROMtabaa,tabbb,tabcc
WHEREa.acolbetween:alowand:ahigh
ANDb.bcolbetween:blowand:bhigh
ANDc.ccolbetween:clowand:chigh
ANDa.key1=b.key1
AMDa.key2=c.key2;
這個SQL例子中,程序員首先需要選擇要查詢的主表,因為主表要進行整個表數據的掃描,所以主表應該數據量最小,所以例子中表A的acol列的范圍應該比表B和表C相應列的范圍小。
3、在子查詢中慎重使用IN或者NOTIN語句,使用where(NOT)exists的效果要好的多。
4、慎重使用視圖的聯合查詢,尤其是比較復雜的視圖之間的聯合查詢。一般對視圖的查詢最好都分解為對數據表的直接查詢效果要好一些。
5、可以在參數文件中設置SHARED_POOL_RESERVED_SIZE參數,這個參數在SGA共享池中保留一個連續的內存空間,連續的內存空間有益於存放大的SQL程序包。
6、ORACLE公司提供的DBMS_SHARED_POOL程序可以幫助程序員將某些經常使用的存儲過程「釘」在SQL區中而不被換出內存,程序員對於經常使用並且佔用內存很多的存儲過程「釘」到內存中有利於提高最終用戶的響應時間。
四、CPU參數的調整
CPU是伺服器的一項重要資源,伺服器良好的工作狀態是在工作高峰時CPU的使用率在90%以上。如果空閑時間CPU使用率就在90%以上,說明伺服器缺乏CPU資源,如果工作高峰時CPU使用率仍然很低,說明伺服器CPU資源還比較富餘。
使用操作相同命令可以看到CPU的使用情況,一般UNIX操作系統的伺服器,可以使用sar_u命令查看CPU的使用率,NT操作系統的伺服器,可以使用NT的性能管理器來查看CPU的使用率。
資料庫管理員可以通過查看v$sysstat數據字典中「CPUusedbythissession」統計項得知ORACLE資料庫使用的CPU時間,查看「OSUserlevelCPUtime」統計項得知操作系統用戶態下的CPU時間,查看「OSSystemcallCPUtime」統計項得知操作系統系統態下的CPU時間,操作系統總的CPU時間就是用戶態和系統態時間之和,如果ORACLE資料庫使用的CPU時間占操作系統總的CPU時間90%以上,說明伺服器CPU基本上被ORACLE資料庫使用著,這是合理,反之,說明伺服器CPU被其它程序佔用過多,ORACLE資料庫無法得到更多的CPU時間。
資料庫管理員還可以通過查看v$sesstat數據字典來獲得當前連接ORACLE資料庫各個會話佔用的CPU時間,從而得知什麼會話耗用伺服器CPU比較多。
出現CPU資源不足的情況是很多的:SQL語句的重解析、低效率的SQL語句、鎖沖突都會引起CPU資源不足。
1、資料庫管理員可以執行下述語句來查看SQL語句的解析情況:
SELECT*FROMV$SYSSTATWHERENAMEIN
('parsetimecpu','parsetimeelapsed','parsecount(hard)');
這里parsetimecpu是系統服務時間,parsetimeelapsed是響應時間,用戶等待時間,waitetime=parsetimeelapsed_parsetimecpu
由此可以得到用戶SQL語句平均解析等待時間=waitetime/parsecount。這個平均等待時間應該接近於0,如果平均解析等待時間過長,資料庫管理員可以通過下述語句
SELECTSQL_TEXT,PARSE_CALLS,EXECUTIONSFROMV$SQLAREA
ORDERBYPARSE_CALLS;
來發現是什麼SQL語句解析效率比較低。程序員可以優化這些語句,或者增加ORACLE參數SESSION_CACHED_CURSORS的值。
2、資料庫管理員還可以通過下述語句:
SELECTBUFFER_GETS,EXECUTIONS,SQL_TEXTFROMV$SQLAREA;
查看低效率的SQL語句,優化這些語句也有助於提高CPU的利用率。
3、資料庫管理員可以通過v$system_event數據字典中的「latchfree」統計項查看ORACLE資料庫的沖突情況,如果沒有沖突的話,latchfree查詢出來沒有結果。如果沖突太大的話,資料庫管理員可以降低spin_count參數值,來消除高的CPU使用率。
五、內存參數的調整
內存參數的調整主要是指ORACLE資料庫的系統全局區(SGA)的調整。SGA主要由三部分構成:共享池、數據緩沖區、日誌緩沖區。
1、共享池由兩部分構成:共享SQL區和數據字典緩沖區,共享SQL區是存放用戶SQL命令的區域,數據字典緩沖區存放資料庫運行的動態信息。資料庫管理員通過執行下述語句:
select(sum(pins-reloads))/sum(pins)"LibCache"fromv$librarycache;
來查看共享SQL區的使用率。這個使用率應該在90%以上,否則需要增加共享池的大小。資料庫管理員還可以執行下述語句:
select(sum(gets-getmisses-usage-fixed))/sum(gets)"RowCache"fromv$rowcache;
查看數據字典緩沖區的使用率,這個使用率也應該在90%以上,否則需要增加共享池的大小。
2、數據緩沖區。資料庫管理員可以通過下述語句:
SELECTname,valueFROMv$sysstatWHEREnameIN('dbblockgets','consistentgets','physicalreads');
來查看資料庫數據緩沖區的使用情況。查詢出來的結果可以計算出來數據緩沖區的使用命中率=1-(physicalreads/(dbblockgets+consistentgets))。
這個命中率應該在90%以上,否則需要增加數據緩沖區的大小。
3、日誌緩沖區。資料庫管理員可以通過執行下述語句:
selectname,valuefromv$sysstatwherenamein('redoentries','redologspacerequests');
查看日誌緩沖區的使用情況。查詢出的結果可以計算出日誌緩沖區的申請失敗率:
申請失敗率=requests/entries,申請失敗率應該接近於0,否則說明日誌緩沖區開設太小,需要增加ORACLE資料庫的日誌緩沖區。
昌平北大青鳥java培訓班轉載自網路如有侵權請聯系我們感謝您的關注謝謝支持