I have a complex query which puts my server in recovery mode every time I run it. I don´t need to say that recovery mode is a situation you don´t want your server goes to.
If I´m using some subselects I´ll get that situation
with
StatusTrabalhando(Intkey) as (select Intkey from sys_Lookup where Grupo = $$StatusDigitacao$$ and
Intkey in (select unnest(string_to_array(substring(VarValue from 3),$$,$$)) from sys_Var where Name = $$/Company/StatusDigitacaoReceptivoTrabalhando$$)),
StatusAgendados(Intkey) as (select Intkey from sys_Lookup where Grupo = $$StatusVisita$$ and
Intkey in (select unnest(string_to_array(substring(VarValue from 3),$$,$$)) from sys_Var where Name = $$/Company/StatusDigitacaoReceptivoAgendados$$) and
Intkey not in (select unnest(string_to_array(substring(VarValue from 3),$$,$$)) from sys_Var where Name = $$/Company/StatusDigitacaoReceptivoDescartarAgendados$$)),
Todos(Digitacao_ID, Fonte_ID, Curso_ID, Digitador_ID, Pesquisador_ID, Telemarketing_ID, Nome, Curso, Telefone, Celular, Nascimento, Sexo, Escolaridade, Cadastro, Email, Idade, Obs,
Extra1, Extra2, Extra3, Extra4, Colegio, Serie, Turma, Turno, AnoLetivo, Pai, Mae, Sequencia, Status, lkStatus, lkFonte, lkDigitador, lkPesquisador,
lkTelemarketing, lkEscolaridade, Endereco, Bairro, Cidade, Estado, CEP, Repetido, Impresso, Etiqueta, WhatsApp, VisitaNome, VisitaStatus, Comercial, Midia, Prioridade, DataHoraAlteracao, Fluxo)
...
but if I run those subselects previously, get those values and put the results to my statement, then it works.
with
StatusDigitacaoReceptivoDescartarAgendados(Intkey) as (select unnest(string_to_array(substring(VarValue from 3),$$,$$)) from sys_Var where Name = $$/Company/StatusDigitacaoReceptivoDescartarAgendados$$),
StatusDigitacaoReceptivoAgendados(IntKey) as (select unnest(string_to_array(substring(VarValue from 3),$$,$$)) from sys_Var where Name = $$/Company/StatusDigitacaoReceptivoAgendados$$),
StatusDigitacaoReceptivoTrabalhando(IntKey) as (select unnest(string_to_array(substring(VarValue from 3),$$,$$)) from sys_Var where Name = $$/Company/StatusDigitacaoReceptivoTrabalhando$$)
select (select IntKey from StatusDigitacaoReceptivoDescartarAgendados), (select IntKey from StatusDigitacaoReceptivoAgendados), (select IntKey from StatusDigitacaoReceptivoTrabalhando);
Then i get these results (8, 14 and 17) and replace those subselects with these values and run, now it runs fine.
with
StatusTrabalhando(Intkey) as (select Intkey from sys_Lookup where Grupo = $$StatusDigitacao$$ and Intkey in (8)),
StatusAgendados(Intkey) as (select Intkey from sys_Lookup where Grupo = $$StatusVisita$$ and Intkey in (14) and Intkey not in (17)),
Todos(Digitacao_ID, Fonte_ID, Curso_ID, Digitador_ID, Pesquisador_ID, Telemarketing_ID, Nome, Curso, Telefone, Celular, Nascimento, Sexo, Escolaridade, Cadastro, Email, Idade, Obs,
Extra1, Extra2, Extra3, Extra4, Colegio, Serie, Turma, Turno, AnoLetivo, Pai, Mae, Sequencia, Status, lkStatus, lkFonte, lkDigitador, lkPesquisador,
lkTelemarketing, lkEscolaridade, Endereco, Bairro, Cidade, Estado, CEP, Repetido, Impresso, Etiqueta, WhatsApp, VisitaNome, VisitaStatus, Comercial, Midia, Prioridade, DataHoraAlteracao, Fluxo)
My original query, which worked for some days and then went to recovery mode was ...
with
StatusTrabalhando(Intkey) as (select Intkey from sys_Lookup where Grupo = $$StatusDigitacao$$ and
Intkey in (select unnest(string_to_array(substring(VarValue from 3),$$,$$)) from sys_Var where Name = $$/Company/StatusDigitacaoReceptivoTrabalhando$$)),
StatusAgendados(Intkey) as (select Intkey from sys_Lookup where Grupo = $$StatusVisita$$ and
Intkey in (select unnest(string_to_array(substring(VarValue from 3),$$,$$)) from sys_Var where Name = $$/Company/StatusDigitacaoReceptivoAgendados$$) and
Intkey not in (select unnest(string_to_array(substring(VarValue from 3),$$,$$)) from sys_Var where Name = $$/Company/StatusDigitacaoReceptivoDescartarAgendados$$)),
Todos(Digitacao_ID, Fonte_ID, Curso_ID, Digitador_ID, Pesquisador_ID, Telemarketing_ID, Nome, Curso, Telefone, Celular, Nascimento, Sexo, Escolaridade, Cadastro, Email, Idade, Obs,
Extra1, Extra2, Extra3, Extra4, Colegio, Serie, Turma, Turno, AnoLetivo, Pai, Mae, Sequencia, Status, lkStatus, lkFonte, lkDigitador, lkPesquisador,
lkTelemarketing, lkEscolaridade, Endereco, Bairro, Cidade, Estado, CEP, Repetido, Impresso, Etiqueta, WhatsApp, VisitaNome, VisitaStatus, Comercial, Midia, Prioridade, DataHoraAlteracao, Fluxo);
as (select D.Digitacao_ID, D.Fonte_ID, D.Curso_ID, Digitador_ID, D.Pesquisador_ID, D.Telemarketing_ID, D.Nome, Curso.Descricao Curso, D.Telefone, D.Celular, D.Nascimento, D.Sexo, D.Escolaridade, D.Cadastro, D.Email, D.Idade, D.Obs,
D.Extra1, D.Extra2, D.Extra3, D.Extra4, D.Colegio, D.Serie, D.Turma, D.Turno, D.AnoLetivo, D.Pai, D.Mae, D.Sequencia, D.Status, Status.Descricao lkStatus, Fonte.Fonte lkFonte, DigitadorPessoa.Apelido lkDigitador,
Pesquisador.Apelido lkPesquisador, Telemarketing.Login lkTelemarketing, Escolaridade.Descricao lkEscolaridade, D.Endereco, D.Bairro, D.Cidade, D.Estado, D.CEP, D.Repetido, D.Impresso, D.Etiqueta, D.WhatsApp,
PessoaNome.Nome VisitaNome, VisitaStatus.Descricao VisitaStatus, D.Comercial, Midia.Descricao, Midia.LetterKey, D.DataHoraAlteracao,
case when Telemarketing_ID is Null then $$Não Atribuido$$
when D.Status is null then $$Atribuido$$
when D.Status in (select IntKey from StatusTrabalhando) then $$Trabalhando$$
when VisitaNome.Status in (select IntKey from StatusAgendados) then $$Agendados$$ else $$Descartados$$ end Fluxo
from cad_Digitacao D
inner join cad_Fonte Fonte on Fonte.Fonte_ID = D.Fonte_ID
inner join sys_lookup TipoFonte on TipoFonte.intkey = Fonte.TipoFonte
left join sys_Account Telemarketing on Telemarketing.Pessoa_ID = D.Telemarketing_ID
left join sys_Account Digitador on Digitador.Account_ID = D.Digitador_ID
left join cad_Pessoa DigitadorPessoa on Digitador.Pessoa_ID = DigitadorPessoa.Pessoa_ID
left join cad_Pessoa Pesquisador on Pesquisador.Pessoa_ID = D.Pesquisador_ID
left join col_Curso Curso on Curso.Curso_ID = D.Curso_ID
left join sys_Lookup Midia on Midia.Grupo = $$Midia$$ and Midia.IntKey = Fonte.Midia
left join sys_Lookup Escolaridade on Escolaridade.Grupo = $$Escolaridade$$ and Escolaridade.IntKey = D.Escolaridade
left join sys_Lookup Status on Status.Grupo = $$StatusDigitacao$$ and Status.IntKey = D.Status
left join cad_visita VisitaNome on VisitaNome.Digitacao_ID = D.Digitacao_ID
left join sys_Lookup VisitaStatus on VisitaStatus.Grupo = $$StatusVisita$$ and VisitaStatus.IntKey = VisitaNome.Status
left join cad_Pessoa PessoaNome on PessoaNome.Pessoa_ID = VisitaNome.Pessoa_ID where TipoFonte.descricao = $$Campanhas$$ and Fonte.Ativo = 1 ),
NaoAtribuidos as (select * from Todos where Fluxo = $$Não Atribuido$$),
Atribuidos as (select * from Todos where Fluxo = $$Atribuido$$),
Trabalhando as (select * from todos where Fluxo = $$Trabalhando$$),
Agendados as (select * from todos where Fluxo = $$Agendados$$),
Descartados as (select * from todos where Fluxo = $$Descartados$$)
select * from (select 1 as Ordem, Digitacao_ID, cast(Null as I32) Fonte_ID, cast(Null as I32) Curso_ID, cast(Null as I32) Digitador_ID, cast(Null as I32) Pesquisador_ID, Telemarketing_ID, Nome, cast(Null as T100) Curso, Cast(Null as Telefone) Telefone,
Cast(Null as Telefone) Celular, Cast(Null as Data) Nascimento, cast(Null as Sexo) as Sexo, Cast(Null as I16) Escolaridade, Cadastro, Cast(Null as T50) Email, Cast(Null as I16) Idade, Cast(Null as Memo) Obs,
Cast(Null as T50) Extra1, Cast(Null as T50) Extra2, Cast(Null as T50) Extra3, Cast(Null as T50) Extra4, Cast(Null as T50) Colegio, Cast(Null as T50) Serie, Cast(Null as T50) Turma, Cast(Null as C1) Turno,
Cast(Null as I16) AnoLetivo, Cast(Null as T50) Pai, Cast(Null as T50) Mae, Sequencia, Cast(Null as I16) Status, lkStatus, lkFonte, Cast(Null as T50) lkDigitador, Cast(Null as T50) lkPesquisador,
lkTelemarketing, Cast(Null as T50) lkEscolaridade, Cast(Null as T50) Endereco, Cast(Null as T30) Bairro, Cast(Null as T30) Cidade, Cast(Null as Estado) Estado, Cast(Null as T10) CEP, Cast(Null as I16) Repetido,
Cast(Null as DataHora) Impresso, Cast(Null as DataHora) Etiqueta, Cast(Null as I16) WhatsApp, Cast(Null as T250) VisitaNome, Cast(Null as T50) VisitaStatus, Cast(Null as Telefone) Comercial, Midia, Fluxo
from NaoAtribuidos order by Ordem, Prioridade desc, Cadastro) NA
union all
select 2 as Ordem, Digitacao_ID, Fonte_ID, Curso_ID, Digitador_ID, Pesquisador_ID, Telemarketing_ID, Nome, Curso, Telefone, Celular, Nascimento, Sexo, Escolaridade, Cadastro, Email, Idade, Obs,
Extra1, Extra2, Extra3, Extra4, Colegio, Serie, Turma, Turno, AnoLetivo, Pai, Mae, Sequencia, Status, lkStatus, lkFonte, lkDigitador, lkPesquisador,
lkTelemarketing, lkEscolaridade, Endereco, Bairro, Cidade, Estado, CEP, Repetido, Impresso, Etiqueta, WhatsApp, VisitaNome, VisitaStatus, Comercial, Midia, Fluxo
from Atribuidos
union all
select 3 as Ordem, Digitacao_ID, Fonte_ID, Curso_ID, Digitador_ID, Pesquisador_ID, Telemarketing_ID, Nome, Curso, Telefone, Celular, Nascimento, Sexo, Escolaridade, Cadastro, Email, Idade, Obs,
Extra1, Extra2, Extra3, Extra4, Colegio, Serie, Turma, Turno, AnoLetivo, Pai, Mae, Sequencia, Status, lkStatus, lkFonte, lkDigitador, lkPesquisador,
lkTelemarketing, lkEscolaridade, Endereco, Bairro, Cidade, Estado, CEP, Repetido, Impresso, Etiqueta, WhatsApp, VisitaNome, VisitaStatus, Comercial, Midia, Fluxo
from Trabalhando
union all
select 4 as Ordem, Digitacao_ID, Fonte_ID, Curso_ID, Digitador_ID, Pesquisador_ID, Telemarketing_ID, Nome, Curso, Telefone, Celular, Nascimento, Sexo, Escolaridade, Cadastro, Email, Idade, Obs,
Extra1, Extra2, Extra3, Extra4, Colegio, Serie, Turma, Turno, AnoLetivo, Pai, Mae, Sequencia, Status, lkStatus, lkFonte, lkDigitador, lkPesquisador,
lkTelemarketing, lkEscolaridade, Endereco, Bairro, Cidade, Estado, CEP, Repetido, Impresso, Etiqueta, WhatsApp, VisitaNome, VisitaStatus, Comercial, Midia, Fluxo
from Agendados union all
select 5 as Ordem, Digitacao_ID, Fonte_ID, Curso_ID, Digitador_ID, Pesquisador_ID, Telemarketing_ID, Nome, Curso, Telefone, Celular, Nascimento, Sexo, Escolaridade, Cadastro, Email, Idade, Obs,
Extra1, Extra2, Extra3, Extra4, Colegio, Serie, Turma, Turno, AnoLetivo, Pai, Mae, Sequencia, Status, lkStatus, lkFonte, lkDigitador, lkPesquisador,
lkTelemarketing, lkEscolaridade, Endereco, Bairro, Cidade, Estado, CEP, Repetido, Impresso, Etiqueta, WhatsApp, VisitaNome, VisitaStatus, Comercial, Midia, Fluxo
from Descartados order by Ordem;
And the explain of that query was ...
QUERY PLAN
Sort (cost=2640.68..2640.84 rows=65 width=1128)
Sort Key: "*SELECT* 1".ordem
CTE statustrabalhando
-> Hash Semi Join (cost=15.44..30.40 rows=7 width=4)
Hash Cond: ((sys_lookup.intkey)::text = (unnest(string_to_array("substring"((sys_var.varvalue)::text, 3), ','::text))))
-> Bitmap Heap Scan on sys_lookup (cost=4.39..19.21 rows=14 width=4)
Recheck Cond: ((grupo)::text = 'StatusDigitacao'::text)
-> Bitmap Index Scan on idxsyslookupgrupointkey (cost=0.00..4.38 rows=14 width=0)
Index Cond: ((grupo)::text = 'StatusDigitacao'::text)
-> Hash (cost=9.81..9.81 rows=100 width=32)
-> ProjectSet (cost=0.28..8.81 rows=100 width=32)
-> Index Scan using idxsysvarname on sys_var (cost=0.28..8.29 rows=1 width=9)
Index Cond: ((name)::text = '/Company/StatusDigitacaoReceptivoTrabalhando'::text)
CTE statusagendados
-> Hash Semi Join (cost=24.51..39.66 rows=4 width=4)
Hash Cond: ((sys_lookup_1.intkey)::text = (unnest(string_to_array("substring"((sys_var_2.varvalue)::text, 3), ','::text))))
-> Bitmap Heap Scan on sys_lookup sys_lookup_1 (cost=13.46..28.53 rows=8 width=4)
Recheck Cond: ((grupo)::text = 'StatusVisita'::text)
Filter: (NOT (hashed SubPlan 2))
-> Bitmap Index Scan on idxsyslookupgrupointkey (cost=0.00..4.40 rows=16 width=0)
Index Cond: ((grupo)::text = 'StatusVisita'::text)
SubPlan 2
-> ProjectSet (cost=0.28..8.81 rows=100 width=32)
-> Index Scan using idxsysvarname on sys_var sys_var_1 (cost=0.28..8.29 rows=1 width=9)
Index Cond: ((name)::text = '/Company/StatusDigitacaoReceptivoDescartarAgendados'::text)
-> Hash (cost=9.81..9.81 rows=100 width=32)
-> ProjectSet (cost=0.28..8.81 rows=100 width=32)
-> Index Scan using idxsysvarname on sys_var sys_var_2 (cost=0.28..8.29 rows=1 width=9)
Index Cond: ((name)::text = '/Company/StatusDigitacaoReceptivoAgendados'::text)
CTE todos
-> Merge Right Join (cost=2152.17..2282.99 rows=2504 width=828)
Merge Cond: ((visitanome.digitacao_id)::integer = (d.digitacao_id)::integer)
-> Nested Loop Left Join (cost=4.99..56111.59 rows=77463 width=46)
-> Nested Loop Left Join (cost=4.69..22162.21 rows=77463 width=27)
Join Filter: ((visitastatus.intkey)::integer = (visitanome.status)::smallint)
-> Index Scan using idxvisitadigitacao on cad_visita visitanome (cost=0.29..3551.70 rows=77463 width=10)
-> Materialize (cost=4.40..19.43 rows=16 width=21)
-> Bitmap Heap Scan on sys_lookup visitastatus (cost=4.40..19.35 rows=16 width=21)
Recheck Cond: ((grupo)::text = 'StatusVisita'::text)
-> Bitmap Index Scan on idxsyslookupgrupointkey (cost=0.00..4.40 rows=16 width=0)
Index Cond: ((grupo)::text = 'StatusVisita'::text)
-> Index Scan using pkpessoa on cad_pessoa pessoanome (cost=0.29..0.44 rows=1 width=27)
Index Cond: ((pessoa_id)::integer = (visitanome.pessoa_id)::integer)
-> Sort (cost=2146.94..2148.64 rows=682 width=756)
Sort Key: d.digitacao_id
-> Hash Left Join (cost=1301.36..2114.84 rows=682 width=756)
Hash Cond: ((d.status)::smallint = (status.intkey)::integer)
-> Hash Left Join (cost=1281.98..2081.79 rows=682 width=739)
Hash Cond: ((d.escolaridade)::smallint = (escolaridade.intkey)::integer)
-> Hash Left Join (cost=1263.51..2053.08 rows=682 width=722)
Hash Cond: ((fonte.midia)::smallint = (midia.intkey)::integer)
-> Hash Left Join (cost=1233.51..1959.83 rows=682 width=705)
Hash Cond: ((d.curso_id)::integer = (curso.curso_id)::integer)
-> Nested Loop Left Join (cost=1219.91..1944.43 rows=682 width=673)
-> Hash Left Join (cost=1219.62..1411.81 rows=682 width=650)
Hash Cond: ((d.telemarketing_id)::integer = (telemarketing.pessoa_id)::integer)
-> Hash Left Join (cost=1213.06..1401.72 rows=682 width=639)
Hash Cond: ((d.digitador_id)::integer = (digitador.account_id)::integer)
-> Nested Loop (cost=29.52..215.51 rows=682 width=616)
-> Hash Join (cost=29.24..54.61 rows=7 width=17)
Hash Cond: ((fonte.tipofonte)::smallint = (tipofonte.intkey)::integer)
-> Seq Scan on cad_fonte fonte (cost=0.00..24.62 rows=136 width=19)
Filter: ((ativo)::smallint = 1)
-> Hash (cost=29.21..29.21 rows=2 width=4)
-> Seq Scan on sys_lookup tipofonte (cost=0.00..29.21 rows=2 width=4)
Filter: ((descricao)::text = 'Campanhas'::text)
-> Index Scan using idxdigitacaofonte on cad_digitacao d (cost=0.29..20.72 rows=227 width=603)
Index Cond: ((fonte_id)::integer = (fonte.fonte_id)::integer)
-> Hash (cost=1181.56..1181.56 rows=158 width=27)
-> Nested Loop Left Join (cost=0.29..1181.56 rows=158 width=27)
-> Seq Scan on sys_account digitador (cost=0.00..4.58 rows=158 width=8)
-> Index Scan using pkpessoa on cad_pessoa digitadorpessoa (cost=0.29..7.45 rows=1 width=27)
Index Cond: ((digitador.pessoa_id)::integer = (pessoa_id)::integer)
-> Hash (cost=4.58..4.58 rows=158 width=15)
-> Seq Scan on sys_account telemarketing (cost=0.00..4.58 rows=158 width=15)
-> Index Scan using pkpessoa on cad_pessoa pesquisador (cost=0.29..0.78 rows=1 width=27)
Index Cond: ((pessoa_id)::integer = (d.pesquisador_id)::integer)
-> Hash (cost=11.60..11.60 rows=160 width=36)
-> Seq Scan on col_curso curso (cost=0.00..11.60 rows=160 width=36)
-> Hash (cost=27.06..27.06 rows=236 width=23)
-> Bitmap Heap Scan on sys_lookup midia (cost=10.11..27.06 rows=236 width=23)
Recheck Cond: ((grupo)::text = 'Midia'::text)
-> Bitmap Index Scan on idxsyslookupgrupointkey (cost=0.00..10.05 rows=236 width=0)
Index Cond: ((grupo)::text = 'Midia'::text)
-> Hash (cost=18.34..18.34 rows=10 width=21)
-> Bitmap Heap Scan on sys_lookup escolaridade (cost=4.36..18.34 rows=10 width=21)
Recheck Cond: ((grupo)::text = 'Escolaridade'::text)
-> Bitmap Index Scan on idxsyslookupgrupointkey (cost=0.00..4.35 rows=10 width=0)
Index Cond: ((grupo)::text = 'Escolaridade'::text)
-> Hash (cost=19.21..19.21 rows=14 width=21)
-> Bitmap Heap Scan on sys_lookup status (cost=4.39..19.21 rows=14 width=21)
Recheck Cond: ((grupo)::text = 'StatusDigitacao'::text)
-> Bitmap Index Scan on idxsyslookupgrupointkey (cost=0.00..4.38 rows=14 width=0)
Index Cond: ((grupo)::text = 'StatusDigitacao'::text)
SubPlan 4
-> CTE Scan on statustrabalhando (cost=0.00..0.14 rows=7 width=4)
SubPlan 5
-> CTE Scan on statusagendados (cost=0.00..0.08 rows=4 width=4)
CTE naoatribuidos
-> CTE Scan on todos (cost=0.00..56.34 rows=13 width=1164)
Filter: (fluxo = 'Não Atribuido'::text)
CTE atribuidos
-> CTE Scan on todos todos_1 (cost=0.00..56.34 rows=13 width=1164)
Filter: (fluxo = 'Atribuido'::text)
CTE trabalhando
-> CTE Scan on todos todos_2 (cost=0.00..56.34 rows=13 width=1164)
Filter: (fluxo = 'Trabalhando'::text)
CTE agendados
-> CTE Scan on todos todos_3 (cost=0.00..56.34 rows=13 width=1164)
Filter: (fluxo = 'Agendados'::text)
CTE descartados
-> CTE Scan on todos todos_4 (cost=0.00..56.34 rows=13 width=1164)
Filter: (fluxo = 'Descartados'::text)
-> Append (cost=1.80..3.98 rows=65 width=1128)
-> Subquery Scan on "*SELECT* 1" (cost=1.80..2.09 rows=13 width=1128)
-> Subquery Scan on na (cost=1.80..1.96 rows=13 width=1128)
-> Sort (cost=1.80..1.83 rows=13 width=1160)
Sort Key: naoatribuidos.prioridade DESC, naoatribuidos.cadastro
-> CTE Scan on naoatribuidos (cost=0.00..1.56 rows=13 width=1160)
-> Subquery Scan on "*SELECT* 2" (cost=0.00..0.39 rows=13 width=1128)
-> CTE Scan on atribuidos (cost=0.00..0.26 rows=13 width=1128)
-> Subquery Scan on "*SELECT* 3" (cost=0.00..0.39 rows=13 width=1128)
-> CTE Scan on trabalhando (cost=0.00..0.26 rows=13 width=1128)
-> Subquery Scan on "*SELECT* 4" (cost=0.00..0.39 rows=13 width=1128)
-> CTE Scan on agendados (cost=0.00..0.26 rows=13 width=1128)
-> Subquery Scan on "*SELECT* 5" (cost=0.00..0.39 rows=13 width=1128)
-> CTE Scan on descartados (cost=0.00..0.26 rows=13 width=1128)
So, how to solve that and mainly how to don´t get this recovery mode just running a query ?
Sent from the PostgreSQL - general mailing list archive at Nabble.com.