每类型取前N条的效率问题

手抓宝 2012-03-29 04:13:52
我有一张新闻表News,有1万多条数据,其中分类字段名为PType,按时间字段(PDate)和推荐度(PTopNum)进行排序后,按每类行@Count条读取数据,我写了两种方法:

Select * From (
Select *, (Row_Number() OVER (PARTITION BY ptype Order by PtopNum DESC ,pdate DESC)) as Row_Num From News
) ntb Where Row_Num<=@Count


declare @temp int
declare cur cursor for select distinct ptype from News
open cur

WHILE @@FETCH_STATUS <>-1
begin
FETCH NEXT FROM cur INTO @temp
select top(@Count)* from News where PType=@temp order by PtopNum DESC ,pdate DESC
end
CLOSE cur
DEALLOCATE cur


这两种方法在sql server 2008中执行,都是8秒左右的时间,请问有没有其他的方案,提高查询效率?
...全文
181 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaobinbinbin 2012-03-31
  • 打赏
  • 举报
回复
2楼的回复太威5
Barton 2012-03-31
  • 打赏
  • 举报
回复
用row_number()
手抓宝 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
才1万+数据,是不是可以不去考虑索引呢?
[/Quote]

哦,这1w多只是开发测试数据。实际应用的数据量要远远大于这些
手抓宝 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]
你可以试试这里面的别的方案。我并没贴错,确定你就是分组前N行[/Quote]

先谢过啦。
你的这些我先前都找过,都试过。能实现功能没错,但是效率是个问题,我现在想的是能否在效率上有所改进

这个查询主要是用在首页的。如果从SQL语句的方面的确不能提高效率,我还是考虑一下首页静态化吧。
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

SQL code

--查每个分组前N条记录


--> 生成测试数据: #T
IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
CREATE TABLE #T (ID VARCHAR(3),GID INT,Author VARCHAR(29),Title VARCHAR(39),Date DATETIME)
INSERT INTO……
[/Quote]

你可以试试这里面的别的方案。我并没贴错,确定你就是分组前N行
D_B_H 2012-03-29
  • 打赏
  • 举报
回复
才1万+数据,是不是可以不去考虑索引呢?
手抓宝 2012-03-29
  • 打赏
  • 举报
回复
聚集索引在主键上,不能动。
手抓宝 2012-03-29
  • 打赏
  • 举报
回复

CREATE NONCLUSTERED INDEX [iDate_Top] ON [dbo].[News]
(
[PDate] DESC,
[PtopNum] DESC
)
INCLUDE ( [PType]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO


我这样做对么??效率没有变化。。。
dawugui 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
索引建立在ptype 上不合适吧

PtopNum ,pdate 上还差不多。[/Quote]
如果想更快,对ptype+PtopNum(按照倒序)+pdate(按照倒序)建立一个索引.
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 7 楼 的回复:

引用 4 楼 的回复:

引用 2 楼 的回复:

SQL code

--查每个分组前N条记录


--> 生成测试数据: #T
IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
CREATE TABLE #T (ID VARCHAR(3),GID INT,Author VA……
[/Quote]

没。你别误会。我本来就比你们都小,不要误会了啊。不过我有疑问,我贴的是分组前N条记录的方法,怎么会错了。希望解释一下
黄_瓜 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 4 楼 的回复:

引用 2 楼 的回复:

SQL code

--查每个分组前N条记录


--> 生成测试数据: #T
IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
CREATE TABLE #T (ID VARCHAR(3),GID INT,Author VARCHAR(29),Title ……
[/Quote]
受不起啊
黄_瓜 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

1.首先对PType建立索引.
2.然后用你的查询语句即可.(sql server , oracle都是使用这样的方法)

SQL code
Select * From
(
Select *, Row_Number() OVER (PARTITION BY ptype Order by PtopNum DESC ,pdate DESC) as Row_Num From New……
[/Quote]
索引建立在ptype 上不合适吧

PtopNum ,pdate 上还差不多。
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 5 楼 的回复:
方法差不多就我给的资料里的那几种,觉得还是使用楼上F姐姐说的那样处理好


不能不说你太崇拜F姐了。

楼主的两个算法效率差不多,是不是和没有建立索引有关系呢?你建立上索引看看
[/Quote]
这你都知道??
dawugui 2012-03-29
  • 打赏
  • 举报
回复
1.首先对PType建立索引.
2.然后用你的查询语句即可.(sql server , oracle都是使用这样的方法)

Select * From 
(
Select *, Row_Number() OVER (PARTITION BY ptype Order by PtopNum DESC ,pdate DESC) as Row_Num From News
) ntb
Where Row_Num<=@Count

  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
方法差不多就我给的资料里的那几种,觉得还是使用楼上F姐姐说的那样处理好
[/Quote]

不能不说你太崇拜F姐了。

楼主的两个算法效率差不多,是不是和没有建立索引有关系呢?你建立上索引看看
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 2 楼 的回复:

SQL code

--查每个分组前N条记录


--> 生成测试数据: #T
IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
CREATE TABLE #T (ID VARCHAR(3),GID INT,Author VARCHAR(29),Title VARCHAR(39),Date……
[/Quote]

我叫你哥!!!!!!!!!!!!!
Felixzhaowenzhong 2012-03-29
  • 打赏
  • 举报
回复
建议用 ROW_NUMBER() 排序函数。当用游标实现时,数据量超过1万后效率会降低还耗资源。
  • 打赏
  • 举报
回复
方法差不多就我给的资料里的那几种,觉得还是使用楼上F姐姐说的那样处理好
黄_瓜 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

SQL code

--查每个分组前N条记录


--> 生成测试数据: #T
IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
CREATE TABLE #T (ID VARCHAR(3),GID INT,Author VARCHAR(29),Title VARCHAR(39),Date DATETIME)
INSERT INTO……
[/Quote]

哥看清题目在贴。
黄_瓜 2012-03-29
  • 打赏
  • 举报
回复
清空缓存了吗?
加载更多回复(2)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