問題提出:
在sql server2005數據庫中建立兩個類型相同的數據表,如下
create table test1 ( iId int identity(1,1) not null, vTest1Code varchar(30) not null, vName varchar(30) not null, dDate datetime, primary key(iId) ) |
create table test2 ( Id int identity(1,1) not null, Code varchar(30) not null, Name varchar(30) not null, date datetime, primary key(Id) ) |
兩表所佔用的系統空間
exec sp_spaceused 'test1' |
exec sp_spaceused 'test2' |
||||||
Name |
Rows |
Reserved |
Data |
Index_size |
unused |
|
|
Test1 |
0 |
0KB |
0KB |
0KB |
0KB |
|
|
Test2 |
0 |
0KB |
0KB |
0KB |
0KB |
|
|
由上圖得知兩表所佔用的系統空間一致。
執行數據插入操作
--測試TEST1 declare @startTime datetime set @startTime=getdate() declare @i int set @i=1 while @i<100 begin insert into test1(vTest1Code,vName) values('vCode'+CAST(@i as varchar(10)),'vName'+CAST(@i as varchar(10))) set @i=@i+1 end select [語句執行花費時間(毫秒)]=datediff(ms,@startTime,getdate()) go |
--測試TEST2 declare @startTime datetime set @startTime=getdate() declare @i int set @i=1 while @i<100 begin insert into test2(Code,Name) values('vCode'+CAST(@i as varchar(10)),'vName'+CAST(@i as varchar(10))) set @i=@i+1 end select [語句執行花費時間(毫秒)]=datediff(ms,@startTime,getdate()) go |
插入耗時情況
|
test1語句執行花費時間(毫秒) |
test2語句執行花費時間(毫秒) |
100條 |
30 |
30 |
1000條 |
250 |
250 |
10000條 |
2623 |
2516 |
100000條 |
26453 |
26560 |
1000000條 |
275110 |
282796 |
最後兩表所佔用的系統空間
exec sp_spaceused 'test1' |
exec sp_spaceused 'test2' |
||||||
Name |
Rows |
Reserved |
Data |
Index_size |
unused |
|
|
Test1 |
1000098 |
48520KB |
48272KB |
192KB |
56KB |
|
|
Test2 |
1000098 |
48520KB |
48272KB |
192KB |
56KB |
|
|
問題現象描述:
1、 在相同數據類型、長度,及約束、索引的情況下,執行千條及千條以內的數據插入操作時,字段長度、系統保留字對SQL語句的執行速度沒有影響或者影響很小;執行上萬條數據插入操作時,字段長度對SQL語句的執行速度影響很小;執行十萬條以上的數據操作時,系統保留字對SQL語句的執行速度影響明顯。
2、 數據字段長度、系統保留字對系統佔用的空間沒有任何影響。
3、 在大批量數據操作時,數據類型、長度,甚至數據字段是否爲系統保留字,對SQL語句的執性效率都有影響。
問題總結:
1、 SQL語句在執行時,將首先對相關數據表進行連接,然後進行過濾、分組、選擇字段、DISTINCT、ORDER BY等操作。由此,我們在進行數據查詢時,應儘量避免“*”連接,應考慮過濾的先後順序。
2、 謹慎使用遊標、觸發器、索引。
3、 儘量避免使用系統保留字,考慮在SQL語句中區分數據字段的大小寫,即SQL語句中的字段名的形式應和數據表中的字段名的形式一致。