一、問題
網上流傳著各種sql選擇語句優化技巧,其中就包括選擇sql語句構造,包括以下幾種情況:
1. select * from 表名
2. select [欄位名] from 表名
3. select [資料庫名].[架構名].[表名].[欄位名] from 表名
表名又分為:
4.[資料庫名]
.[架構名].[表名]
5.[架構名].[表名]
6.[表名]
網上認為2,3效能肯定好於1的效能,為了驗證這個觀點,本文進行了驗證.以下是各種sql語句的測試情況
二、問題驗證
declare@iint,@max
int ,@uid
int,@starttime
datetime ,@endtime
datetime,@sql
varchar(3000),@tablename
varchar(100)
declare
@span1
varchar(30),@span2
varchar(30),@span3
varchar(30)
select
@max
=100 ,@uid
=45000307 --最大測試次數 , 使用者id
select
@tablename='
[testdb].[dbo].[c_contacts]
'select
@tablename='
[dbo].[c_contacts]
'select
@tablename='
[c_contacts]'--
測試select *
set@i=0
set@sql='
select * from '+
@tablename+'
where umid ='+
convert(varchar(30),@uid)
set@starttime
=getdate();
while(@i
<
@max)
begin
execute(@sql)
set@i=@i
+1endset
@endtime
=getdate();
set@span1
=convert(varchar(30),datediff(ms,@starttime,@endtime))
--測試select [欄位名]
set@i=0
set@sql='
select [contactid],[umid],[firstname],[lastname],[birthday],[photo],[remarks],[ver],[instime],[updtime] from '+
@tablename+'
where umid ='+
convert(varchar(30),@uid)
set@starttime
=getdate();
while(@i
<
@max)
begin
execute(@sql)
set@i=@i
+1endset
@endtime
=getdate();
set@span2
=convert(varchar(30),datediff(ms,@starttime,@endtime))
--測試select
[資料庫名].[架構名].[表名].[欄位名]
set@i=0
set@sql='
select [dbo].[c_contacts].[contactid],[dbo].[c_contacts].[umid],[dbo].[c_contacts].[firstname],[dbo].[c_contacts].[lastname],[dbo].[c_contacts].[birthday],[dbo].[c_contacts].[photo],[dbo].[c_contacts].[remarks],[dbo].[c_contacts].[ver],[dbo].[c_contacts].[instime],[dbo].[c_contacts].[updtime] from '+
@tablename+'
where umid ='+
convert(varchar(30),@uid)
set@starttime
=getdate();
while(@i
<
@max)
begin
execute(@sql)
set@i=@i
+1endset
@endtime
=getdate();
set@span3
=convert(varchar(30),datediff(ms,@starttime,@endtime))
'測試select * 處理完成!共耗時: '+
@span1+'
ms'print
'測試select [欄位名] 處理完成!共耗時: '+
@span2+'
ms'print
'測試select [資料庫名].[架構名].[表名].[欄位名] 處理完成!共耗時: '+
@span3+'
ms'print
'----------------------------
@span1
@span2
@span3
三、結果
每種情況分別測試5次,取平均值,得到以下的結果:
表名select語句
第1次第2次
第3次第4次
第5次平均值
[資料庫名].[架構名].[表名]
測試select *
4166
4340
4260
4246
4216
4245.6
測試select [欄位名]
4816
4946
4756
4793
4853
4832.8
測試select [資料庫名].[架構名].[表名].[欄位名]
5523
5293
5533
5213
5290
5370.4
[架構名].[表名]
測試select *
4576
4193
4326
4206
4226
4305.4
測試select [欄位名]
5030
4860
4806
4920
4803
4883.8
測試select [資料庫名].[架構名].[表名].[欄位名]
5266
5173
5413
5156
5253
5252.2
[表名]
測試select *
4516
4206
4250
4203
4293
4293.6
測試select [欄位名]
4780
4766
4880
4790
4870
4817.2
測試select [資料庫名].[架構名].[表名].[欄位名]
5276
5446
5370
5270
5240
5320.4
四、結論
1.直接使用select * 比使用select [欄位名] 和 測試select [資料庫名].[架構名].[表名].[欄位名] 效能要好.
2.select語句中的表名用[資料庫名].[架構名].[表名]的形式,比用[表名] 和 [架構名].[表名] 效能要好.
五、原因分析
1.select語句中加入資料名,架構名會加大sql語句的長度,sql編譯時會增加複雜度,所以時間偏長.
2.表名用[資料庫名].[架構名].[表名]編譯時可以減少表名匹配的時間,所以時間較少.
不知道我的分析有無道理,也不知道資料內部對sql指令碼的處理及編譯是怎樣的乙個流程,期待高手作答.
lambda與foreach的效能比對
public class test public void test1 for迴圈 long starttime system.currenttimemillis for object s list long endtime system.currenttimemillis system.out.p...
多項式運算效能比對
有原始按照每次項相乘的方式來計算和使用horner方法進行多項式求和運算 使用原始計算方法,如下 double poly original double a,double x,long degree return result 使用horner 方法計算方法和 如下 公式為 如下 double po...
資料庫連線池效能比對
對現有的資料庫連線池做調研對比,綜合性能,可靠性,穩定性,擴充套件性等因素選出推薦出最優的資料庫連線池 note 本文所有測試均是mysql庫 1 效能方面 hikaricp druid tomcat jdbc dbcp c3p0 hikaricp的高效能得益於最大限度的避免鎖競爭。2 druid功...