一、获取行号
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提供了一个工具,可以帮助我们分析各条语句的查询时间及其时间分布: