【问题标题】:Performance of querying partition by between indexed column and date column索引列和日期列之间查询分区的性能
【发布时间】:2019-01-22 05:15:26
【问题描述】:

问题:我很困惑如何利用索引列来提高性能或缩短执行时间,特别是在窗口函数中。

情况:我正在根据订单日期(从最早到最新)对交易进行排名。 我的第一反应是按事务的 issue_date 排序(在 Partition by 子句中)。但是随后 transaction_id 列被索引并且是表的主键。查看表的属性,Identity Increment 属性为空白(不知道为什么,但猜测它的自动增量)。所以我假设按 transaction_id 排序会产生相同的输出,但会大大提高执行速度。

我有以下疑问:

SELECT 
 transaction_id
 ,CAST(subscription_id as VARCHAR) as subscription_id 
 ,product_id
 ,ROW_NUMBER() OVER (PARTITION BY subscription_id ORDER BY issue_date ASC) AS tx_rank 
FROM table.transactions

我是否应该像这样将 issue_date 切换为 transaction_id:

ROW_NUMBER() OVER (PARTITION BY subscription_id ORDER BY transaction_id ASC) AS tx_rank

注意:这个查询需要超过 10 毫秒,我想尽可能提高它的性能。

【问题讨论】:

  • 尝试时会发生什么?这两个执行计划说明了什么?
  • @Tab Alleman 当我自己运行查询时,它崩溃了。这是我与其他查询结合的 cte 的一部分。我正在努力寻找减轻内存使用量的方法。

标签: sql sql-server indexing partitioning


【解决方案1】:

这不太可能有太大的不同。 row_number() 可以利用正在使用的列上的索引 -- (subscription_id, issue_date)(subscription_id, transaction_id)

我不确定索引是否会显着加快速度。您正在选择整个表格,这可能非常大。

【讨论】:

  • 谢谢!很高兴知道,因为我有几个具有相同逻辑的 cte 表。为什么我的问题被否决了?
猜你喜欢
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 2012-02-09
  • 2014-11-22
  • 1970-01-01
相关资源
最近更新 更多