Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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?
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.
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 )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 )
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
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.
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.