影響SQL性能的源頭

【IT168 技術文檔】任何事情都有它的源頭,要解決問題,也得從源頭開始,影響ORACLE性能的源頭很是多,主要包括以下方面:數據庫的硬件配置:CPU、內存、網絡條件。sql

  1. CPU:在任何機器中CPU的數據處理能力每每是衡量計算機性能的一個標誌,而且ORACLE是一個提供並行能力的數據庫系統,在CPU方面的要求就更高了,若是運行隊列數目超過了CPU處理的數目,性能就會降低,咱們要解決的問題就是要適當增長CPU的數量了,固然咱們還能夠將須要許多資源的進程KILL掉;數據庫

  2. 內存:衡量機器性能的另一個指標就是內存的多少了,在ORACLE中內存和咱們在建數據庫中的交換區進行數據的交換,讀數據時,磁盤I/O必須等待物理I/O操做完成,在出現ORACLE的內存瓶頸時,咱們第一個要考慮的是增長內存,因爲I/O的響應時間是影響ORACLE性能的主要參數,我將在這方面進行詳細的講解緩存

  3. 網絡條件:NET*SQL負責數據在網絡上的來往,大量的SQL會令網絡速度變慢。好比10M的網卡和100的網卡就對NET*SQL有很是明顯的影響,還有交換機、集線器等等網絡設備的性能對網絡的影響很明顯,建議在任何網絡中不要試圖用3個集線器來將網段互聯。網絡

  OS參數的設置異步

  下表給出了OS的參數設置及說明,DBA能夠根據實際須要對這些參數進行設置xss

  內核參數名async

  說明性能

  bufpages大數據

  對buffer空間不按靜態分配,採用動態分配,使bufpages值隨nbuf一塊兒對buffer空間進行動態分配。spa

  create_fastlinks

  對HFS文件系統容許快速符號連接

  dbc_max_pct

  加大最大動態buffer空間所佔物理內存的百分比,以知足應用系統的讀寫命中率的須要。

  dbc_min_pct

  設置最小動態buffer空間所佔物理內存的百分比

  desfree

  提升開始交換操做的最低空閒內存下限,保障系統的穩定性,防止出現不可預見的系統崩潰(Crash)。

  fs_async

  容許進行磁盤異步操做,提升CPU和磁盤的利用率

  lotsfree

  提升系統解除換頁操做的空閒內存的上限值,保證應用程序有足夠的可用內存空間。

  maxdsiz

  針對系統數據量大的特色,加大最大數據段的大小,保證應用的須要。(32位)

  maxdsiz_64bit

  maximum process data segment size for 64_bit

  Maxssiz

  加大最大堆棧段的大小。(32_bit)

  maxssiz_64bit

  加大最大堆棧段的大小。(64_bit)

  Maxtsiz

  提升最大代碼段大小,知足應用要求

  maxtsiz_64bit

  原值過大,應調小

  Minfree

  提升中止交換操做的自由內存的上限

  Shmem

  容許進行內存共享,以提升內存的利用率

  Shmmax

  設置最大共享內存段的大小,徹底知足目前的須要

  Timeslice

  因爲系統的瓶頸主要反映在磁盤I/O上,所以 下降時間片的大小,一方面可避免因磁盤I/O不順暢形成CPU的等待,從而提升了CPU的綜合利用率。另外一方面減小了進程的阻塞量。

  unlockable_mem

  提升了不可鎖內存的大小,使可用於換頁和交換的內存空間擴大,用以知足系統對內存管理的要求。

用戶SQL質量

  以上講的都是硬件方面的東西,在條件有限的條件下,咱們能夠調整應用程序的SQL質量:

  1. 不要進行全表掃描(Full Table Scan):全表掃描致使大量的I/O

  2. 儘可能建好和使用好索引:建索引也是有講究的,在建索引時,也不是索引越多越好,當一個表的索引達到4個以上時,ORACLE的性能可能仍是改善不了,由於OLTP系統每表超過5個索引即會下降性能,並且在一個sql 中, Oracle 從不能使用超過 5個索引;當咱們用到GROUP BY和ORDER BY時,ORACLE就會自動對數據進行排序,而ORACLE在INIT.ORA中決定了sort_area_size區的大小,當排序不能在咱們給定的排序區完成時,ORACLE就會在磁盤中進行排序,也就是咱們講的臨時表空間中排序, 過多的磁盤排序將會令 free buffer waits 的值變高,而這個區間並不僅是用於排序的,對於開發人員我提出以下忠告:

  1)、select,update,delete 語句中的子查詢應當有規律地查找少於20%的錶行.若是一個語句查找的行數超過總行數的20%,它將不能經過使用索引得到性能上的提升.

  2)、索引可能產生碎片,由於記錄從表中刪除時,相應也從表的索引中刪除.表釋放的空間能夠再用,而索引釋放的空間卻不能再用.頻繁進行刪除操做的被索引的表,應當階段性地重建索引,以免在索引中形成空間碎片,影響性能.在許可的條件下,也能夠階段性地truncate表,truncate命令刪除表中全部記錄,也刪除索引碎片.

  3)、在使用索引時必定要按索引對應字段的順序進行引用。

  4)、用(+)比用NOT IN更有效率。

  下降ORACLE的競爭:

  先講幾個ORACLE的幾個參數,這幾個參數關係到ORACLE的競爭:

  1)、freelists 和 freelist 組:他們負責ORACLE的處理表和索引的空間管理;

  2)、pctfree 及 pctused:該參數決定了freelists 和 freelist 組的行爲,pctfree 和pctused 參數的惟一目的就是爲了控制塊如何在 freelists 中進出

  設置好pctfree 及 pctused對塊在freelists的移走和讀取很重要。

  其餘參數的設置

  1)、包括SGA區(系統全局區):系統全局區(SGA)是一個分配給Oracle 的包含一個 Oracle 實例的數據庫的控制信息內存段。

  主要包括數據庫高速緩存(the database buffer cache),

  重演日誌緩存(the redo log buffer),

  共享池(the shared pool),

  數據字典緩存(the data dictionary cache)以及其它各方面的信息

  2)、db_block_buffers(數據高速緩衝區)訪問過的數據都放在這一片內存區域,該參數越大,Oracle在內存中找到相同數據的可能性就越大,也即加快了查詢速度。

  3)、share_pool_size (SQL共享緩衝池):該參數是庫高速緩存和數據字典的高速緩存。

  4)、Log_buffer (重演日誌緩衝區)

  5)、sort_area_size(排序區)

  6)、processes (同時鏈接的進程數)

  7)、db_block_size (數據庫塊大小):Oracle默認塊爲2KB,過小了,由於若是咱們有一個8KB的數據,則2KB塊的數據庫要讀4次盤,才能讀完,而8KB塊的數據庫只要1次就讀完了,大大減小了I/O操做。數據庫安裝完成後,就不能再改變db_block_size的值了,只能從新創建數據庫而且建庫時,要選擇手工安裝數據庫。

  8)、open_links (同時打開的連接數)

  9)、dml_locks

  10)、open_cursors (打開光標數)

  11)、dbwr_io_slaves (後臺寫進程數)

 

  6. IN和EXISTS

  有時候會將一列和一系列值相比較。最簡單的辦法就是在where子句中使用子查詢。在where子句中可使用兩種格式的子查詢。

  第一種格式是使用IN操做符:

... where column in(select * from ... where ...);

第二種格式是使用EXIST操做符:

... where exists (select 'X' from ...where ...);

相關文章
相關標籤/搜索