簡體   English   中英

SQL SERVER 2016慢速插入

[英]SQL SERVER 2016 SLOW INSERT

插入塊時,插入開始的速度非常快(1秒內為3000),但是隨着時間的流逝,總共8百萬條記錄中的每3千條插入會花費60-70秒。

有人知道我可以進行審查:到目前為止,我們已經驗證了自動增長功能,它會在磁盤級別,內存上進行檢查並處理任何增加的值以發出警報。 它是VM Ware虛擬服務器,Sql Server 2016 Enterprise。

您能幫我嗎,但我可以檢查BDD,存儲和服務器的所有配置。

table_data_tmp 800萬個表標識(用於檢索)並包含索引data_table_tmp1 800萬個table_data_tmp1_2 3百萬條記錄tabla_datos_fin 19,000,000 30GB-在此處插入時插入時間很慢

附加腳本僅作為參考,因為已經確定在插入到最終表中是每次經過都要插入的位置

IF EXISTS (SELECT 1 FROM SYS.INDEXES  WHERE OBJECT_ID = OBJECT_ID( 'tabla_datos_fin') AND NAME = 'IX_tabla_datos_fin_TIP_IDE_1' AND IS_DISABLED =0)
 ALTER INDEX IX_tabla_datos_fin_TIP_IDE_1 ON tabla_datos_fin DISABLE;
GO

TRUNCATE TABLE tabla_datos_tmp


IF EXISTS (SELECT 1 FROM SYS.INDEXES  WHERE OBJECT_ID = OBJECT_ID( 'IDX_tabla_datos_tmp') AND NAME = 'tabla_datos_tmp')
DROP INDEX tabla_datos_tmp.IDX_tabla_datos_tmp
GO

INSERT INTO tabla_datos_tmp (campos)
        SELECT *
        FROM [tabla_datos_tmp1] 

CREATE INDEX IDX_tabla_datos_tmp ON tabla_datos_tmp (CONTROL_INT) INCLUDE (all campos)


DECLARE
    @batchsize INT,
    @ctr INT,
    @rc INT,
@val_ini int,
@val_fin int
SELECT
    @batchsize = 3000,
    @ctr = 0;

WHILE 1 = 1
BEGIN

set @val_ini = @batchsize * @ctr 
set @val_fin =  @batchsize * (@ctr + 1)

truncate table tabla_datos_tmp1_2


INSERT INTO tabla_datos_tmp1_2
(all campos)
SELECT*
FROM tabla_datos_tmp WITH (INDEX =IDX_tabla_datos_tmp )
WHERE CONTROL_INT > @VAL_INI
AND CONTROL_INT <= @VAL_FIN 

UPDATE tabla_datos_tmp1_2 SET FECHA_ULTIMA_ACTUALIZACION= GETDATE ()



/* INSERTION IS DELAYED HERE */
INSERT INTO tabla_datos_fin (al campos)
SELECT *
FROM tabla_datos_tmp1_2 
/**********************/

DELETE  A
FROM tabla_datos_tmp A   WITH (INDEX =IDX_tabla_datos_tmp )
WHERE CONTROL_INT > @VAL_INI AND CONTROL_INT <= @VAL_FIN

IF @@ROWCOUNT = 0
BREAK;

SET @ctr = @ctr + 1;
PRINT @ctr
END

IF EXISTS (SELECT 1 FROM SYS.INDEXES  WHERE OBJECT_ID = OBJECT_ID( 'tabla_datos_fin') AND NAME = 'IX_tabla_datos_fin' AND IS_DISABLED =1)
 ALTER INDEX IX_tabla_datos_fin ON tabla_datos_fin REBUILD;  
GO
IF EXISTS (SELECT 1 FROM SYS.INDEXES  WHERE OBJECT_ID = OBJECT_ID( 'tabla_datos_fin') AND NAME = 'IX_tabla_datos_fin_TIP_IDE_1' AND IS_DISABLED =1)
ALTER INDEX IX_tabla_datos_fin_TIP_IDE_1 ON tabla_datos_fin REBUILD;  
GO

使用sql server等待統計信息來查看sql正在等待什么。 找到這些之后,請深入研究其他性能計數器,直到找到問題為止。 我的猜測是您的磁盤無法跟上。

https://www.sqlskills.com/blogs/paul/wait-statistics-or-please-tell-me-where-it-hurts/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM