sql server查询技巧

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dongliang_shali/article/details/50736471

一、获取行号

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



猜你喜欢

转载自blog.csdn.net/dongliang_shali/article/details/50736471