Ir para conteúdo

POWERED BY:

Arquivado

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

silviap

select incremental

Recommended Posts

Pessoal bom dia.

 

Eu tenho um select que atualmente demora 2h para executar.

Esse select varre uma tabela de aproximadamente 6684251 registros, e aumentando rs.. E popula um nova tabela, de onde crio alguns gráficos e etc...

Eu gostaria de criar um select que retornasse apenas os registros novos dessa tabela gigante.

Pensei em fazer isso colocando um filtro de data, mas teria que ser algo do tipo, retornar os dados da última data e hora de execução.
O problema, é que se uma nota for cancelada, corro o risco de não saber disso, pois já teria buscado esse registro em outra data, e não seria retornada novamente. Alguém tem uma ideia de como posso fazer isso?

 

Abaixo o select que faço.

 

------------Insert da tabela com todas as notas faturadas de saida-------------------------------------------------
DELETE [Repositorio_Padtec].[dbo].Tabela_NF_Faturada;
--INSERT INTO [Repositorio_Padtec].[dbo].Tabela_NF_Faturada
-- busca as informações de notas de faturamnto
with Faturamento as(
--busca informações de faturamento quando o tipo de item é sistema ou seja 1.000.000
select
cfop.[especie-doc],
cfop.[emite-duplic],
itnf.[cod-estabel],
itnf.[it-codigo],
descped.descricao as Descricao_Pai,
movto.[it-codigo] as Ean,
item.[desc-item]as Descricao_Filho,
itnf.[nr-pedcli],
itnf.[nome-ab-cli] as Emitente,
itnf.[dt-emis-nota],
movto.[nro-docto] as [nr-nota-fis],
cast (movto.[valor-nota]as float(2)) as valor_nota,
cast (itnf.[cod-unid-negoc] as varchar(300)) as PP,
cast(round(movto.quantidade,2)as float(2)) as Quantidade,
cast(itnf.[vl-tot-item] /
(SUM((CASE WHEN movto.[valor-mat-m] IS NULL
THEN '1'
WHEN movto.[valor-mat-m] = '0' THEN '1'
ELSE movto.[valor-mat-m] END))
OVER (PARTITION BY movto.[nro-docto],itnf.[dt-emis-nota], movto.[sequen-nf])
+ SUM(ISNULL(movto.[valor-ggf-m], '0'))
OVER (PARTITION BY movto.[nro-docto],itnf.[dt-emis-nota], movto.[sequen-nf]))
* CASE WHEN movto.[valor-mat-m] IS NULL
THEN '1'
WHEN movto.[valor-mat-m] = '0'
THEN '1'
ELSE (movto.[valor-mat-m] + ISNULL(movto.[valor-ggf-m], '0'))
END
as float(2)) AS TOTAL,
'' as [ggf],
'' as [sOMA_CUSTO_GGF],
'' as [CUSTO],
'' as [FAMILIA],
'' as [NF_Devolvida],
movto.[nat-operacao]
from
Repositorio_Padtec.dbo.item item
left join
Repositorio_Padtec.dbo.[movto-estoq] movto on item.[it-codigo] = movto.[it-codigo]
inner join
Repositorio_Padtec.dbo.[it-nota-fisc] itnf on itnf.[cod-estabel] = movto.[cod-estabel]
and itnf.[cd-emitente] = movto.[cod-emitente]
and itnf.[nat-operacao] = movto.[nat-operacao]
and itnf.[nr-seq-fat] = movto.[sequen-nf] --??
and (itnf.serie = movto.[serie-docto]
or ISNULL(movto.[serie-docto], '') = ISNULL(itnf.serie, ''))
and itnf.[nr-nota-fis] = movto.[nro-docto]
and itnf.[it-codigo] like '1.%'
and movto.[it-codigo] not like '1.%'
left join
Repositorio_Padtec.dbo.[natur-oper]cfop on itnf.[nat-operacao] = cfop.[nat-operacao]
left join
[Repositorio_Padtec].[dbo].[ext_ped_item]descped on descped.it_codigo = itnf.[it-codigo]
and descped.nr_pedcli = itnf.[nr-pedcli]
and descped.sequencia = itnf.[nr-seq-ped]
and descped.nome_abrev = itnf.[nome-ab-cli]
and itnf.[dt-cancela] is null
where
itnf.[nr-nota-fis] = movto.[nro-docto]
and itnf.[cod-estabel] = 1
and ((itnf.[it-codigo] like '1.000.%')
or (movto.[it-codigo] = itnf.[it-codigo]))
and cfop.[emite-duplic] = 1
and cfop.[especie-doc] = 'NFS'
and itnf.[dt-cancela] is null
--
union all
--busca informações de sistema para itens diferentes de sistema.
select
cfop.[especie-doc],
cfop.[emite-duplic],
itnf.[cod-estabel],
itnf.[it-codigo],
descped.descricao as Descricao_Pai,
itnf.[it-codigo] as Ean,
item.[desc-item]as Descricao_Filho,
itnf.[nr-pedcli],
itnf.[nome-ab-cli] as Emitente,
itnf.[dt-emis-nota],
itnf.[nr-nota-fis],
cast(itnf.[vl-tot-item] as float(2)) as valor_nota,
itnf.[cod-unid-negoc] as PP,
cast(round(peditem.[qt-atendida],2)as float(2)) as Quantidade,
cast(itnf.[vl-tot-item] as float(2)) as TOTAL,
'' as [ggf],
'' as [sOMA_CUSTO_GGF],
'' as [CUSTO],
'' as [FAMILIA],
'' as [NF_Devolvida],
itnf.[nat-operacao]
from
Repositorio_Padtec.dbo.item item
right join
Repositorio_Padtec.dbo.[it-nota-fisc] itnf on itnf.[it-codigo] = item.[it-codigo]
left join
Repositorio_Padtec.dbo.[natur-oper]cfop on itnf.[nat-operacao] = cfop.[nat-operacao]
left join
[Repositorio_Padtec].[dbo].[ext_ped_item]descped on descped.it_codigo = itnf.[it-codigo]
and descped.nr_pedcli = itnf.[nr-pedcli]
and descped.sequencia = itnf.[nr-seq-ped]
and descped.nome_abrev = itnf.[nome-ab-cli]
left join Repositorio_Padtec.dbo.[ped-item] peditem on peditem.[it-codigo] = itnf.[it-codigo]
and peditem.[nr-pedcli] = itnf.[nr-pedcli]
and peditem.[nr-sequencia] = itnf.[nr-seq-ped]
and peditem.[nome-abrev] = itnf.[nome-ab-cli]
WHERE
itnf.[dt-cancela] is null
and itnf.[it-codigo] not LIKE '1.0%'
and itnf.[cod-estabel] = 1 and
cfop.[emite-duplic] = 1 and
cfop.[especie-doc] = 'NFS'
),
-- busca as informações de notas de devolução
Devolução as
(
SELECT
dev.[cod-estabel],
dev.[it-codigo] as Ean,
dev.[nome-ab-emi],
dev.[dt-devol] as Data_Emissão,
dev.[nr-nota-fis],
(-[qt-devolvida]) AS QTD ,
(CAST(-dev.[vl-devol]as float(2))) as Total,
dev.[nro-docto] as [NF_Devolvida],
dev.[nat-operacao],
dev.[nro-docto],
dev.[vl-devol]
FROM
[Repositorio_Padtec].[dbo].[devol-cli] dev
where
dev.[nr-nota-fis] is not null and
dev.[cod-estabel] = 1
)
-- busca as informações de notas faturadas juntamente com as notas de devolução
INSERT INTO [Repositorio_Padtec].[dbo].Tabela_NF_Faturada
select
fatur.[especie-doc],
fatur.[emite-duplic],
fatur.[cod-estabel],
fatur.[it-codigo],
fatur.Descricao_Pai,
fatur.Ean,
fatur.Descricao_Filho,
fatur.[nr-pedcli],
fatur.Emitente,
fatur.[dt-emis-nota],
fatur.[nr-nota-fis],
fatur.valor_nota,
fatur.PP,
fatur.Quantidade,
fatur.TOTAL,
fatur.[ggf],
fatur.[sOMA_CUSTO_GGF],
fatur.[CUSTO],
fatur.[FAMILIA],
dev.[nro-docto] as [NF_Devolvida],
fatur.[nat-operacao],
dev.[vl-devol]
from
Faturamento fatur left join
Devolução dev
on
fatur.Ean = dev.Ean and
fatur.[nr-nota-fis] = dev.[nr-nota-fis] and
fatur.Emitente = dev.[nome-ab-emi]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu tenho um select que atualmente demora 2h para executar.
Esse select varre uma tabela de aproximadamente 6684251 registros, e aumentando rs.. E popula um nova tabela, de onde crio alguns gráficos e etc...
Eu gostaria de criar um select que retornasse apenas os registros novos dessa tabela gigante.
Pensei em fazer isso colocando um filtro de data, mas teria que ser algo do tipo, retornar os dados da última data e hora de execução.
O problema, é que se uma nota for cancelada, corro o risco de não saber disso, pois já teria buscado esse registro em outra data, e não seria retornada novamente. Alguém tem uma ideia de como posso fazer isso?
O fato de demorar duas horas para executar um select já pode demonstrar algum tipo de problema em seu ambiente.
Seja fisico ou lógico.
Mas vamos lá.
Se precisa consultar em tempo real as notas, o filtro de data será útil, mas nao entendi o problema da nota cancelada. Se a nota for cancelada vc nao altera o status dela? Ou vc cria o registro em outra tabela?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Li meio por alto mas algumas observações :

 

