SQL優化基礎 使用索引(乙個小例子)

2021-06-27 02:55:37 字數 2777 閱讀 7253

1. 建表:

複製**

**如下:

create table site_user (

id int identity(1,1) primary key,

[name] varchar(20),

code varchar(20),

date datetime )

2. 插入8萬條資料

複製**

**如下:

declare @m int

set @m=1

while @m<80000

begin

insert into [demo].[dbo].[site_user] (

[name]

,[code],date)

values

('name'+cast(@m as varchar(20))

,'code'+cast(@m as varchar(20)),getutcdate())

select @m=@m+1

end

--小技巧:推薦使用類似sqlassist的工具來提高敲寫sql語句的速度

3. 設定開啟一些引數的設定

複製**

**如下:

set statistics io on -- 檢視磁碟io

set statistics time on -- 檢視sql語句分析編譯和執行時間

select * from site_user -- 檢視效果

4. 檢視表索引情況:

sp_helpindex site_user

5. 執行sql語句

複製**

**如下:

select * from site_user su where su.name='name1'表 'site_user'。

掃瞄計數 1,邏輯讀取 446 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次

ctrl+l 快捷鍵檢視執行計畫:

6. 優化第一步:聚集索引掃瞄開銷佔了100%,可以考慮優化為索引查詢,在查詢條件name上建立非聚集索引

複製**

**如下:

create index name_index on site_user(name)

sp_helpindex site_user -- 多出來我們新建立的索引

此時再執行上面的查詢語句:

複製**

**如下:

select * from site_user su where su.name='name1'

表 'site_user'。掃瞄計數 1,邏輯讀取 4 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

磁碟邏輯讀取次數明顯下降,然後檢視執行計畫:

新建的索引已經起到了作用,但是還是去掃瞄了主鍵的聚集索引,如果能在乙個索引上完成查詢效能會更高,因為這個查詢

所以考慮進一步優化:

7. 優化第二步: 建立組合索引

複製**

**如下:

create index name_index4 on site_user(name,code,[date])

表 'site_user'。掃瞄計數 1,邏輯讀取 3 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

-- 磁碟邏輯讀取次數又下降了

然後檢視執行計畫:

這樣直接走索引查詢就快很多了,使用了index4

8. 優化第三步:我們還可以考慮使用覆蓋索引,將使用到的條件都寫在索引括號內,其他查詢出來的字段放入

include中,

複製**

**如下:

create index name_index5 on site_user(name)include(id,code,[date])表 'site_user'。

掃瞄計數 1,邏輯讀取 3 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

-- 磁碟邏輯讀取次數沒有明顯變化然後檢視執行計畫:

同樣走索引查詢使用了index5

此時: index4

和index5

如何選擇?

利用dbcc

進行資料分析:

複製**

**如下:

乙個sql的優化

原文 乙個sql的優化 目的 為了查詢某天某個伺服器上的登入id的個數 剛開始編寫的sql select count a.mac logusers from log maclogin all a where ismoni 1 and logintime 2015 02 01 23 59 59 and...

乙個簡單例子初步了解主鍵 索引 sql優化的重要性

測試資料 條數100w,查詢目標資料只有一條,選取的資料為所有資料的中間資料,為了公正。在進行操作時沒有增加程序 初學者可以縱向 橫向比較 一 未加主鍵 未加索引 select from myindex where username like username500000 456 458 456 4...

重建索引的乙個小技巧

摘自丁奇mysql實戰45講 create table t id int primary key,k int notnull name varchar 16 index k engine innodb 對於該錶t,如果要重建索引k,sql語句可以這麼寫 alter table t drop inde...