百萬資料查詢測試 只需1秒--Sql語句效率測試
關於SQL查詢效率,100w資料,查詢只要1秒,與您分享:
機器情況
p4: 2.4
記憶體: 1 G
os: windows 2003
資料庫: ms sql server 2000
目的: 查詢效能測試,比較兩種查詢的效能
SQL查詢效率 step by step
-- setp 1.
-- 建表
create table t_userinfo
(
userid int identity(1,1) primary key nonclustered,
nick varchar(50) not null default '',
classid int not null default 0,
writetime datetime not null default getdate()
)
go
-- 建索引
create clustered index ix_userinfo_classid on t_userinfo(classid)
go
-- step 2.
declare @i int
declare @k int
declare @nick varchar(10)
set @i = 1
while @i<1000000
begin
set @k = @i % 10
set @nick = convert(varchar,@i)
insert into t_userinfo(nick,classid,writetime) values(@nick,@k,getdate())
set @i = @i + 1
end
-- 耗時 08:27 ,需要耐心等待
-- step 3.
select top 20 userid,nick,classid,writetime from t_userinfo
where userid not in
(
select top 900000 userid from t_userinfo order by userid asc
)
-- 耗時 8 秒 ,夠長的
-- step 4.
select a.userid,b.nick,b.classid,b.writetime from
(
select top 20 a.userid from
(
select top 900020 userid from t_userinfo order by userid asc
) a order by a.userid desc
) a inner join t_userinfo b on a.userid = b.userid
order by a.userid asc
-- 耗時 1 秒,太快了吧,不可以思議
-- step 5 where 查詢
select top 20 userid,nick,classid,writetime from t_userinfo
where classid = 1 and userid not in
(
select top 90000 userid from t_userinfo
where classid = 1
order by userid asc
)
-- 耗時 2 秒
-- step 6 where 查詢
select a.userid,b.nick,b.classid,b.writetime from
(
select top 20 a.userid from
(
select top 900000 userid from t_userinfo
where classid = 1
order by userid asc
) a order by a.userid desc
) a inner join t_userinfo b on a.userid = b.userid
order by a.userid asc
-- 查詢分析器顯示不到 1 秒.
查詢效率分析:
子查詢為確保消除重複值,必須為外部查詢的每個結果都處理巢狀查詢。在這種情況下可以考慮用聯接查詢來取代。
如果要用子查詢,那就用EXISTS替代IN、用NOT EXISTS替代NOT IN。因為EXISTS引入的子查詢只是測試是否存在符合子查詢中指定條件的行,效率較高。無論在哪種情況下,NOT IN都是最低效的。因為它對子查詢中的表執行了一個全表遍歷。
建立合理的索引,避免掃描多餘資料,避免表掃描!
幾百萬條資料,照樣幾十毫秒完成查詢.
機器情況
p4: 2.4
記憶體: 1 G
os: windows 2003
資料庫: ms sql server 2000
目的: 查詢效能測試,比較兩種查詢的效能
SQL查詢效率 step by step
-- setp 1.
-- 建表
create table t_userinfo
(
userid int identity(1,1) primary key nonclustered,
nick varchar(50) not null default '',
classid int not null default 0,
writetime datetime not null default getdate()
)
go
-- 建索引
create clustered index ix_userinfo_classid on t_userinfo(classid)
go
-- step 2.
declare @i int
declare @k int
declare @nick varchar(10)
set @i = 1
while @i<1000000
begin
set @k = @i % 10
set @nick = convert(varchar,@i)
insert into t_userinfo(nick,classid,writetime) values(@nick,@k,getdate())
set @i = @i + 1
end
-- 耗時 08:27 ,需要耐心等待
-- step 3.
select top 20 userid,nick,classid,writetime from t_userinfo
where userid not in
(
select top 900000 userid from t_userinfo order by userid asc
)
-- 耗時 8 秒 ,夠長的
-- step 4.
select a.userid,b.nick,b.classid,b.writetime from
(
select top 20 a.userid from
(
select top 900020 userid from t_userinfo order by userid asc
) a order by a.userid desc
) a inner join t_userinfo b on a.userid = b.userid
order by a.userid asc
-- 耗時 1 秒,太快了吧,不可以思議
-- step 5 where 查詢
select top 20 userid,nick,classid,writetime from t_userinfo
where classid = 1 and userid not in
(
select top 90000 userid from t_userinfo
where classid = 1
order by userid asc
)
-- 耗時 2 秒
-- step 6 where 查詢
select a.userid,b.nick,b.classid,b.writetime from
(
select top 20 a.userid from
(
select top 900000 userid from t_userinfo
where classid = 1
order by userid asc
) a order by a.userid desc
) a inner join t_userinfo b on a.userid = b.userid
order by a.userid asc
-- 查詢分析器顯示不到 1 秒.
查詢效率分析:
子查詢為確保消除重複值,必須為外部查詢的每個結果都處理巢狀查詢。在這種情況下可以考慮用聯接查詢來取代。
如果要用子查詢,那就用EXISTS替代IN、用NOT EXISTS替代NOT IN。因為EXISTS引入的子查詢只是測試是否存在符合子查詢中指定條件的行,效率較高。無論在哪種情況下,NOT IN都是最低效的。因為它對子查詢中的表執行了一個全表遍歷。
建立合理的索引,避免掃描多餘資料,避免表掃描!
幾百萬條資料,照樣幾十毫秒完成查詢.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-612107/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql查詢效率慢的SQL語句MySql
- 查詢效率低下的sql的語句SQL
- es的複雜查詢測試,使用jest的dsl工具寫查詢語句
- Sysbench測試神器:一條命令生成百萬級測試資料
- MySQL 快速創造百萬測試資料MySql
- 在mysql查詢效率慢的SQL語句MySql
- YCSB擴充套件-語句執行頻率,執行指定的測試查詢語句套件
- 資料庫查詢優化:使用explain分析sql語句執行效率資料庫優化AISQL
- 介面測試裡的查詢介面要測試嗎
- 【Mysql】資料庫索引,百萬資料測試索引效果MySql資料庫索引
- Sql Server生成測試資料SQLServer
- 軟體測試員必備:面試時常問的15個MySQL資料庫查詢語句面試MySql資料庫
- 《shell條件測試語句,字串測試apache是否開啟》字串Apache
- 使用sql語句查詢平均值,使用sql語句查詢資料總條數, not in 篩選語句的使用SQL
- run_stats---sql效率測試工具(轉)SQL
- 測試TOM=SQLLDR使用CASE語句SQL
- MySQL資料庫:7、SQL常用查詢語句MySql資料庫
- 測試驅動開發(TDD)—— 資料庫查詢篇資料庫
- 功能測試-登陸、新增、刪除、查詢測試要點
- SQL查詢語句 (Oracle)SQLOracle
- SQL server 查詢語句SQLServer
- sql查詢語句流程SQL
- SQL mother查詢語句SQL
- 資料庫查詢語句資料庫
- pytest標記:查詢測試策略、標記測試函式函式
- 測試人員如何提高API功能測試效率?API
- 軟體產品測試之效能效率測試
- SQL server資料庫表碎片比例查詢語句SQLServer資料庫
- 測試資料
- Oracle 執行語句歷史查詢—測試和實施人員必備技能Oracle
- SQLTest系列之INSERT語句測試SQL
- 測試測試測試測試測試測試
- 資料庫執行效率的對比測試資料庫
- 大資料測試與 傳統資料庫測試大資料資料庫
- 資料庫測試專用術語資料庫
- SQL語句寫到累了?試試GreenDAOSQL
- SQL Server阻塞查詢語句SQLServer
- SQL查詢語句使用 (轉)SQL