rikidev Ответов: 1

Повышение производительности запросов обновления и вставки на SQL server


Hello then the insert and update queries below must insert the items not present in the **Articolo** table by importing them from **Importazione**, and must update the items in the **Articolo** with those present in the **Importazione**. To summarize in **Articolo** the articles must be updated and the new ones included. The fact is that the two queries used by c # are very slow. How can I speed them up?
Sql Execution Plan Insert : https://www.brentozar.com/pastetheplan/?id=ryifseaOX


Sql Execution Plan Update :: https://www.brentozar.com/pastetheplan/?id=HyJpilaOQ

What I have tried:

<pre>

**Sql Create Table:**

    --Table Articolo--
    CREATE TABLE dbo.Articolo (
    	IdArticolo int NOT NULL IDENTITY(1,1),
    	CodArt varchar(max) NULL,
    	TipoArticolo varchar(5) NULL DEFAULT ('A'),
    	CodMarca varchar(100) NULL DEFAULT (NULL),
    	CodEAN bigint(8) NULL,
    	Fornitore varchar(200) NULL DEFAULT (NULL),
    	Importato varchar(200) NULL DEFAULT (NULL),
    	UM varchar(10) NULL DEFAULT (NULL),
    	Descrizione varchar(max) NULL,
    	Prezzo money(8) NULL DEFAULT (NULL),
    	PrezzoListino money(8) NULL DEFAULT (NULL),
    	LeadTime varchar(10) NULL DEFAULT (NULL),
    	QualificatoreCodiceBarcode varchar(10) NULL DEFAULT (NULL),
    	CodiceBarcode varchar(50) NULL DEFAULT (NULL),
    	CodiceElectrocod varchar(30) NULL DEFAULT (NULL),
    	FamigliaStatistica varchar(30) NULL DEFAULT (NULL),
    	FamigliadiSconto varchar(30) NULL DEFAULT (NULL),
    	IdFamigliaDiSconto int NULL,
    	StatodelProdotto varchar(30) NULL DEFAULT (NULL),
    	QuantitaMassimaOrdinazione int NULL DEFAULT (NULL),
    	MoltiplicatorePrezzo int NULL DEFAULT (NULL),
    	QuantitaMinimaOrdinazione int NULL DEFAULT (NULL),
    	QuantitaMultiplaOrdinazione int NULL DEFAULT (NULL),
    	ProdottoComposto int NULL DEFAULT (NULL),
    	QuantitaCartone int NULL DEFAULT (NULL),
    	CodiceValuta varchar(20) NULL DEFAULT (NULL)
    );
    
    ALTER TABLE dbo.Articolo ADD CONSTRAINT PK__Articolo__FA03D0EE175B45B9 PRIMARY KEY (IdArticolo);
    
    
    --Table Importazione--
        create table Importazione( CodiceNumericoEV varchar(5000),DescrizioneArticolo varchar(5000),CodiceArticoloEV varchar(5000),MarcaEV varchar(5000),UM varchar(5000),
        PrezzoListino money,Sconto1 money,Sconto2 money,Sconto3 money,Sconto4 money,PrezzoNetto money,CodiceBarreMetel bigint,IVA varchar(5000),MarcaMetel varchar(5000),
        ArticoloMetel varchar(5000),DescrizioneMarca varchar(5000))

