0
Quelqu'un peut-il m'aider à écrire cette requête plus efficacement?Requête pour mettre à jour rowNum
J'ai une table qui capture le trafic TCP, et je voudrais mettre à jour une colonne appelée RowNumForFlow qui est simly le numéro séquentiel du paquet IP dans ce flux. Le code ci-dessous fonctionne bien, mais il est lent.
declare @FlowID int
declare @LastRowNumInFlow int
declare @counter1 int
set @counter1 = 0
while (@counter1 < 1)
BEGIN
set @counter1 = @counter1 + 1
-- 1)
select top 1
@FlowID = t.FlowID
from Traffic t
where t.RowNumInFlow is null
if (@FlowID is null)
break
-- 2)
set @LastRowNumInFlow = null
select top 1
@LastRowNumInFlow = RowNumInFlow
from Traffic
where [email protected] and RowNumInFlow is not null
order by ID desc
if @LastRowNumInFlow is null
set @LastRowNumInFlow = 1
else
set @LastRowNumInFlow = @LastRowNumInFlow + 1
update Traffic set RowNumInFlow = @LastRowNumInFlow
where ID = (select top 1 ID from Traffic where
flowid = @FlowID and RowNumInFlow is null)
END
valeurs de la table Exemple après requête a couru:
ID FlowID RowNumInFlow 448923 44 1 448924 44 2 448988 44 3 448989 44 4 448990 44 5 448991 44 6 448992 44 7 448993 44 8 448995 44 9 448996 44 10 449065 44 11 449063 45 1 449170 45 2 449171 45 3 449172 45 4 449187 45 5
Cela semble très bon. la clause de partition semble être ce dont j'ai besoin. Est-il possible de mettre à jour uniquement les lignes qui ne sont pas déjà remplies? – BrokeMyLegBiking
Cela a fonctionné: (j'ai ajouté la clause where). Cela tourne environ 100 000 fois plus vite que ma requête précédente. :) félicitations! "où Traffic.ID = T.ID" – BrokeMyLegBiking