MSSql性能优化
1、參數化sql ? ??????? 對于一般簡單查詢,數據庫能自動參數啊以重用計劃緩存,如: ?
?
SELECT * FROM table WHERE id=1; ?
?
SELECT * FROM table WHERE id=4 ?
? ? ???? 在sqlserver內部能自動參數化這個查詢,SELECT * FROM table WHERE id=@1 ? ???? 但是一旦sql語句中帶有join、union、top……等關鍵字,sqlserver內部將不會自動參數化。 ? ???? 在sql2005中,通過alter database XXX set paramenterization forced的強制參數化命令能夠將所有sql中的常量參數化,但是強制參數化會因為常量類型不一致造成查詢結果誤差。 ? 2、使用查詢中的索引有效 ? ?? a)、單列索引使用原則 ? ? ? ???? 單列索引能響應大部分的簡單比較,包括等價和不等價。對于like操作無前置通配符也是有效的。如: ?
?
能有效使用索引的條件語句:
?
[col1]=1 [col1]>100 [col1] between 0 and 100 [col1] like 'abc%'
?
下列條件語句不會有效利用索引:
ABS([col1])=1[col1]+1>100 [col1]+10 between 0 and 100 [col1] like '%abc%'?
? ? ?? b)、避免在WHERE字句中對字段進行函數或表達式操作 ? ? ? ???? 看一下下面效率低下的例子和其解決方法 ?
效率低下的寫法:
?
SELECT???? * FROM? Production.Product WHERE SafetystockLevel/2=100 ?
高效寫法:
?
SELECT???? * FROM? Production.Product WHERE SafetystockLevel=2*100 ?
? ? ???? 下面是SQLServer2005的優化報告 ? ? ????? 類似的例子: ?
效率低下的寫法 ? 高效的寫法
?
SELECT???? * FROM? Production.Product WHERE SubString(name,1,3)=’abc’ ?
SELECT???? * FROM? Production.Product WHERE name like ’abc%’ ?
?
SELECT???? * FROM? Production.Product WHERE datediff(day ,modifiedDate,’2005-11-30’)=0 ?
SELECT???? * FROM? Production.Product WHERE modifiedDate>=’2005-11-30’ andmodifiedDate<’2005-12-1’ ?
? ? ? ? ????? 任何對列的操作都將導致表掃描,它包括數據庫函數、計算表達式等等,查詢時要盡可能將操作移至等號右邊。 ? ????? 避免使用!=或<>、is null 或is not null、 in、not in等這樣的操作符,因為這會是系統無法使用索引,而只能直接搜索表中數據。 ? ????? 例如: ? ????? select id from employee where id!=’B%’ ? ????? 優化器將無法通過索引來確定將要命中的行數,因此需要搜索該表的所有行。 ? ?? c)、多列索引使用原則 ? ???? 則應考慮列的順序。用于等于(=)、大于(>)、小于(<)或between搜索條件的where 字句或者參與聯接的列應該放在最前面。其它列應該基于其非重要級別進行排序,就是說,從最不重復的列到最重復的列。 ? ???? 例如: ? ???? 如果表中存在索引定義為LastName、FirstName,則該索引在搜索條件為where LastName=’Smith’或where LastName=Smith and FirstName like ’j%’時將很有用。不過,查詢優化器不會將此索引用于基于FirstName(where FirstName=’Jane’)而搜索的查詢。
該文章轉載自無憂考網:http://www.51test.net
轉載于:https://www.cnblogs.com/oisiv/archive/2013/01/22/2871888.html
總結
- 上一篇: MSCRM日志配置
- 下一篇: 2019-03-28 SQL Serve