2017年10月10日 星期二

[SQL] Compare Operator - Order by Performance 1

  • sql 使用 Order by 
    • 觀察查詢成本
    • 如何利用索引先天的排序特性來提升效能
  • 資料庫使用 Adventure Works for SQL Server 2012 的資料表 Production.Product 產生 3 種不同資料表
    • tbProduct01:Heap
    • tbProduct02:NonClustered Index (Name)
    • tbProduct03:Clustered (ProductID), NonClustered Index (Name)
  • CASE 1. 沒使用 where 查詢
    • 查詢
select ProductID, Name from tbProduct01 order by ProductID 
select ProductID, Name from tbProduct02 order by ProductID 
select ProductID, Name from tbProduct03 order by ProductID 
    • 查詢結果
      • 查詢 1, 2:因採用 "Heap",本身未依指定資料行排序,所以輸出前需經過 "排序" 作業處理,而多出 59% 的成本
      • 查詢 3: Clustered 的 "鍵值資料行" 為排需所依據的資料行,因而不需要額外花費 "排序" 成本
  • CASE 2. 使用 where 查詢
    • 查詢
select ProductID, Name from tbProduct01 where Name like 'Thin-Jam%' order by Name 
select ProductID, Name from tbProduct02 where Name like 'Thin-Jam%' order by Name 
select ProductID, Name from tbProduct03 where Name like 'Thin-Jam%' order by Name 
    • 查詢結果
      • 結果如同於 CASE 1
  • Result:
    1. "索引" 會事先依據 "鍵值資料行" 進行遞增或遞減排序
    2. 查詢的排序資料行能使用到 "索引" 的 "鍵值資料行",就能減少額外 "排序" 成本
  • REF:
    • SQL Server 效能調校

沒有留言:

張貼留言