1. 程式人生 > >SQL語句優化(一)

SQL語句優化(一)

當一條SQL語句從客戶端程序傳遞到伺服器端程序後,Oracle需要執行如下步驟:

  • 在共享池中搜索SQL語句是否已經存在;
  • 驗證SQL語句的語法是否正確;
  • 執行資料字典來驗證表和列的定義;
  • 獲取物件的分析鎖,以便在語句的分析過程中物件的定義不會改變;
  • 檢查使用者是否具有相應的操作許可權;
  • 確定語句的最佳執行計劃;
  • 將語句和執行方案儲存到共享的SQL區;

1)select語句中避免使用“*”

Oracle系統需要通過資料字典將語句中的“*”轉換成表中的所有列名,然後再執行查詢操作,這自然要比直接使用列名花費更多的時間。

若共享池中存在要執行的SQL語句,Oracle會重用已解析過的語句的執行計劃和優化方案,執行時間減少。

2)使用where子句替代having子句

where子句和having子句都可以用來過濾資料行,但having子句會在檢索出所有記錄後才對結果集進行過濾(先分組再過濾);而使用where子句就會減少這方面的開銷(先過濾再分組)。因此,一般的過濾條件應該儘量讓where子句實現。

having子句一般用於對一些集合函式執行結果的過濾,如count()、avg()等。

3)使用truncate替代delete

使用delete刪除表中的所有資料時Oracle會對資料逐行刪除,且使用回滾段記錄刪除操作,若使用者在沒有使用commit提交之前使用rollback命令進行回滾操作,則Oracle會將表中的資料恢復到刪除之前的狀態。

使用truncate語句刪除表中的所有資料行時,Oracle不會再撤銷表空間中記錄刪除操作,即不能使用rollback恢復,這就提高了語句的執行速度。且這種刪除是一次性的,也就是執行一次truncate語句,所有的資料行是在同一時間被刪除。

truncate只能實現刪除表中的全部資料,若需要刪除某一條記錄,還需要使用delete語句進行操作。

4)在確保完整性的情況下多用commit語句

使用者執行DML操作後,若不使用commit進行提交,則Oracle會在回滾段中記錄DML操作,以便使用者使用rollback命令對資料進行恢復。Oracle實現這種資料回滾功能,需要花費相應的時間和空間資源。

使用commit命令後,系統將釋放回滾段上記錄的DML操作資訊、被程式語句獲得的鎖、Redo Log Buffer中的空間以及Oracle系統管理前面3種資源所需要的其他開銷。

5)使用表連線而不是多個查詢

一般情況下,從多個相關表中檢索資料時,執行表連線比使用多個查詢的效率更高。在執行每條查詢語句時,Oracle內部執行了許多工作----解析SQL語句、估算索引的利用率、繫結變數,以及讀取資料塊等。因此,要儘量減少訪問SQL語句的執行次數,即儘量減少表的查詢次數。可以使用一次查詢獲得的資料,儘量不要通過兩次或更多次的查詢獲得。

6)使用exists替代in

in操作符用於檢查一個值是否包含在列表中。exists與in不同,exists只檢查行的存在性,而in檢查實際的值。在子查詢中,exists提供的效能通常比in提供的效能要好。因此建議使用exists操作符來替代in操作符的使用,使用not exists替代not in,來提高查詢的執行效率。

7)使用exists替代distinct

在連線查詢的select語句中,distinct關鍵字用於禁止重複行的顯示;exists用於檢查子查詢返回的行的存在性。儘量使用exists替代distinct,因為distinct在禁止重複行顯示之前要排序檢索到的行。

8)使用<=替代<

這兩個運算子的區別在於,如果使用x<8888,則Oracle會定位到8888,然後再去尋找比8888小的資料;如果使用x<=8887,則Oracle會直接定位到等於8887的數。雖然這種優化顯得差別不大,但是在查詢的資料量較大,尤其是在迴圈語句中使用這兩個比較操作符時,區別會是很明顯的。

9)使用完全限定的列引用

在查詢中包含多個表時,為每個表指定表別名,並且為所引用的每列都顯示地指定合適的別名,這稱為完全限定 的列引用。這樣,資料庫不需要查詢所操作的表中包含了哪些的列,也就減少了解析列的時間,以及由列歧義引起的語法錯誤(列歧義指SQL語句中不同的表具有相同的列名,當SQL語句中出現這個列時,SQL解析器無法判斷這個列屬於哪個表)。

相關推薦

SQL語句優化

當一條SQL語句從客戶端程序傳遞到伺服器端程序後,Oracle需要執行如下步驟: 在共享池中搜索SQL語句是否已經存在;驗證SQL語句的語法是否正確;執行資料字典來驗證表和列的定義;獲取物件的分析鎖,以便在語句的分析過程中物件的定義不會改變;檢查使用者是否具有相應的操作許

Orcle的sql語句優化1

name 即使 緩沖 mode 數據塊 如何 ack 訪問 從右到左 1. 選用適合的ORACLE優化器 ORACLE的優化器共有3種: a. RULE (基於規則) b. COST (基於成本) c. CHOOSE (選擇性) 設置缺省的優化器,可以通過對init.o

SQL語句學習----通用語法,DDL,DML基礎語句

生效 mod 當前 輸入 ddl 窗口 str integer structure 1.1 SQL概述 1.1.1 SQL語句介紹   結構化查詢語言(Structured Query Language)簡稱SQL,是關系型數據庫管理系統都需要遵循的規範。不

SQL語句查詢

