前言:
从微软发布Linq To SQL依此,程序员围绕其与SqlDataAdapter等相比进行讨论,根据 优快云上的报道,LINQ比SqlDataReader落后的速度不超过10%。更加相信微软对Linq性能的分析会结合算法和统计结果来比较,对于linq查询性能-- 博客园的黄昕已经有所分析。于是产生想实验一下Linq和SqlDataAdapter等分别在大数据量下进行分页。园子里的 Yzl的研究室已经对Linq分页可能出现的问题提出 一种情况。(以下只是实验过程并非测试所以没有benchmark).
实验步骤:
一、数据库
数据库名People
数据表名Prof 包括ID Name Age三个字段
记录数 10万条(也许不是很足够)
下面的数据库代码并非最佳方案,大家贴一下自己的
从微软发布Linq To SQL依此,程序员围绕其与SqlDataAdapter等相比进行讨论,根据 优快云上的报道,LINQ比SqlDataReader落后的速度不超过10%。更加相信微软对Linq性能的分析会结合算法和统计结果来比较,对于linq查询性能-- 博客园的黄昕已经有所分析。于是产生想实验一下Linq和SqlDataAdapter等分别在大数据量下进行分页。园子里的 Yzl的研究室已经对Linq分页可能出现的问题提出 一种情况。(以下只是实验过程并非测试所以没有benchmark).
实验步骤:
一、数据库
数据库名People
数据表名Prof 包括ID Name Age三个字段
记录数 10万条(也许不是很足够)
下面的数据库代码并非最佳方案,大家贴一下自己的





























SET IDENTITY_INSERT Prof ON
DECLARE @i INT,@age INT
SET @i=1
WHILE @i<=100000
BEGIN
SET @age=CAST((RAND()*(100-20)+20)AS INT)
INSERT INTO Prof(ID,Name,Age) VALUES(@i,'Name_'+ CAST(@age AS NVARCHAR),@age)
SET @i=@i+1
END
SET IDENTITY_INSERT Prof OFF
DECLARE @i INT,@age INT
SET @i=1
WHILE @i<=100000
BEGIN
SET @age=CAST((RAND()*(100-20)+20)AS INT)
INSERT INTO Prof(ID,Name,Age) VALUES(@i,'Name_'+ CAST(@age AS NVARCHAR),@age)
SET @i=@i+1
END
SET IDENTITY_INSERT Prof OFF
测试代码一(SQL部分):
网上已经有很多非常好的分页算法,各人按照设计的需要选择合适的为好,特别提一下 Thin的算法(很简洁),测试中采用了 李洪根发布的其中一种分页算法








测试代码二(Linq部分)
Linq To SQL的分页主要通过Skip和Take操作符实现,代码如下:






然而却出现异常:

第一次遇到这种异常(当然很多朋友并不会,而且已经看出问题所在了),查找Skip的定义





再看一下该查询生成的SQL代码:










Skip查询需要数据标识列提供查询的根据,是否可以假设Skip是通过标识列的唯一性来逐一返回对象的呢?
修改数据库People表Prof,设置其ID为主键,(上面的数据库相应修改为)
ALTER TABLE Prof
ADD CONSTRAINT PK_ID PRIMARY KEY (ID)
GO
再次运行,显示查询耗时:00:00:00.0478485
问题:
1.为什么两次查询的耗时相差那么大呢?(估计是个人机器以及代码问题:))
2.Skip是否通过主键的唯一性逐次返回查询对象?
总结:
SQLServer的执行效率是按照语义来执行的,也许Linq在性能上不一定和SQLDataAdapter等完全一样,但是在开发效率上,我们可以看出Linq的实现代码的简易性是相对较好的,只要克服其中的一些问题,相信Linq会为以后的数据查询提供更强大帮助!
备注:
Scott写了一系列Linq的介绍非常经典
王磊发表的文章中提到过了大量数据分页的实现,主要用的数据库为Northwind而相应的代码也完善。
Linq性能测试[url]http://www.mbeller.de/2007/12/performance-comparison-between-linq.html[/url]
修改数据库People表Prof,设置其ID为主键,(上面的数据库相应修改为)
ALTER TABLE Prof


再次运行,显示查询耗时:00:00:00.0478485
问题:
1.为什么两次查询的耗时相差那么大呢?(估计是个人机器以及代码问题:))
2.Skip是否通过主键的唯一性逐次返回查询对象?
总结:
SQLServer的执行效率是按照语义来执行的,也许Linq在性能上不一定和SQLDataAdapter等完全一样,但是在开发效率上,我们可以看出Linq的实现代码的简易性是相对较好的,只要克服其中的一些问题,相信Linq会为以后的数据查询提供更强大帮助!
备注:
Scott写了一系列Linq的介绍非常经典
王磊发表的文章中提到过了大量数据分页的实现,主要用的数据库为Northwind而相应的代码也完善。
Linq性能测试[url]http://www.mbeller.de/2007/12/performance-comparison-between-linq.html[/url]
转载于:https://blog.51cto.com/greater/89678