1. 程式人生 > >sql server查詢技巧

sql server查詢技巧

一、獲取行號

1、使用排名函式row_number:速度慢

select row_number() over(order by id) as rowindex

2、使用identity函式生成自增欄位:速度快

select identity(int, 1, 1) as rowindex into #temp from student

3、新建一個包含identity(1,1)約束欄位的臨時表,再把查詢結果插入:效率同第2種

Create Table #temp  
(  
rowindex 

int identity(1,1) PRIMARY KEY, 

name varchar(50)

)

insert #temp(name)

select name from t

4、在程式程式碼中的DataTable中加一列,迴圈修改其值:不可取


二、分頁

1、在sql儲存過程中

在查詢結果中包含行號之後分頁就容易多了,方法如下:

--傳入頁碼和每頁個數

CREATE proc FD_Get
@pageIndex int=1,
@pageSize int=20


--分頁查詢
SELECT *   
FROM #temp   

WHERE RowIndex > (@pageIndex - 1) * @pageSize AND RowIndex <= @pageIndex * @pageSize  
ORDER BY RowIndex  


2、在程式碼中

當然,你也可以直接在程式碼中寫分頁,然後用Linq返回IQueryable的延遲載入方式,Skip和Take完之後

var query=from t in context.t 

select t;

var list=query.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();


三、分組內獲取最大日期那一行記錄

如果不用分組就行簡單:

1、直接按日期倒序排序再top 1

select top 1 * from t order by CreateDate desc

2、先獲取最大日期再過濾

select * from t where CreateDate=(select max(CreateDate) from t)

如果要分組:

1、先分組獲取最大日期再過濾

select t1.*
from A t1
join(
select pid,CreateDate=MAX(CreateDate)
from A 
group by pid
)t2 on t1.pid=t2.pid and t1.CreateDate=t2.CreateDate

2、用排序函式row_number加分組關鍵字PARTITION

select *
from (select rn= ROW_NUMBER() OVER (PARTITION BY pid ORDER BY CreateDate DESC),*
from A) t
where t.rn=1



四、跟蹤資料庫操作

工具就是SQL Server Profiler,這個用得很多了,我只講技巧

事件選擇:一般只選擇RPC:Completed和SQL:BatchCompleted跟蹤儲存過程和批處理語句就夠了

列篩選器:TextData的“型別於”可以幫助我們過濾掉我們只想看的結果,可以用%key%實現模糊過濾



五、根據執行計劃改善效能

報表查詢很多時候為了查詢效率用到儲存過程,但很多時候資料量大,關聯表多時,查詢效果也不一定能夠改觀

這時我們就要去一條條分析所有的查詢語句,看是否有改善的餘地

而sql server提供了一個工具,可以幫助我們分析各條語句的查詢時間及其時間分佈: