1. 程式人生 > >SQL優化的一點點心得體會-子查詢的使用和有效查詢引數

SQL優化的一點點心得體會-子查詢的使用和有效查詢引數

子查詢是指S E L E C T語句巢狀在另一個 S Q L語句中。 子查詢的兩種形式: 資料集合 行級 子查詢可帶來很好的可讀性效果。

子查詢——資料集合

資料集合的子查詢--->檢視

SELECT a.title_id, a.title,b.qty FROM titles a,(SELECT title_id,qty FROM sales WHERE qty > 30) b where a.title_id = b.title_id

效率高,可讀性好,推薦        

子查詢中的列名儘量簡化 可同以下語句比較:  我執行的效率是一樣的,但建議優先選用子查詢的寫法。

SELECT a.title_id, a.title,b.qty FROM titles a,sales b where a.title_id = b.title_id and b. qty > 30

子查詢——行級

行級的子查詢     

SELECT title_id, title,(select top 1 qty FROM sales b where a.title_id = b.title_id and b.qty > 30 order by title_ID)  as qty FROM titles a

可讀性好 效率不高 不推薦  

建議:變形為資料集合的子查詢  

SELECT a.title_id, a.title,b.qty FROM titles a left join  (SELECT top 1 qty,title_ID FROM sales WHERE qty > 30 order by title_ID) b on a.title_id = b.title_id and b.F_ID = 1

DELETE、UPDATE中的子查詢(多表)使用

實現依據其他表的資料對本表資料進行操作

Update titles set a.qty = b.qty From titles a,(select title_id ,sum(qty) qty from sales group by title_id )b Where a. title_id  = b. title_id

有效的查詢引數(SARG :search argument )

WHERE條件符合SARG規則的SQL語句才有可能使用到合適的索引。

不符合SARG規則的SQL語句只能採用全表掃描(索引掃描)的方式。

包含的運算子: =、<、>、<=、>=、betweeen 部分like   (檢視%的字元)

不要對資料欄位做運算、使用函式

where substring(F_Areacode,1,2) =‘WH’ Where convert(char(10),getdate(),120) = ‘2010-11-12’ 效率不高,無法利用可能的索引,必須通過全表(或索引)掃描的方式檢索;使用函式需要額外增加資料處理過程。

不要使用負向查詢 使用負向運算子:NOT、!= 、<>、NOT Exists、NOT IN、NOT LIKE等。

負向查詢 ->不要什麼資料,其餘的都要 無法利用索引、效率不高。

案例:USE Northwind        --使用SQL SERVER自帶的Northwind資料庫

--非不符合SARG的SQL:

1、SELECT * FROM Employees WHERE SUBSTRING(LastName, 1, 1) = 'D'

2、SELECT * FROM Orders WHERE DATEPART(yyyy,OrderDate)=1996 AND DATEPART(mm,OrderDate)=8 AND DATEPART(dd,OrderDAte) BETWEEN 1 AND 2

3、SELECT * FROM [Order Details] WHERE ABS(Quantity-100)<1

----轉化後的符合SARG的SQL:

1、SELECT * FROM Employees WHERE LastName LIKE 'D%'      

SELECT * FROM Employees WHERE LastName >= 'D' AND LastName < 'E'

2、SELECT * FROM Orders WHERE OrderDate BETWEEN '19960801' AND '19960802'

3、SELECT * FROM [Order Details] WHERE Quantity > 99 AND Quantity < 101

SQL一些小貼士

1、謹慎使用OR、IN(等同於OR)

2、使用AND運算子連線的多個條件中只要有適當的索引,即可利用,

3、使用OR運算子連線的多個條件中必須全部有適當的索引,才可利用。 謹慎使用。 建議可考慮拆分,然後使用union all或union 進行關聯。

4、根據需要選擇使用Distinct、Order By等語句(會額外使用雜湊關聯) 。

5、大資料量插入,SELECT INTO比逐條SELECT效率高 。

6、清空資料表,TRUNCATE TABLE比DELETE TABLE效率高

7、Union All 及 Union 能使用Union All的時候就不要使用Union