【发布时间】:2019-05-06 05:45:10
【问题描述】:
我有以下代码需要很长时间才能执行。我需要做的是在将其划分为三列(col_1、col_2、col_3)[这也是关键列]并按如下所述的某些列排序之后选择行号等于 1 的列。表中的记录数约为 9000 万。我是采用最好的方法还是有其他更好的方法?
with cte as (SELECT
b.*
,ROW_NUMBER() OVER ( PARTITION BY col_1,col_2,col_3
ORDER BY new_col DESC, new_col_2 DESC, new_col_3 DESC ) AS ROW_NUMBER
FROM (
SELECT
*
,CASE
WHEN update_col = ' ' THEN new_update_col
ELSE update_col
END AS new_col_1
FROM schema_name.table_name
) b
)
select top 10 * from cte WHERE ROW_NUMBER=1
【问题讨论】:
-
很难定义一个索引来覆盖这个查询。你真的需要在这里使用
SELECT *吗? -
Tim 说的是一个好的开始...... SELECT * 可能是个问题......你能告诉我们执行计划吗?
-
@TimBiegeleisen 我可以取消
SELECT *部分。我在这里获取 100 多行。我会尽量列出来。 -
@RodneyEllis 恐怕我无权获取执行计划。
-
好吧,如果您无法访问执行计划,您希望如何通过试错来提高性能?
标签: sql sql-server tsql group-by common-table-expression