代码之家  ›  专栏  ›  技术社区  ›  user7538827

优化Sql Server查询以更新大型列表

  •  1
  • user7538827  · 技术社区  · 7 年前

    我必须更新表格中的文章(待更新表格: 阿替科罗 ),项目位于另一个表中(包含新项目的表: TabellaTemp ),现在的问题是,我必须更新更多的旧文章,我必须插入新的!为此,我使用下面的查询,第一个更新现有文章,第二个插入新文章,第二个查询非常慢,插入新文章几乎需要20分钟(文章超过50万篇)!有没有办法提高Sql Server上此查询的性能?

    我在这里输入了表格的结构 : http://www.sqlfiddle.com/#!6/4f4ea

    查询1:

    Update Articolo set Articolo.Stato = 'Disponibile',Articolo.Prezzo = TabellaTemp.PRZNETTO,Articolo.PrezzoListino = TabellaTemp.PRZCASA,Articolo.DataAggiornamento = TabellaTemp.DATAAGG,Articolo.Descrizione = TabellaTemp.DESCR,Articolo.UM = TabellaTemp.UM
    from Articolo
    inner join TabellaTemp
    on TabellaTemp.CodMarca = Articolo.CodMarca and TabellaTemp.CODART = Articolo.CodArt 
    where Articolo.Importato = 'COMET'
    

    查询2:

    Insert into Articolo(CodMarca, CodArt, Descrizione, UM, Prezzo, PrezzoListino, DataAggiornamento, Fornitore, Importato) 
    SELECT CODMARCA, CODART, DESCR, UM, PRZNETTO, PRZCASA, DATAAGG,'COMET' as Fornitore,'COMET' as Importato 
    FROM TabellaTemp as T 
    where CODART not in (select CodArt from Articolo where Importato = 'COMET') and CODMARCA  not in (select CodArt from Articolo where Importato = 'COMET')
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Jayasurya Satheesh    7 年前

    用exists替换IN语句可以大大提高性能

    Insert into Articolo(CodMarca, CodArt, Descrizione, UM, Prezzo, PrezzoListino, DataAggiornamento, Fornitore, Importato) 
    SELECT 
        CODMARCA, 
        CODART, 
        DESCR, 
        UM, 
        PRZNETTO, 
        PRZCASA, 
        DATAAGG,
        'COMET' as Fornitore,
        'COMET' as Importato 
        FROM TabellaTemp as T 
            WHERE NOT EXISTS
            (
                select 1 from Articolo where Importato = 'COMET' AND (CodArt =T.CodArt OR CodArt = T.CODMARCA)
            )
    

    此外,尝试索引表TabellaTemp上的列以提高性能