sql 優化

關係型數據庫優化:
1.對數據結構優化,通過業務邏輯簡化結構、數據結構、簡化冗餘字段
2.通過T-sql語句進行優化;包括sql語句的優化、建立索引、規範sql語句的書寫(根據sql代碼的執行原理)
3.金錢加成,添加服務器,分佈式集羣來解決問題
註釋:業務邏輯上的優化,工作量比較大,要求業務和開發人員的密切配合,保證對每一個小細節的邏輯能解釋清楚,所帶來的風險也比較大,很多企業不會這麼做,但是這也是最根本的解決性能問題;T-sql語句優化,要求技術性比較高,對數據原理和T-sql程序的基礎比較瞭解;添加服務器方法,需要資金和相關運維人員;
今天就說說對T-sql代碼的優化:
索引分類:
存儲結構:聚簇索引,非聚簇索引
唯一性區分:唯一索引,非唯一索引
列個數:單列索引,多列索引
索引使用注意事項:
1)索引並不是越多越好,要根據查詢有針對性的創建,考慮在 WHERE 和 ORDER BY 命令上涉及的列建立索引,可根據 EXPLAIN 來查看是否用了索引還是全表掃描。
2)應儘量避免在 WHERE 子句中對字段進行 NULL 值判斷,否則將導致引擎放棄使用索引而進行全表掃描。
3)值分佈很稀少的字段不適合建索引,例如“性別”這種只有兩三個值的字段。
4)字符字段只建前綴索引。
5)字符字段最好不要做主鍵。
6)不用外鍵,由程序保證約束
7)儘量不用 UNIQUE,由程序保證約束。
8)使用多列索引時注意順序和查詢條件保持一致,同時刪除不必要的單列索引。
聚集索引:每張表只能有一個聚集索引;一種對磁盤上實際數據重新組織以按指定的一列或多列值排序,是用平衡二叉樹
非聚集索引:每張表可以有多個非聚集索引;默認情況下建立的索引是非聚集索引,他不重新組織表中的數據,而是對每一行存儲索引列值並用一個指針指向數據所在的頁面。每個非聚集索引根據索引列的不同提供不同的排序順序。
索引設計原則:
1)系統一般會給逐漸字段自動建立聚集索引。
2)有大量重複值且經常有範圍查詢和排序、分組的列,或者經常頻繁訪問的列,考慮建立聚集索引。
3)在一個經常做插入操作的表中建立索引,應使用fillfactor(填充因子)來減少頁分裂,同時提高併發度降低死鎖的發生。如果在表爲只讀表,填充因子可設爲100
4)在選擇索引鍵時,儘可能採用小數據類型的列作爲鍵以使每個索引頁能容納儘可能多的索引鍵和指針,通過這種方式,可使一個查詢必需遍歷的索引頁面降低到最小,此外,儘可能的使用整數做爲鍵值,因爲整數的訪問速度最快。
Sql查詢的邏輯執行順序:
① From:對FROM子句中前兩個表執行笛卡爾積生成虛擬表vt1
② On :對vt1表應用ON篩選器只有滿足 爲真的行才被插入vt2
③ Join:如果指定了 OUTER JOIN保留表(preserved table)中未找到的行將行作爲外部行添加到vt2 生成t3如果from包含兩個以上表則對上一個聯結生成的結果表和下一個表重複執行步驟和步驟直接結束
④ Where :對vt3應用 WHERE 篩選器只有使 爲true的行才被插入vt4
⑤ Group by :按GROUP BY子句中的列列表對vt4中的行分組生成vt5
⑥ With:
⑦ Having :對vt6應用HAVING篩選器只有使 爲true的組才插入vt7
⑧ Select :處理select列表產生vt8
⑨ Distinct:將重複的行從vt8中去除產生vt9
⑩ Order by :將vt9的行按order by子句中的列列表排序生成一個遊標vc10
⑪ Top :從vc10的開始處選擇指定數量或比例的行生成vt11 並返回調用者
索引查找(seek),一般爲最優(但查找也要看查找的篩選性),儘量吧where 條件中的字段建成一個組合索引,並且包含要查詢select 中的字段。
需要你的條件可以用索引!比如 你的語句中 索引列不能帶函數,不能參與計算如 where productID/2 = @a ,不能有隱式轉換等!
最經典的例子就是where 和 having的區別,看過語句執行順序你應該已經明白了。能寫在where 中不要放在having中
橫向來看:
不要寫SELECT * 的語句,而是選擇你需要的字段。
當在SQL語句中連接多個表時, 請使用表的別名並把別名前綴於每個Column上.這樣一來,就可以減少解析的時間並減少那些由Column歧義引起的語法錯誤。
縱向來看:
where 條件要儘量的多且保證高篩選性。
業務中很常見要返回大批量數據到前端,但是這些數據真的都是必要的麼?前端是否可以加一些默認條件呢?

Sql代碼上層次上的優化:
分庫:通過添加服務器,用硬件去分擔數據帶來的壓力
分表:合理的利用服務器性能,服務器性能最優化,保證單表數據不會太大
想法:橫向和縱向
橫向:通過業務邏輯對模塊進行分庫劃分,保證每一個模塊的數據再不同的服務器上,獨立運行
縱向:一個模塊的數據表進行劃分,保證每一張表數據不會太多,通過算法保證分表數據的平衡性
缺點:1.事務執行
2.數據關聯和統計

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章