是否有人能夠提供有關SQL Server能夠進行哪些優化的信息?我使用的是2005年的標準版,有時也和2008年一起工作。 2008能夠執行2005年不能查詢的優化嗎?SQL Server優化
有時候我會運行一個查詢,這將需要很長時間沒有明顯的原因,我必須用不同的方法重寫它。 (CTE而不是子查詢等)我想提前知道在開始使用SQL服務器之前SQL服務器是否會爲查詢提供最佳或接近可選的性能。
加入到子查詢
select ... from tbl1 left join(
select ... from tbl2 group by ...
) as subQ on t1.pk = subQ.fk
where t1.pk between 50 and 100
如果我加入一個表的子查詢同上,結果集進行過濾,我可以期待WHERE子句中過濾下來所有 SQL服務器進行傳播相關的子查詢?編譯器在確定結果集的哪些部分最終將用於最終輸出中有多好?
很多組列由
子查詢與分組依據,往往可以寫成一個直線上升加盟,但隨後被
select tbl1.pk,b,c,d,e,f,g, sum(tbl2.h) from tbl1
inner join tbl2 on tbl1.pk = tbl2.fk
inner join tbl3 on tbl1.fk = tbl3.pk
group by tbl1.pk, tbl1.b, tbl3.c, tbl3.d, tbl3.e, tbl3.f, tbl3.g
每個引用組中的許多列是必要的除表3中的一行外,表1中的行將與表2中的多行相匹配。(注意與表3的pk的連接)由於此原因,組中除tbl1.pk之外的所有列都是多餘的。但是,SQL要求無論如何都要在組中使用它們。現在優化器應該只是在表1的主鍵上進行排序,以便聚合表2中的行。它會這樣做,還是會不必要地對組中的整個列集進行排序和比較?如前所述,另一種方法是將表2聚合到子查詢中,然後再回到表1和表3中。這是否有所不同?
謂詞推送示例指示問題出現在視圖中,但與表值函數不同。在這種情況下,使用(非索引)視圖是否有意義?表函數似乎沒有任何缺點。 – Trent 2012-03-20 13:29:11
@Trent - 您無法在TVF或呼叫端創建觸發功能(例如'NEWID()')。如果你不需要那些,那麼不需要。不AFAIK。 – 2012-03-20 13:38:31