2009-02-19 4 views
1

La requête est:Mise à jour avec jointure interne à même optimisations de table

CREATE TABLE logfile (
    sequence_number BIGINT, 
    start_time DECIMAL, 
    finish_time DECIMAL, 
    irp_major VARCHAR(100), 
    offset BIGINT, 
    length BIGINT, 
    filename VARCHAR(2000), 
    is_seq BIT 
    ); 
//bulk insert 120 000 rows 
CREATE CLUSTERED INDEX IX_logfile ON logfile(sequence_number); 
UPDATE dbo.logfile SET is_seq = (
SELECT CASE WHEN a.offset = (b.offset + b.length) THEN 1 ELSE 0 END AS seq 
FROM dbo.logfile a 
     LEFT JOIN dbo.logfile b 
      ON a.sequence_number = b.sequence_number + 1 
WHERE a.sequence_number = logfile.sequence_number) 

Y at-il de toute façon je peux améliorer les performances de la requête de mise à jour?

Répondre

1
MERGE 
INTO logfile l 
USING (
    SELECT sequence_number + 1 AS pseq, 
     p.* 
    FROM logfile p 
) pl 
ON l.sequence_number = pseq 
WHEN MATCHED THEN 
    UPDATE 
    SET is_seq = CASE WHEN l.offset = (pl.offset + pl.length) THEN 1 ELSE 0 END 
+0

@Quassnoi. Résultat différent ou non, j'ai (encore) appris quelque chose de nouveau. THX. –

+0

ahh trouvé l'erreur: sequence_number - 1 devrait être sequence_number + 1. Fonctionne bien maintenant, la vitesse est plus ou moins équivalente à @lievens, les deux sont de meilleure qualité que le mien :) – devzero

+0

Bien sûr, l'a manqué. – Quassnoi

1

Peut-être que cette mise à jour serait plus rapide

UPDATE dbo.LogFile SET is_seq = 0 
UPDATE dbo.LogFile SET is_seq = 1 
FROM dbo.LogFile f 
    INNER JOIN (
     SELECT f2.sequence_number 
     FROM dbo.LogFile f1 
      INNER JOIN dbo.LogFile f2 ON f2.sequence_number = f1.sequence_number + 1  
     WHERE f1.Offset <> f2.Offset + f2.Length 
    ) f2 ON f2.sequence_number = f.sequence_number 
Questions connexes