BookmarkSubscribeRSS Feed
Holmes
Obsidian | Level 7

Olá pessoal, tudo bem?

Queria saber se alguém tem alguma ideia de como posso fazer uma query criar várias tabelas determinando o número máximo de linhas.

Situação: Eu tenho um query que demora muito e acaba que o servidor me derruba por esse motivo, esta query é enviada pelo SAS ao netezza. Consigo fazer algo para retornar partes da query por vez?

Faço a query e retorno as primeiras 1 milhão de linhas, depois pego as próximas 1 milhão de linhas até o fim das linhas dessa query.

Alguém consegue me ajudar?

8 REPLIES 8
wilkoba
SAS Employee

Ola boa tarde, 

Você está usando PROC SQL ou PROC FEDSQL?

 

Caso seja PROC SQL verifique os parametros:

NOBS= restricts the number of rows that PROC SQL retrieves from any single data source.

OUTOBS= restricts the number of rows that PROC SQL includes in the output.

 

Encontrei nesta outra comunidade: Solved: Is there a LIMIT function in PROC SQL - SAS Support Communities

Holmes
Obsidian | Level 7

@wilkobaTudo bem?

Obrigado pelo retorno! Eu estou usando PROC SQL mesmo, conheço essas opções e li o link que enviou mas como eu faria para no dataset want1 ter das linhas 1 a 1 milhão, no dataset want2 ter as linhas de 1.000.001 até 2.000.000 e assim por diante?

wilkoba
SAS Employee

@Holmes 

 

Desculpe a demora para responder. Pergunta: Você esta utilizando SAS9 (E.Guide) ou esá com SAS Viya ?

 

Caso seja o SAS Viya, de uma olhada no PROC FEDSQL que pode executar esta query usando paralelismo.

https://communities.sas.com/kntur85557/attachments/kntur85557/askexpert/191/1/26Aug.BestPracticesMig...

 

SAS Help Center: FedSQL Distributed Processing in CAS

 

Caso seja SAS9 e estiver usando o PROC SQL com pass-through, existe um parametro no SELECT do Netezza , LIMIT ou função ROW_NUMBER() 

Netezza ROWNUM Pseudo Column Alternative - DWgeek.com

SELECT (to retrieve rows) - IBM Documentation

 

Espero ter ajudado

 

 

RxJunior
Fluorite | Level 6

Olá! Bom dia!

 

Pelo que entendi, você está em busca de segmentar a extração, correto? Não existe nenhum atributo no Dataset que você possa utilizar como filtro, a exemplo de datas? Dessa forma você poderá executar cada "pedaço" utilizando Macros ou método em Loop.

Holmes
Obsidian | Level 7

@RxJuniortudo bem?

 

Obrigado por responder!

Pensei nessa resolução e uso ela para pegar a data em loop pois também sobre pelo menos problema. Procurei outros campos mas não achei algo que agregue bem as consultas. Está ficando muito demorado.

Tem outra ideia?

Robson_Andrade
Calcite | Level 5
DATA table1 table2;
  set table;
  if _N_<=80 then output table1;
  else if _N_<=160 then output table2;
run;

Em vez de vc fazer por proc sql pq vc não faz por dataset assim:

 

DATA table1 table2;
  set table;
  if _N_<=80 then output table1;
  else if _N_<=160 then output table2;
run;
wilkoba
SAS Employee

@Holmes 

Veja a função monotonic() para o PROC SQL.

 

MONOTONIC function in PROC SQL - SAS Support Communities

 

Assim você poderá criar duas queries...uma com o WHERE monotonic() < 1000000 e outra com o WHERE monotonic() >=1000000

 

OliveiraMiguelZ
Obsidian | Level 7

Um step back me parece necessário aqui.

 

  1. Será que você precisa mesmo de todas as informações da query?
  2. Será que a query não pode ser otimizada no server side?
  3. Será que você não consegue exportar os dados da consulta para uma tabela temporária e então os ler via libname?

Talvez redesenhar seu problema possa revelar uma solução mais simples do que contornar a limitação do servidor.