SQLにおけるGroupパケット取得TopNメソッド実装優先row_number

2277 ワード

製品表があり、id、name、city、addtimeの4つのフィールドが含まれています.レポートは都市ごとにグループ化する必要があるため、各都市の最新の10製品を統計し、この表に100万のデータを挿入し、以下のシリーズのテストを行いました.
 
  
CREATE TABLE [dbo].[products](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](50) NULL,
[addtime] [datetime] NULL,
[city] [nvarchar](10) NULL,
CONSTRAINT [PK_products] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

1、row_を採用するnumberメソッドは,5回実行し,平均8秒程度で速度が最も速い.
 
  
select no, id,name,city
from (select no =row_number() over (partition by city order by addtime desc), * from products)t
where no< 11 order by city asc,addtime desc

2、cross apply法を採用し、3回実行したが、基本的に3分5秒以上で、もう遅い.
 
  
select distinct b.id,b.name,b.city from products a
cross apply (select top 10 * from products where city = a.city order by addtime desc) b

3、Countクエリーを採用し、2回しか実行しなかったが、初めて5分まで実行した場合、タスクの実行をキャンセルした.2回目の実行が13分になると、holdがなくてそのまま止まってしまい、本当に我慢できません.
 
  
select id,name,city from products a
where ( select count(city) from products where a.city = city and addtime>a.addtime) < 10
order by city asc,addtime desc

4、カーソルの方法を採用して、この最後のテストは、5回実行して、毎回10秒で完成して、感じは悪くありません.
 
  
declare @city nvarchar(10)
create table #Top(id int,name nvarchar(50),city nvarchar(10),addtime datetime)
declare mycursor cursor for
select distinct city from products order by city asc
open mycursor
fetch next from mycursor into @city
while @@fetch_status =0
begin
insert into #Top
select top 10 id,name,city,addtime from products where city = @city
fetch next from mycursor into @city
end
close mycursor
deallocate mycursor
Select * from #Top order by city asc,addtime desc
drop table #Top

上記の比較では、GroupがTop Nシーンを取得する際にrow_を優先できることがわかりました.number,カーソルcursorの次に,他の2つはほとんど考慮せず,データ量が大きい場合はまったく使用できない.