Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Diegodcl

Insert não funciona

Recommended Posts

Pessoal tenho uma tabela que tem 185 milhões de registros de 1 ano inteiro de faturamento. Preciso inserir esses dados em uma nova tabela vazia, fazendo um join com algumas tabelas auxiliares. Depois de umas 2hs , não acontece nada. o arquivo do banco de dados cresce até 122 GB e o log até 99. o management studio não me retorna nada simplesmente fica executando. já usei recovery model simple e full. alguém tem alguma sugestão do q posso fazer pra resolver o problema?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego,

 

 

minha sugestão é primeiro verificar se a querie está certa,

observe o tempo que ela demora para retornar 1 milhao de linhas por exemplo,

se estiver muito ruim tente criar indices.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça a query para alguns registros (limitando por algumas poucas chaves) e veja se os joins estão certos.

 

Depois que estiver certo disto rode a query apenas com count(*) para se certificar dos totais.

 

Devido ao tamanho da encrenca eu faria com cursor e commits de x em x registros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caio,

 

O tempo q ela demora pra percorrer a tabela toda com um select simples é 24min. ela tá com índice nos campos de UF e data de movimentação q são os campos q uso pra filtrar os dados. a instrução básicamente é:

 

a, um detalhe se eu mando ele inserir apenas 1 mês como no exemplo abaixo ele não funciona, mas se eu der um top 10000000 ele insere, e com certeza o primeiro mês não tem nem 5000000 registros.

 

 

INSERT INTO SIA_PA_APAC (
ID_PA_CBOCOD, 
ID_PA_CIDCAS, 
PA_CONDIC, 
ID_PA_CIDPRI, 
PA_REGCT, 
PA_INCOUT, 
PA_INCURG, 
PA_TPUPS, 
PA_TIPPRE, 
PA_MN_IND, 
ID_PA_CIDSEC, 
ID_PA_CMP, 
ID_PA_CNPJ_CC, 
ID_PA_CNPJCPF, 
ID_PA_CNPJMNT, 
ID_PA_CODUNI, 
PA_TPFIN, 
PA_SUBFIN, 
PA_NIVCPL, 
PA_DOCORIG, 
PA_AUTORIZ, 
ID_PA_GESTAO, 
PA_MOTSAI, 
PA_OBITO, 
PA_ENCERR, 
PA_PERMAN, 
PA_ALTA, 
PA_TRANSF, 
ID_PA_MUNPCN, 
ID_PA_MVM, 
ID_PA_PROC_ID, 
PA_CATEND, 
PA_IDADE, 
IDADEMIN, 
IDADEMAX, 
PA_FLIDADE, 
PA_SEXO, 
PA_RACACOR, 
ID_PA_UFMUN, 
PA_QTDPRO, 
PA_QTDAPR, 
PA_VALPRO, 
PA_VALAPR, 
PA_UFDIF, 
PA_MNDIF, 
PA_DIF_VAL, 
NU_VPA_TOT, 
NU_PA_TOT, 
PA_INDICA, 
PA_CODOCO, 
PA_FLQT, 
PA_FLER, 
PA_ETNIA
)

