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...