如何讓你的SQL執行得更快

2021-04-17 03:16:59 字數 2651 閱讀 2701

一、不合理的索引

----例:表record有620000行,試看在不同的索引下,下面幾個

sql的運**況:

----1.在date上建有一非個群集索引

selectcount(*)fromrecordwheredate>

'19991201'anddate<'19991214'andamount>

2000(25秒)

selectdate,sum(amount)fromrecordgroupbydate

(55秒)

selectcount(*)fromrecordwheredate>

'19990901'andplacein('bj','sh')(27秒)

----分析:

----date上有大量的重複值,在非群集索引下,資料在物理上隨機存放在資料頁上,在

範圍查詢時,必須執行一次表掃瞄才能找到這一範圍內的全部行。

----2.在date上的乙個群集索引

selectcount(*)fromrecordwheredate>

'19991201'anddate<'19991214'andamount>

2000(14秒)

selectdate,sum(amount)fromrecordgroupbydate

(28秒)

selectcount(*)fromrecordwheredate>

'19990901'andplacein('bj','sh')(14秒)

----分析:

----在群集索引下,資料在物理上按順序在資料頁上,重複值也排列在一起,因而在範

圍查詢時,可以先找到這個範圍的起末點,且只在這個範圍內掃瞄資料頁,避免了大範

圍掃瞄,提高了查詢速度。

----3.在place,date,amount上的組合索引

selectcount(*)fromrecordwheredate>

'19991201'anddate<'19991214'andamount>

2000(26秒)

selectdate,sum(amount)fromrecordgroupbydate

(27秒)

selectcount(*)fromrecordwheredate>

'19990901'andplacein('bj','sh')(<1秒)

----分析:

----這是乙個不很合理的組合索引,因為它的前導列是place,第一和第二條

sql沒有引

用place,因此也沒有利用上索引;第三個

sql使用了place,且引用的所有列都包含在組

合索引中,形成了索引覆蓋,所以它的速度是非常快的。

----4.在date,place,amount上的組合索引

selectcount(*)fromrecordwheredate>

'19991201'anddate<'19991214'andamount>

2000(<1秒)

selectdate,sum(amount)fromrecordgroupbydate

(11秒)

selectcount(*)fromrecordwheredate>

'19990901'andplacein('bj','sh')(<1秒)

----分析:

----這是乙個合理的組合索引。它將date作為前導列,使每個

sql都可以利用索引,並

且在第一和第三個

sql中形成了索引覆蓋,因而效能達到了最優。

----5.總結:

----預設情況下建立的索引是非群集索引,但有時它並不是最佳的;合理的索引設計要

建立在對各種查詢的分析和**上。一般來說:

----①.有大量重複值、且經常有範圍查詢

(between,>,<,>=,<=)和orderby

、groupby發生的列,可考慮建立群集索引;

----②.經常同時訪問多列,且每列都含有重複值可考慮建立組合索引;

----③.組合索引要盡量使關鍵查詢形成索引覆蓋,其前導列一定是使用最頻繁的列。

二、不充份的連線條件:

----例:表card有7896行,在card_no上有乙個非聚集索引,表account有191122行,在

account_no上有乙個非聚集索引,試看在不同的表連線條件下,兩個

sql的執**況:

selectsum(a.amount)fromaccounta,

cardbwherea.card_no=b.card_no(20秒)

----將

sql改為:

selectsum(a.amount)fromaccounta,

cardbwherea.card_no=b.card_noanda.

account_no=b.account_no(<1秒)

----分析:

----在第乙個連線條件下,最佳查詢方案是將account作外層表,card作內層表,利用

card上的索引,其i/o次數可由以下公式估算為:

----外層表account上的22541頁+(外層表account的191122行*內層表card上對應外層

表第一行所要查詢的3頁)=595907次i/o

----在第二個連線條件下,最佳查詢方案是將card作外層表,account作內層表,利用1

如何讓你的SQL執行得更快

人們在使用 sql時往往會陷入乙個誤區,即太關注於所得的結果是否正確,而忽略了不同的實現方法之間可能存在的效能差異,這種效能差異在大型的或是複雜的資料庫環境中 如聯機事務處理 oltp 或決策支援系統 dss 中表現得尤為明顯。筆者在工作實踐中發現,不良的 sql往往來自於不恰當的索引設計 不充份的...

加入sql標籤,讓sql語句更快的執行

原本的sql語句執行 select from 表單 這種方式會獲取表中所有字段,專案大時會特別的慢 select from video where id 咱們在查詢之前插入sql標籤 sql標籤中的id務必與之後include中的refid一致 id,title 新增完sql標籤以後 標籤內部只有i...

如何讓win10系統執行更快

電腦執行的速度主要看硬體和軟體的配合使用,但是硬體從電腦買來的時候基本上是固定了的。除非對硬體進行公升級。在硬體不變的前提下如何讓電腦執行快一點的呢?下面以win10為例,教你們設定兩個地方,讓win10執行得更加快速點,跑起來更加溜。方法步驟 設定win10為最佳效能模式 設定win10電源模式為...