對於一般簡單查詢,資料庫能自動引數啊以重用計畫快取,如:
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 *** set paramenterization forced的強制引數化命令能夠將所有sql中的常量引數化,但是強制引數化會因為常量型別不一致造成查詢結果誤差。
單列索引能響應大部分的簡單比較,包括等價和不等價。對於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%'
看一下下面效率低下的例子和其解決方法
效率低下的寫法:
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%』
優化器將無法通過索引來確定將要命中的行數,因此需要搜尋該錶的所有行。
例如:如果表中存在索引定義為lastname、firstname,則該索引在搜尋條件為where lastname=』smith』或where lastname=smith and firstname like 』j%』時將很有用。不過,查詢優化器不會將此索引用於基於firstname(where firstname=』jane』)而搜尋的查詢。
《軟體開發效能優化系列》之String操作
string是不變類,使用 操作連線字串會導致建立乙個新的字串。如果字串連線次數不是固定的,例如在乙個迴圈操作中,則應該使用stringbuilder類來做字串連線工作。因為stringbuilder內部有乙個stringbuffer,連線字元操作不會每次分配新的字串空間。只有當連線後的字串超出bu...
《軟體開發效能優化系列》之String操作
string是不變類,使用 操作連線字串會導致建立乙個新的字串。如果字串連線次數不是固定的,例如在乙個迴圈操作中,則應該使用stringbuilder類來做字串連線工作。因為stringbuilder內部有乙個stringbuffer,連線字元操作不會每次分配新的字串空間。只有當連線後的字串超出bu...
《軟體開發效能優化系列》之表設計
樹狀表都是使用id和idparent兩個欄位來表示樹關係。對樹進行查詢只能使用自關聯方式,不光寫法麻煩而且記錄多的時候查詢效能會非常差。建議在設計樹表的時候可以考慮加入treepath欄位,記載到該節點記錄需要經歷的樹路徑。雖然會增加insert和update的成本。但是對查詢樹關係非常有幫助。可以...