在前兩天的**期學術交流會上,曹建新學長提到了:對資料的查詢盡量少用「*」,需要用哪個欄位就用相應字段。對此自己產生了點小興趣,便折騰了一下。
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語句在執行的過程中,怎麼執行的,什麼時候結束,這時候邊涉及...