SlideShare a Scribd company logo
1 of 18
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

More Related Content

More from LearningTech (20)

node.js errors
node.js errorsnode.js errors
node.js errors
 
Process control nodejs
Process control nodejsProcess control nodejs
Process control nodejs
 
Expression tree
Expression treeExpression tree
Expression tree
 
flexbox report
flexbox reportflexbox report
flexbox report
 
Vic weekly learning_20160504
Vic weekly learning_20160504Vic weekly learning_20160504
Vic weekly learning_20160504
 
Reflection &amp; activator
Reflection &amp; activatorReflection &amp; activator
Reflection &amp; activator
 
Peggy markdown
Peggy markdownPeggy markdown
Peggy markdown
 
Node child process
Node child processNode child process
Node child process
 
20160415ken.lee
20160415ken.lee20160415ken.lee
20160415ken.lee
 
Peggy elasticsearch應用
Peggy elasticsearch應用Peggy elasticsearch應用
Peggy elasticsearch應用
 
Expression tree
Expression treeExpression tree
Expression tree
 
Vic weekly learning_20160325
Vic weekly learning_20160325Vic weekly learning_20160325
Vic weekly learning_20160325
 
D3js learning tips
D3js learning tipsD3js learning tips
D3js learning tips
 
git command
git commandgit command
git command
 
Asp.net MVC DI
Asp.net MVC DIAsp.net MVC DI
Asp.net MVC DI
 
Vic weekly learning_20151127
Vic weekly learning_20151127Vic weekly learning_20151127
Vic weekly learning_20151127
 
Mocha.js
Mocha.jsMocha.js
Mocha.js
 
R language
R languageR language
R language
 
20151120 ian cocos2d js
20151120 ian cocos2d js20151120 ian cocos2d js
20151120 ian cocos2d js
 
Vic weekly learning_20151120
Vic weekly learning_20151120Vic weekly learning_20151120
Vic weekly learning_20151120
 

SQL 效能調校