SELECT --top 50000000
ID_PA_CBOCOD = CBO.ID_CBO, 
ID_PA_CIDCAS = CIDCAS.ID_CID, 
PA_CONDIC, 
ID_PA_CIDPRI = CIDPRI.ID_CID, 
PA_REGCT, 
PA_INCOUT, 
PA_INCURG, 
PA_TPUPS, 
PA_TIPPRE, 
PA_MN_IND, 
ID_PA_CIDSEC = CIDSEC.ID_CID, 
ID_PA_CMP = CMP.ID_ANOMES, 
ID_PA_CNPJ_CC = S_FORNEC.ID_FORNEC, 
ID_PA_CNPJCPF = CNPJCPF.ID_CNES, 
ID_PA_CNPJMNT = CNPJMNT.ID_CNES, 
ID_PA_CODUNI = CODUNI.ID_CNES, 
PA_TPFIN, 
PA_SUBFIN, 
PA_NIVCPL, 
PA_DOCORIG, 
PA_AUTORIZ, 
ID_PA_GESTAO = GESTAO.ID_MUNICIPIO, 
PA_MOTSAI, 
PA_OBITO, 
PA_ENCERR, 
PA_PERMAN, 
PA_ALTA, 
PA_TRANSF, 
ID_PA_MUNPCN = MUNPCN.ID_MUNICIPIO, 
ID_PA_MVM = MVM.ID_ANOMES, 
ID_PA_PROC_ID = TP_SIGTAP.ID_PA_PROC_ID, 
PA_CATEND, 
PA_IDADE, 
IDADEMIN, 
IDADEMAX, 
PA_FLIDADE, 
PA_SEXO, 
PA_RACACOR, 
ID_PA_UFMUN = UFMUN.ID_MUNICIPIO, 
PA_QTDPRO, 
PA_QTDAPR, 
PA_VALPRO, 
PA_VALAPR, 
PA_UFDIF, 
PA_MNDIF, 
PA_DIF_VAL, 
NU_VPA_TOT, 
NU_PA_TOT, 
PA_INDICA, 
PA_CODOCO, 
PA_FLQT, 
PA_FLER, 
PA_ETNIA
--COUNT(ID_SIA_PA_REPICA)
SELECT COUNT(*)
FROM 
	SIA_PA_REPLICA PA
	JOIN CBO ON ISNULL(PA.PA_CBOCOD, '      ') = CBO.CBO
	JOIN S_FORNEC ON ISNULL(PA.PA_CNPJ_CC, '              ') = S_FORNEC.FOR_CNPJ
	JOIN TP_SIGTAP ON PA.PA_PROC_ID = TP_SIGTAP.PA_PROC_ID

	JOIN CID AS [CIDCAS] ON PA_CIDCAS = CIDCAS.COD_CID
	JOIN CID AS [CIDPRI] ON PA_CIDPRI = CIDPRI.COD_CID
	JOIN CID AS [CIDSEC] ON PA_CIDSEC = CIDSEC.COD_CID

	JOIN ANOMES AS [CMP] ON PA_CMP = CMP.ANOMES
	JOIN ANOMES AS [MVM] ON PA_MVM = MVM.ANOMES

	JOIN CADGER AS [CNPJCPF] ON PA.PA_CNPJCPF = CNPJCPF.CPF_CNPJ 
	JOIN CADGER AS [CNPJMNT] ON PA.PA_CNPJMNT = CNPJMNT.CPF_CNPJ 
	JOIN CADGER AS [CODUNI] ON PA.PA_CODUNI = CODUNI.CNES 

	JOIN MUNICBR AS [GESTAO] ON ISNULL(PA.PA_GESTAO, '      ') = GESTAO.COD_MUNICIPIO
	JOIN MUNICBR AS [MUNPCN] ON ISNULL(PA.PA_MUNPCN, '      ') = MUNPCN.COD_MUNICIPIO
	JOIN MUNICBR AS [uFMUN] ON ISNULL(PA.PA_UFMUN, '      ') = UFMUN.COD_MUNICIPIO

--SELECT TOP 10000000 ID_SIA_PA_REPICA FROM SIA_PA_REPLICA PA

WHERE	

	PA.PA_DOCORIG in ( 'P', 'S') AND
	--CONVERT(DATETIME, SUBSTRING(PA_MVM,1,4) + '-' + SUBSTRING(PA_MVM,5,2) + '-01')  >= @DataMes_DE AND
	--CONVERT(DATETIME, SUBSTRING(PA_MVM,1,4) + '-' + SUBSTRING(PA_MVM,5,2) + '-01')  <= @DataMes_ATE AND
	PA.PA_MVM = '201001' AND
	--LEFT(PA.PA_UFMUN,2) = '11' AND
	NOT EXISTS (select 1
			from	SIA_PA_REPLICA_DUPLICADOS d2
			where	d2.ID_MAX = pa.ID_SIA_PA_REPICA )

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara tenta essa querie, deixei elac om top10

e me diz o q acontece

 

select [desc] = descricao from A

 

INSERT INTO SIA_PA_APAC (
ID_PA_CBOCOD,
ID_PA_CIDCAS,
PA_CONDIC,
ID_PA_CIDPRI,
PA_REGCT,
PA_INCOUT,
PA_INCURG,
PA_TPUPS,
PA_TIPPRE,
PA_MN_IND,
ID_PA_CIDSEC,
ID_PA_CMP,
ID_PA_CNPJ_CC,
ID_PA_CNPJCPF,
ID_PA_CNPJMNT,
ID_PA_CODUNI,
PA_TPFIN,
PA_SUBFIN,
PA_NIVCPL,
PA_DOCORIG,
PA_AUTORIZ,
ID_PA_GESTAO,
PA_MOTSAI,
PA_OBITO,
PA_ENCERR,
PA_PERMAN,
PA_ALTA,
PA_TRANSF,
ID_PA_MUNPCN,
ID_PA_MVM,
ID_PA_PROC_ID,
PA_CATEND,
PA_IDADE,
IDADEMIN,
IDADEMAX,
PA_FLIDADE,
PA_SEXO,
PA_RACACOR,
ID_PA_UFMUN,
PA_QTDPRO,
PA_QTDAPR,
PA_VALPRO,
PA_VALAPR,
PA_UFDIF,
PA_MNDIF,
PA_DIF_VAL,
NU_VPA_TOT,
NU_PA_TOT,
PA_INDICA,
PA_CODOCO,
PA_FLQT,
PA_FLER,
PA_ETNIA
)