**C# Code:**

    String QueryInserimentoNuoviArticoli = "Insert into Articolo(CodArt,Descrizione,CodMarca,CodEAN,Prezzo,PrezzoListino,UM,Fornitore,Importato) SELECT ArticoloMetel as CodArt,DescrizioneArticolo as Descrizione,MarcaMetel as CodMarca,CodiceBarreMetel as CodEAN,PrezzoNetto,PrezzoListino,UM,MarcaMetel as Fornitore,'ELETTROVENETA' as Importato FROM Importazione where ArticoloMetel not in ( select CodArt from Articolo where Importato = 'ELETTROVENETA' ) and MarcaMetel not in ( select CodMarca from Articolo where Importato = 'ELETTROVENETA' ) ";
    SqlCommand command2 = new SqlCommand(QueryInserimentoNuoviArticoli, conn)
    {
      CommandTimeout = 0
    };
    command2.ExecuteNonQuery();
    command2.Parameters.Clear();
    String QueryAggiornamentoArticoliPresenti = " Update Articolo set Stato = 'Disponibile', Descrizione = i.Descrizione, CodEAN = i.CodEAN, Prezzo = i.PrezzoNetto, PrezzoListino = i.PrezzoListino, UM = i.UM, DataAggiornamento = getdate() from( SELECT ArticoloMetel as CodArt, DescrizioneArticolo as Descrizione, MarcaMetel as CodMarca, CodiceBarreMetel as CodEAN, PrezzoNetto, PrezzoListino, UM, MarcaMetel as Fornitore, 'ELETTROVENETA' as Importato FROM Importazione  where ArticoloMetel in (select CodArt from Articolo where Importato = 'ELETTROVENETA') and MarcaMetel in (select CodMarca from Articolo where Importato = 'ELETTROVENETA'))i where Articolo.CodArt = i.CodArt and i.CodMarca = Articolo.CodMarca and Articolo.Importato = 'ELETTROVENETA' and Articolo.Fornitore = i.Fornitore";
    SqlCommand command3 = new SqlCommand(QueryAggiornamentoArticoliPresenti, conn){CommandTimeout = 0};

# Extracted queries

insert:

    INSERT INTO Articolo(CodArt, Descrizione, CodMarca, CodEAN, Prezzo, PrezzoListino, UM, Fornitore, Importato)
    SELECT ArticoloMetel AS CodArt,
           DescrizioneArticolo AS Descrizione,
           MarcaMetel AS CodMarca,
           CodiceBarreMetel AS CodEAN,
           PrezzoNetto,
           PrezzoListino,
           UM,
           MarcaMetel AS Fornitore,
           'ELETTROVENETA' AS Importato
    FROM Importazione
    WHERE ArticoloMetel NOT IN
        (SELECT CodArt
         FROM Articolo
         WHERE Importato = 'ELETTROVENETA' )
      AND MarcaMetel NOT IN
        (SELECT CodMarca
         FROM Articolo
         WHERE Importato = 'ELETTROVENETA' )

update:

    UPDATE Articolo
    SET Stato = 'Disponibile',
        Descrizione = i.Descrizione,
        CodEAN = i.CodEAN,
        Prezzo = i.PrezzoNetto,
        PrezzoListino = i.PrezzoListino,
        UM = i.UM,
        DataAggiornamento = getdate() 
    FROM
      (SELECT ArticoloMetel AS CodArt, DescrizioneArticolo AS Descrizione, MarcaMetel AS CodMarca, CodiceBarreMetel AS CodEAN, PrezzoNetto, PrezzoListino, UM, MarcaMetel AS Fornitore, 'ELETTROVENETA' AS Importato
       FROM Importazione
       WHERE ArticoloMetel IN
           (SELECT CodArt
            FROM Articolo
            WHERE Importato = 'ELETTROVENETA')
         AND MarcaMetel IN
           (SELECT CodMarca
            FROM Articolo
            WHERE Importato = 'ELETTROVENETA'))i
    WHERE Articolo.CodArt = i.CodArt
      AND i.CodMarca = Articolo.CodMarca
      AND Articolo.Importato = 'ELETTROVENETA'
      AND Articolo.Fornitore = i.Fornitore"

F-ES Sitecore

Не используйте "в" и "не в", они ужасны для производительности. Вместо этого используйте соединения таблиц. Объединение двух таблиц даст результирующий набор, содержащий только совпадающие элементы, так что это то же самое, что и "in", а для "not in" вы можете сделать "левое соединение" и проверить, где объединенная таблица имеет нулевые значения.

Richard Deeming

Звучит так, будто ты ищешь ... ПОГЛОЩАТЬ[^] заявление.

1 Ответов

Рейтинг:
2

Gerry Schmitz

1) ваше "круговое отключение" и обработка синхронно; не вижу смысла.

2) вы добавили первичный индекс в таблицу, а затем эффективно выполнили "массовую загрузку", что является плохим тоном. Добавьте индекс после массовой загрузки.

3) нет никакого требования "обновить"; это просто вопрос загрузки одного файла; а затем загрузки любых записей, не входящих в первый (файл) из "другого" файла.