Click here to Skip to main content
15,942,156 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
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"
Posted
Updated 17-Sep-18 13:55pm
Comments
F-ES Sitecore 17-Sep-18 6:20am    
Don't use "in" and "not in", they are terrible for performance. Use table joins instead. Joining two tables will give a result set that contains only matching items so that's the same as an "in" and for "not in" you can do a "left join" and test where the joined table has null values.
Richard Deeming 18-Sep-18 14:24pm    
Sounds like you're looking for the MERGE[^] statement.

1 solution

1) Your "round-tripping" and processing synchronously; don't see the point.

2) You added a primary index to a table; then effectively did a "bulk load"; which is bad form. Add the index AFTER a bulk load.

3) There is no "update" requirement; it's simply a question of loading one file; and then loading any records NOT in the former (file) from the "other" file.
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900