Comment optimiser le code SQL Server?

J'ai un tableau avec les colonnes: Id, time, valeur.

Première étape: Étant donné les parameters d'input comme identifiant de signal, heure de début et heure de fin, je veux d'abord extraire les lignes avec l'identifiant du signal et l'heure est entre l'heure de début et l'heure de fin.

Deuxième: Supposons que j'ai sélectionné 100 lignes dans la première étape. Étant donné un autre paramètre d'input qui est max_num, je veux sélectionner des échantillons max_num sur 100 lignes, mais de manière uniforme. Par exemple, si max_num est défini sur 10, je sélectionnerai 1, 11, 21, .. 91 lignes sur 100 lignes.

Je ne suis pas sûr si la procédure stockée ci-dessous est optimale, si vous trouvez des inefficacités du code, s'il vous plaît le signaler à moi et donner une suggestion.

create procedure data_selection @sig_id bigint, @start_time datetime2, @end_time datetime2, @max_num float AS BEGIN declare @tot float declare @step int declare @selected table (id int primary key identity not null, Date datetime2, Value real) // first step insert into @selected (Date, Value) select Date, Value from Table where Id = @sig_id and Date > = @start_time and Date < = @end_time order by Date // second step select @tot = count(1) from @selected set @step = ceiling(@tot / @max_num) select * from @selected where id % @step = 1 END 

EDITED pour calculer step à la volée. J'avais d'abord pensé que c'était un argument.

 ;with data as ( select row_number() over (order by [Date]) as rn, * from Table where Id = @sig_id and Date between @start_time and @end_time ), calc as ( select cast(ceiling(max(rn) / @max_num) as int) as step from data ) select * from data cross apply calc as c where (rn - 1) % step = 0 --and rn <= (@max_num - 1) * step + 1 

Ou je suppose que vous pouvez juste order / filterr par votre valeur d' identity comme vous l'avez déjà eu:

 ;with calc as (select cast(ceiling(max(rn) / @max_num) as int) as step from @selected) select * from @selected cross apply calc as c where (id - 1) % step = 0 --and id <= (@max_num - 1) * step + 1 

Je pense que parce que vous arrondissez votre ceiling vous findez facilement des scénarios où vous avez less de lignes que @max_num . Vous pourriez vouloir arrondir à la place: case when floor(max(rn) / @max_num) = 0 then 1 else floor(max(rn) / @max_num) end as step ?