SQL语句效率问题 5
数据库中有个包含100万条数据的表,使用两个SQL语句获取第599,900-600,000条数据,如下图:理论上讲,第一句的开销应该是高于第二句的,但使用SQLServe...
数据库中有个包含100万条数据的表,使用两个SQL语句获取第599,900-600,000条数据,如下图:
理论上讲,第一句的开销应该是高于第二句的,但使用SQL Server Management Studio得到的结果确是第二句的开销远高于第一句。
怎么回事?
注:获取第999,900-1,000,000条数据的时候,开销却是正常的,如下图:
附测试数据库表及数据的创建语句:
CREATE TABLE [dbo].[testTable] (
[id] INT NOT NULL,
[col1] NVARCHAR (50) NOT NULL,
[col2] NVARCHAR (50) NOT NULL,
[col3] NVARCHAR (50) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
go
DECLARE @i INT
SET @i=1
WHILE @i<=1000000
BEGIN
INSERT INTO [testTable]([id],[col1],[col2],[col3]) VALUES(@i, 'ValueA'+CONVERT(varchar,@i),'ValueB'+CONVERT(varchar,@i),'ValueC'+CONVERT(varchar,@i))
set @i=@i+1
END 展开
理论上讲,第一句的开销应该是高于第二句的,但使用SQL Server Management Studio得到的结果确是第二句的开销远高于第一句。
怎么回事?
注:获取第999,900-1,000,000条数据的时候,开销却是正常的,如下图:
附测试数据库表及数据的创建语句:
CREATE TABLE [dbo].[testTable] (
[id] INT NOT NULL,
[col1] NVARCHAR (50) NOT NULL,
[col2] NVARCHAR (50) NOT NULL,
[col3] NVARCHAR (50) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
go
DECLARE @i INT
SET @i=1
WHILE @i<=1000000
BEGIN
INSERT INTO [testTable]([id],[col1],[col2],[col3]) VALUES(@i, 'ValueA'+CONVERT(varchar,@i),'ValueB'+CONVERT(varchar,@i),'ValueC'+CONVERT(varchar,@i))
set @i=@i+1
END 展开
1个回答
展开全部
对比查询性能,不能只看语句,而是要看执行计划。即使是相同的查询语句,在不同的情况下也有可能生成不同的执行计划。
之所以一个查询性能高,是因为id字段上有聚集索引。从查询计划来看,使用了合并连接(merge join),合并连接是非常高效的连接。
而第二个查询使用了max聚合,聚合运算本身效率比较低,而且因为聚合的使用,使得不能使用合并连接,而只能使用嵌套循环(nested loop),所以效率低。
之所以一个查询性能高,是因为id字段上有聚集索引。从查询计划来看,使用了合并连接(merge join),合并连接是非常高效的连接。
而第二个查询使用了max聚合,聚合运算本身效率比较低,而且因为聚合的使用,使得不能使用合并连接,而只能使用嵌套循环(nested loop),所以效率低。
追问
那为何获取第999,900-1,000,000条数据时,第一个语句开销会增加这么多倍?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询