SQL 效能調校
20160311 ken
Like Operator-1
 SELECT * FROM
[EMPLOYEE]
WHERE Name LIKE ‘D%'
 SELECT * FROM
[EMPLOYEE]
WHERE Name LIKE ‘%D'
Like Operator-2
 _dv.test.Where(x=> x.Name.ToString().Contains("1"));
SELECT [t0].[SN], [t0].[aaa]
FROM [test] AS [t0]
WHERE (CONVERT(NVarChar,[t0].[aaa])) LIKE @p0
 _dc.test.Where(x=> x.Name.ToString().Equals("1"));
SELECT [t0].[SN], [t0].[aaa]
FROM [test] AS [t0]
WHERE (CONVERT(NVarChar,[t0].[aaa])) = @p0
欄位進行運算或使用函數-1
SELECT Name, salary
FROM Employee
WHERE salary * 12 >= 700000
SELECT Name, salary
FROM Employee
WHERE salary >= 700000 /12
欄位進行運算或使用函數-2
SELECT FirstName
FROM EMPLOYEE
WHERE
SUBSTRING(FirstName,1,1) = '林'
SELECT FirstName
FROM EMPLOYEE
WHERE
FirstName LIKE '林%'
OR Operator
SELECT * FROM Orders
WHERE
CustomerID='VINET'
OR
Freight=32.3800
SELECT * FROM Orders
WHERE
CustomerID='VINET'
UNION
SELECT * FROM Orders
WHERE Freight=32.3800
子查詢(Subquery)
「獨立子查詢」
(Uncorrelated Subquery)
SELECT Name, Description
FROM Products
WHERE Quantity < 2 *
(
SELECT AVG( Quantity )
FROM Sales
);
「關聯子查詢」
(Correlated Subquery)
SELECT Name, Description
FROM Products
WHERE Quantity < 2 *
(
SELECT AVG( Quantity )
FROM Sales
WHERE Products.ID=Sales.ProductID
);
OUTER JOIN & NOT IN
SELECT E.ID
FROM Employee E
WHERE E.ID
NOT IN
(Select ID From SalaryAdj)
SELECT E.ID
FROM Employee E
LEFT JOIN SalaryAdj S
ON E.ID = S.ID
WHERE S.ID IS NULL
Join Table
SELECT a.id
FROM lxw1234_a a
left outer join partitioned b
ON (a.id = b.url);
WHERE b.day = ‘2015-05-10′
SELECT a.id
FROM lxw1234_a a
left outer join partitioned b
ON (
a.id = b.url
AND b.day = ‘2015-05-10′
);
SQL 效能-1
 避免大量的排序操作
 儘可能使用 (Stored Procedure)取代直接存取資料表
 若一個資料表的欄位過多,應垂直切割成兩個以上的資料表,
並用同名的 Primary Key 一對多連結起來,以避免在存取資
料時,或修改資料時造成互相鎖定或鎖定過久。
 不要替內容重複性高的欄位建立索引,如:性別;反之,
 重複性低的欄位則適合建立索引,如:姓名。
SQL 效能-2
 不宜替過多欄位建立索引,否則反而會影響到新增、修改、
刪除的效能
 「負向查詢」,常會讓「查詢最佳化程式」無法有效地使用
索引,最好能用其他運算子和語法
NOT 、 != 、 <> 、 !> 、 !< 、 NOT EXISTS 、 NOT IN 、
NOT LIKE
 建立「叢集索引」
叢集索引
 建立「叢集索引」的欄位,會影響到整個索引結構的效能,
務必選擇「整數」型別
 最頻繁使用的、用以縮小查詢範圍的欄位上;
 若查詢時符合條件的資料很多,則透過「非叢集索引」搜尋
的效能,可能反而不如整個資料表逐筆掃瞄。例如:性別
 經常被分組排序
 應儘可能的避免更新叢集索引欄位,資料列的順序就是表記
錄的物理存儲順序,一旦該列值改變將導致整個表記錄的順
序的調整,會耗費相當大的資源。若應用系統需要頻繁更新
叢集索引資料列,那麼需要考慮是否應將該索引建為叢集索
引。
Column Allow NULL?
儘量避免在 where 子句中對欄位進行 null 值判斷,會使系統
放棄使用索引而進行全表掃瞄
select id from t where num is null
可以在num上設置預設值0,確保表中num列沒有null值,然後
這樣查詢:
select id from t where num = 0
Column Allow NULL?
 http://blog.xuite.net/j2ee/code/15120677-
%E8%AA%BF%E6%A0%A1+SQL+%E4%BB%A5%E5%BE%B9%E5%BA%95%E6%94%B9%E5
%96%84%E6%87%89%E7%94%A8%E7%A8%8B%E5%BC%8F%E6%95%88%E8%83%BD
 http://blog.davidou.org/archives/609 !!!
 http://fecbob.pixnet.net/blog/post/39056159-sql-server-
%E5%8F%A2%E9%9B%86%E7%B4%A2%E5%BC%95%E5%92%8C%E9%9D%9E%E5%8F%A2
%E9%9B%86%E7%B4%A2%E5%BC%95%E7%9A%84%E5%8D%80%E5%88%A5
 http://www.cc.ntu.edu.tw/chinese/epaper/0031/20141220_3109.html
 http://dcx.sybase.com/1100/en/dbusage_en11/correlated-subqueries-how-
subquery.html

SQL 效能調校