Select語句的效能比對

2022-04-30 22:03:31 字數 4510 閱讀 4371

一、問題

網上流傳著各種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))

print

'測試select * 處理完成!共耗時: '+

@span1+'

ms'print

'測試select [欄位名] 處理完成!共耗時: '+

@span2+'

ms'print

'測試select [資料庫名].[架構名].[表名].[欄位名] 處理完成!共耗時: '+

@span3+'

ms'print

'----------------------------

'print

@span1

print

@span2

print

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