为每个行号选择前 10 个
Posted
技术标签:
【中文标题】为每个行号选择前 10 个【英文标题】:select top 10 for each rownumber 【发布时间】:2015-05-19 17:38:48 【问题描述】:查询 #1 为每个撬块返回数千行。我想知道是否有更快的方法只为每个滑道选择前 10 名。查询 #2 很慢。有什么方法可以优化查询 #1 以使其更快?
查询 #1
select skid, date_run, price, ROW_NUMBER()over(PARTITION BY
skid ORDER BY date_run ASC) as rowid
from stocktrack where rsi is null
查询 #2
with ctevalue
(select skid, date_run, price, ROW_NUMBER()over(PARTITION BY
skid ORDER BY date_run ASC) as rowid
from stocktrack where rsi is null
)
select skid, date_run rowid
from ctevalue
where rowid < 11
【问题讨论】:
执行计划是什么样的? stocktrack 表上有哪些索引? 【参考方案1】:你试过了吗
select
*
from
(select
skid, date_run, price, ROW_NUMBER() over (PARTITION BY skid ORDER BY date_run ASC) as rowid
from
stocktrack where rsi is null) data
where
data.rowid < 11
希望对你有帮助
【讨论】:
您能否在启用执行计划的情况下尝试此查询,以查看 SQL Server 是否推荐任何其他索引?我认为它可以通过索引来改进。顺便说一句,您检索了多少条记录?【参考方案2】:尝试使用cross apply
:
select st.skid, st.date_run, st.price
from sktable sk cross apply
(select top 10 st.*
from stocktrack st2
where st2.skid = sk.skid and
order by date_run asc
) st
以及stocktrack(skid, date_run, price)
上的索引。
第一个表是skid
所指的任何地方。有需要的可以试试(select distinct skid from stocktrack st)
。
【讨论】:
以上是关于为每个行号选择前 10 个的主要内容,如果未能解决你的问题,请参考以下文章