2010-05-07 6 views
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

Répondre

1

Quelque chose comme ceci:

update 
    T 
set 
    RowNumInFlow = @TheNumber 
FROM 
    (
    SELECT 
     ID, 
     ROW_NUMBER() OVER (PARTITION BY FlowID ORDER BY ID) AS TheNumber 
    FROM 
     Traffic 
    ) T 

Après commentaires:

update 
    T1 
set 
    RowNumInFlow = TR.TheNumber 
FROM 
    Traffic T1 
    JOIN 
    (
    SELECT 
     ID, 
     ROW_NUMBER() OVER (PARTITION BY FlowID ORDER BY ID) AS TheNumber 
    FROM 
     Traffic 
    ) TR ON T1.ID = TR.ID 
    WHERE 
     T1.RowNumInFlow IS NULL --like this? 
+0

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

+0

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