Повышение производительности запросов обновления и вставки на 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" вы можете сделать "левое соединение" и проверить, где объединенная таблица имеет нулевые значения.