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
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
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提供了一個工具,可以幫助我們分析各條語句的查詢時間及其時間分佈: