初嚐資料庫優化

2021-06-17 17:55:53 字數 4172 閱讀 5405

在前兩天的**期學術交流會上,曹建新學長提到了:對資料的查詢盡量少用「*」,需要用哪個欄位就用相應字段。對此自己產生了點小興趣,便折騰了一下。

1.建乙個資料庫testdb:

create database testdb

2.建一張測試表t-test

use testdb

create table t_test (numbertest bigint,datetest datetime,str1test varchar(10),str2test varchar(10),str3test varchar(10),)

go

3.往裡新增20萬條資料

declare @a bigint

set @a =1

while @a <200000

begin

insert t_test values(@a,getdate(),'廊坊','資訊科技','提高班')

set @a=@a+1

endgo

4.測試:

查詢耗時我用的辦法時,查詢之前先宣告乙個時間,查詢之後再宣告乙個時間,然後獲得時間差。 

datediff(millisecond,開始時間,結束時間)  --millisecond 毫秒

測試一:檢視t_test表只查詢乙個列耗時情況

declare @start datetime,@end datetime

set @start=getdate()

select numbertest from t_test

set @end=getdate()

select datediff(millisecond,@start,@end)

go

--查詢numbertest耗時為:3470毫秒 

--查詢datetest列耗時:3616毫秒

測試二:檢視peotest表查詢所有列耗時情況

declare @start datetime,@end datetime

set @start=getdate()

select * from t_test

set @end=getdate()

select datediff(millisecond,@start,@end)

go

--查詢所有列耗時為:4723毫秒

declare @start datetime,@end datetime

set @start=getdate()

exec selectbypage 't_test','*','numbertest',20,10,0,0,''

set @end=getdate()

select datediff(millisecond,@start,@end)

go

--耗時:240毫秒

從以上三個測試例子,可以得出以下結論:

1、盡量少使用 * 號,應只查詢需要的字段,能減少不必要的消耗。 

2、多使用分頁,單頁資料量較少,也可以提高查詢效率。

乙個分頁儲存過程

create procedure selectbypage

(@tblname varchar(255), -- 表名

@strgetfields varchar(1000) = '*', -- 需要返回的列

@fldname varchar(255)='', -- 排序的欄位名

@pagesize int = 40, -- 頁尺寸

@pageindex int = 1, -- 頁碼

@docount bit = 0, -- 返回記錄總數, 非 0 值則返回

@ordertype bit = 0, -- 設定排序型別, 非 0 值則降序

@strwhere varchar(1500)='' -- 查詢條件 (注意: 不要加 where))as

declare @strsql varchar(5000) -- 主語句

declare @strtmp varchar(110) -- 臨時變數

declare @strorder varchar(400) -- 排序型別

if @docount != 0

begin

if @strwhere !=''

set @strsql = 'select count(*) as total from ' + @tblname + ' where '+@strwhere

else

set @strsql = 'select count(*) as total from ' + @tblname

end

--以上**的意思是如果@docount傳遞過來的不是0,就執行總數統計。以下的所有**都是@docount為0的情況

else

begin

if @ordertype != 0

begin

set @strtmp = '<(select min'

set @strorder = ' order by ' + @fldname +' desc'

--如果@ordertype不是0,就執行降序,這句很重要!

endelse

begin

set @strtmp = '>(select max'

set @strorder = ' order by ' + @fldname +' asc'

endif @pageindex = 1

begin

if @strwhere != ''

set @strsql = 'select top ' + str(@pagesize) +' '+@strgetfields+ ' from ' + @tblname + ' where ' + @strwhere + ' ' + @strorder

else

set @strsql = 'select top ' + str(@pagesize) +' '+@strgetfields+ ' from '+ @tblname + ' '+ @strorder

--如果是第一頁就執行以上**,這樣會加快執行速度

endelse

begin

--以下**賦予了@strsql以真正執行的sql**

set @strsql = 'select top ' + str(@pagesize) +' '+@strgetfields+ ' from '

+ @tblname + ' where ' + @fldname + '' + @strtmp + '('+ @fldname + ') from (select top ' + str((@pageindex-1)*@pagesize) + ' '+ @fldname + ' from ' + @tblname + '' + @strorder + ') as tbltmp)'+ @strorder

if @strwhere != ''

set @strsql = 'select top ' + str(@pagesize) +' '+@strgetfields+ ' from '

+ @tblname + ' where ' + @fldname + '' + @strtmp + '('

+ @fldname + ') from (select top ' + str((@pageindex-1)*@pagesize) + ' '

+ @fldname + ' from ' + @tblname + ' where ' + @strwhere + ' '

+ @strorder + ') as tbltmp) and ' + @strwhere + ' ' + @strorder

endend

exec (@strsql)

初 資料庫設計優化

正規化,是關係型資料庫關係模式規範化的標準。第一正規化 1nf 強調的是列的原子性,即列不能夠再分成其他幾列。第二正規化 2nf 首先是 1nf,另外包含兩部分內容,一是表必須有乙個主鍵 二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。第三正規化 3nf 首先是 2nf,另外...

資料庫優化 資料庫設計優化

一 索引優化 1.首先索引不是越多越好,要視情況而定。因為索引會降低insert和update的效率 insert和update有時可能會重建索引。2.乙個表的索參數量最好不要超過6個,擇優而建。3.專案上線後,根據使用者的查詢條件字段稍微調整資料庫中的字段索引。二 分表 1.縱切 根據表字段來且分...

初解資料庫 事務

作為程式猿我們都應該清楚,不管是在求職面試的過程中還是在平常的開發中,資料庫起了很重要的作用,資料庫又分為關係型資料庫和非關係型資料庫。接下來將會介紹一些資料庫方面的基礎知識。提起資料庫我們想到的就是我們常常編寫的一些sql語句,那這些sql語句在執行的過程中,怎麼執行的,什麼時候結束,這時候邊涉及...