SELECT top 10
ID_PA_CBOCOD = CBO.ID_CBO,
ID_PA_CIDCAS = CIDCAS.ID_CID,
PA_CONDIC,
ID_PA_CIDPRI = CIDPRI.ID_CID,
PA_REGCT,
PA_INCOUT,
PA_INCURG,
PA_TPUPS,
PA_TIPPRE,
PA_MN_IND,
ID_PA_CIDSEC = CIDSEC.ID_CID,
ID_PA_CMP = CMP.ID_ANOMES,
ID_PA_CNPJ_CC = S_FORNEC.ID_FORNEC,
ID_PA_CNPJCPF = CNPJCPF.ID_CNES,
ID_PA_CNPJMNT = CNPJMNT.ID_CNES,
ID_PA_CODUNI = CODUNI.ID_CNES,
PA_TPFIN,
PA_SUBFIN,
PA_NIVCPL,
PA_DOCORIG,
PA_AUTORIZ,
ID_PA_GESTAO = GESTAO.ID_MUNICIPIO,
PA_MOTSAI,
PA_OBITO,
PA_ENCERR,
PA_PERMAN,
PA_ALTA,
PA_TRANSF,
ID_PA_MUNPCN = MUNPCN.ID_MUNICIPIO,
ID_PA_MVM = MVM.ID_ANOMES,
ID_PA_PROC_ID = TP_SIGTAP.ID_PA_PROC_ID,
PA_CATEND,
PA_IDADE,
IDADEMIN,
IDADEMAX,
PA_FLIDADE,
PA_SEXO,
PA_RACACOR,
ID_PA_UFMUN = UFMUN.ID_MUNICIPIO,
PA_QTDPRO,
PA_QTDAPR,
PA_VALPRO,
PA_VALAPR,
PA_UFDIF,
PA_MNDIF,
PA_DIF_VAL,
NU_VPA_TOT,
NU_PA_TOT,
PA_INDICA,
PA_CODOCO,
PA_FLQT,
PA_FLER,
PA_ETNIA

FROM
SIA_PA_REPLICA PA
JOIN CBO ON ISNULL(PA.PA_CBOCOD, ' ') = CBO.CBO
JOIN S_FORNEC ON ISNULL(PA.PA_CNPJ_CC, ' ') = S_FORNEC.FOR_CNPJ
JOIN TP_SIGTAP ON PA.PA_PROC_ID = TP_SIGTAP.PA_PROC_ID

JOIN CID AS [CIDCAS] ON PA_CIDCAS = CIDCAS.COD_CID
JOIN CID AS [CIDPRI] ON PA_CIDPRI = CIDPRI.COD_CID
JOIN CID AS [CIDSEC] ON PA_CIDSEC = CIDSEC.COD_CID

JOIN ANOMES AS [CMP] ON PA_CMP = CMP.ANOMES
JOIN ANOMES AS [MVM] ON PA_MVM = MVM.ANOMES

JOIN CADGER AS [CNPJCPF] ON PA.PA_CNPJCPF = CNPJCPF.CPF_CNPJ
JOIN CADGER AS [CNPJMNT] ON PA.PA_CNPJMNT = CNPJMNT.CPF_CNPJ
JOIN CADGER AS [CODUNI] ON PA.PA_CODUNI = CODUNI.CNES

JOIN MUNICBR AS [GESTAO] ON ISNULL(PA.PA_GESTAO, ' ') = GESTAO.COD_MUNICIPIO
JOIN MUNICBR AS [MUNPCN] ON ISNULL(PA.PA_MUNPCN, ' ') = MUNPCN.COD_MUNICIPIO
JOIN MUNICBR AS [uFMUN] ON ISNULL(PA.PA_UFMUN, ' ') = UFMUN.COD_MUNICIPIO

WHERE

PA.PA_DOCORIG in ( 'P', 'S') AND
--CONVERT(DATETIME, SUBSTRING(PA_MVM,1,4) + '-' + SUBSTRING(PA_MVM,5,2) + '-01') >= @DataMes_DE AND
--CONVERT(DATETIME, SUBSTRING(PA_MVM,1,4) + '-' + SUBSTRING(PA_MVM,5,2) + '-01') <= @DataMes_ATE AND
PA.PA_MVM = '201001' AND
--LEFT(PA.PA_UFMUN,2) = '11' AND
NOT EXISTS (select 1
from SIA_PA_REPLICA_DUPLICADOS d2
where d2.ID_MAX = pa.ID_SIA_PA_REPICA )

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diegodcl

o fato do MMS nãoo estar lhe retornada nada não significa que não tenha dados na tabela nova. Pode ser que esteja sendo gravado no log primeiro.

Sugiro fazer por blocos, analisar como esta configurado o Shrink Database de sua base, bem como possiveis Locks e processamento do seu servidor.

 

O top 10 que o Caio Cardoso apontou nao surtiu efeito?

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nas situações em que tive que fazer transferências de grandes volumes de dados optei por fazer linha por linha.

 

Você pode criar uma tabela auxiliar só com um campo identificador, os campos de chave e um flag.

 

Utilize essa tabela como referência nas inserções, fazendo um update no flag assim que a linha for inserida, se der erro você pode recomeçar sempre a partir da linha que parou. Um while simples resolve o problema.

 

Caso não queira programar essa alternativa sugiro utilizar DTS.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.