條件判斷 a、CASE表示式      語法1: SELECT case 欄位 when 條件1 then 表示式1 when 條件2 then 表示式2 else 表示式n end 語法2: SEL

資料庫效能之SQL語句優化

百萬級資料優化 一.I_IPTVLOGIN00 (五十萬),TEMP_STBINFO (五百萬) 1.select a.loginAccount,a.stbID,b.DEV_SNO from I_IPTVLOGIN00 a,TEMP_STBINFO b where a.s

SQL語句彙總

"SQL"是 “Structured Query Language” 即“結構化查詢語言”的簡稱,它是用來管理關係型資料庫的。 其包括: –資料定義語言(DDL) –資料查詢語言(DQL) –資料操作語言(DML) –資料控制語言(DCL) 建立資料庫: CREATE DAT

MySQL5.7效能優化系列——SQL語句優化2——子查詢-派生表-檢視--概述

章節內容: 使用Semi-join連線優化子查詢、派生表、檢視 使用Materialization優化子查詢 優化派生表、檢視 使用Exist 策略優化子查詢 概述 in或者any子查詢 MySQL查詢優化器具有不同的策略來評估子查詢。對於IN(

數據庫性能優化SQL語句優化轉 java知音

可能 資源 詳細介紹 有助於 效果 這就是 詳細 分組統計 完全 一、問題的提出 在應用系統開發初期,由於開發數據庫數據比較少,對於查詢SQL語句,復雜視圖的編寫等體會不出SQL語句各種寫法的性能優劣,但是如果將應用系統提交實際應用後,隨著數據庫中數據的增加,系統的

Mysql數據庫性能優化

效率 dir sort variables 緩存 模型 mysql5.6 包含 dpt 參考 http://www.jb51.net/article/82254.htm 今天,數據庫的操作越來越成為整個應用的性能瓶頸了,這點對於Web應用尤其明顯。關於數據庫的性能,這並不只

NFS部署及優化

linux nfs 文件權限NFS部署及優化(一)一、NFS的基本概念NFS == network file system 網絡文件系統必然通過網絡通信來實現文件的訪問和寫入,所以做這個實驗的話最好有兩臺虛擬機配置:A:一個192.169.50.201為server端B:一個192.169.50.200

Android內存優化DVM和ART原理初探

java虛擬機 劃分 cimage beef 靜態 由於 jar blank 查找 要學習Android的內存優化,首先要了解Java虛擬機,此前我用了多篇文章來介紹Java虛擬機的知識,就是為了這個系列做鋪墊。在Android開發中我們接觸的是與Java虛擬機類似的Dal

mysql性能優化

配置文件 mysql 數據庫 網絡 信息 mysql性能優化、慢查詢分析、優化索引和配置一.每項的基本思路步驟1.性能瓶頸定位:show命令、慢查詢日誌、explain分析查詢、profiling分析查詢、2.索引及查詢優化3.配置優化二.my

MySQL階段二——sql語句基礎2

mysql數據查詢操作 01.創建數據表 (02-05練習) (連接查詢練習使用) 02.單表查詢 03.分組統計 04.嵌套查詢 05.集合查詢 06.連接查詢 07.連接查詢與集合查詢的不同 數據查詢操作01.創建數據表 1)創建Student表 (2)創建Course表

MySQL階段二——sql語句基礎3

mysqlOutfile 註意: Insert詳解 delete和update相關 視圖 01.視圖創建 02.視圖相關定義 03.視圖創建詳解 04.刪除視圖 05.視圖查詢 06.更新視圖 07.視圖的執行過程 觸發器 01.定義觸發器 02.操作觸發器 03.註意 Outfile將

PL/SQL 編程基礎,變量,分支,循環,異常

變量類型 set art blog replace 過程 value ase ng- SQL和PL/SQL: SQL 結構化查詢語言(Structural Query Language),是用來訪問和操作關系型數據庫的一種標準通用語言,屬於第四代語言(4GL)。可以方便的

SEO搜索引擎優化

robots 競價排名 分享 height for span 抓取 瀏覽器 頁面 什麽是SEO呢   英文為“Search Engine Optimization”,中文名為“搜索引擎優化”。SEO是指通過對網站進行站內優化和修復(網站Web結構調整、網站內容建設、網站代碼

SQL語句優化系列

sql語句 sid 前綴 別名 text pre 操作 解析 歧義 SQL語句優化 1.SELECT 子句中避免使用‘* ’ 2.使用表的別名 (Alias) 當在 SQL 語句中連接多個表時 , 請使用表的別名並把別名前綴於每個 Column 上。這樣一來,就可以減

SQL夯實基礎:inner join、outer join和cross join的區別

創建 color varchar mage bubuko where 是你 cross http 一、數據構建 先建表,再說話 create database Test use Test create table A ( AID int identity(1

前端性能優化:桌面瀏覽器前端優化策略

data lan ucc 靜態 sync 怎樣 拆分 打包成 pan 摘要: 前端性能優化是一個很寬泛的概念,本書前面的部分也多多少少提到一些前端優化方法,這也是我們一直在關註的一件重要事情。配合各種方式、手段、輔助系統,前端優化的最終目的都是提升用戶體驗,改善頁面性能,我

PL/SQL 上機練習

and 系列 begin dbm BE str2 合並 where sel _(:_」∠)_ _(:_」∠)_ _(:_」∠)_騙訪問量系列_(:_」∠)_ _(:_」∠)_ _(:_」∠)_ 題目描述: 對員工表中所有員工的姓名做如下處理:姓名的首字母在‘A‘到‘G‘ 之