Foi feito o Plano de Execução das sqls ?

 

Existem índices nas tabelas ?

 

Pelo que vi existe um UNION no select mas os valores não são agregados não seria mais eficiente executar n inserts separados ?

 

Não é normal mas dependendo do volume , concorrência etc queries podem demorar , tenho onde trabalho algumas agregadas que carrego no horário em que o Sistema está ocioso

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu fiz uma alteração no select que reduziu muito o tempo de execução, caiu para 9min :innocent:

 

Foi feito o Plano de Execução das sqls ?

 

Existem índices nas tabelas ?

 

Não sei como fazer um plano de execução das sqls. : -(
Existem índices sim,

O fato de demorar duas horas para executar um select já pode demonstrar algum tipo de problema em seu ambiente.

Seja fisico ou lógico.
Mas vamos lá.
Se precisa consultar em tempo real as notas, o filtro de data será útil, mas nao entendi o problema da nota cancelada. Se a nota for cancelada você nao altera o status dela? Ou você cria o registro em outra tabela?

 

A.Jr, Eu o status não é alterado. Existe um campo chamado dt_cancela, esse campo é preenchido quando uma nota é cancelada. Mas eu consegui pensar em algo para trazer as notas alteradas.

Como faço para guardar a data e hora da ultima execução da query, e passar isso como parâmetro de filtro para a próxima execução?

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.