Там, наверное, мало что можно сделать. Но есть два альтернативных способа express запроса, которые могут иметь лучшую производительность.
Если у вас есть индекс для «(требуемый ключ, productid)» и, возможно, «(требуемый ключ, производственный des c)» , вы можете попробовать:
select desiredKeycols,
(case distinct_cnt . . . )
from (select o.*,
(dense_rank() over (partition by desiredKeycols order by productid) +
dense_rank() over (partition by desiredKeycols order by productid desc)
) as distinct_cnt
from orders o
) o
group by desiredKeycols;
Это не останавливается на "3", но возможно, что он будет оптимизировать лучше, чем count(distinct)
.
На самом деле, небольшая альтернатива будет использовать только один индекс:
select desiredKeycols,
(case cnt . . . )
from (select o.desiredKeycols, count(*) as cnt
from orders o
group by desiredKeycols, productid
) o
group by desiredKeycols;
В некоторых базах данных это значительно быстрее, чем count(distinct)
. Тем не менее, я думаю, что SQL Сервер имеет лучший оптимизатор, так что это может не быть большой победой.