改进SQL服务器上的更新并插入查询性能 [英] Improve update and insert query performance on SQL server

查看:79
本文介绍了改进SQL服务器上的更新并插入查询性能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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"

推荐答案

1)你的圆圈 g并同步处理;不明白这一点。



2)你在表中添加了一个主索引;然后有效地做了大量装载;这是不好的形式。在批量加载后添加索引。



3)没有更新要求;这只是一个加载一个文件的问题;然后从其他文件加载不在前者(文件)中的任何记录。
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.


这篇关于改进SQL服务器上的更新并插入查询性能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