2013-10-25 2 views
0

DATABASE

에서 나는 정규화 된 포스트 그레스 9.1 데이터베이스를 가지고 있고 그것에서 나는 일부 기능을 작성했습니다. 특히 "fn_SuperQuery"(param,param, ...)" 함수 중 하나는 SET OF RECORD을 반환하며 뷰 (매개 변수를 허용)로 생각해야합니다. 이 함수는 큰 데이터 세트로 성능을 얻기 위해 자체 결과를 계산하는 동안 실제로 여러 임시 테이블을 작성하기 때문에 많은 오버 헤드가 있습니다.액세스 PostgreSQL의 9.1 임시 테이블 PHP/AJAX

참고로이 쿼리에는 WITH (cte 's)만을 사용했지만 더 효율적인 조인을 위해 일부 열에 인덱스를 추가 할 수있는 기능이 필요했습니다.

PHP

나는 데이터베이스에 연결하는 쿼리를 실행하고, JSON으로 결과를 반환 엄격하게 PHP를 사용합니다. 각 쿼리는 연결 문자열로 시작한 다음 pg_close을 호출하여 끝납니다. 나는 결과를 PHP 파일을 호출하고 받아들이는 jQuery의 .ajax 기능을 사용하고

FRONTEND.

"fn_SuperQuery"(param,param, ...)" 실제로 여러 다른 쿼리에 대한 기초입니다 :


내 문제는 이것이다. 이 응용 프로그램에는 최종 사용자에게 필요한 모든 정보를 생성하기 위해 여러 쿼리를 한 번에 실행해야하는 부분이 있습니다. 이러한 쿼리 중 많은 부분이 "fn_SuperQuery"(param,param, ...)"의 출력에 의존합니다.이 쿼리를 실행하는 오버 헤드가 매우 가파르고 동일한 매개 변수가 주어지면 동일한 데이터를 반환한다는 사실 때문에 사용자가 실행을 기다리게하는 것이 바보 같다고 생각합니다 두번.

내가하고 싶은 일은 "fn_SuperQuery"(param,param, ...)"의 결과를 임시 테이블에 반환 한 다음 데이터가 필요한 다른 쿼리를 실행 한 다음 임시 테이블을 삭제하는 것입니다.

그 점을 이해하십시오. PostgreSQL ... requires each session to issue its own CREATE TEMPORARY TABLE command for each temporary table to be used. 두 개의 PHP 파일을 동일한 데이터베이스 세션에 연결할 수 있다면 둘 다 임시 테이블을 볼 수 있어야합니다.

어떻게해야합니까? ... 아니면 아직 고려해야 할 다른 접근 방법일까요?

답변

1

일반 테이블을 사용하면 더 좋을 수 있습니까? 별 차이가 없을 것입니다. unlogged 테이블을 사용하여 속도를 높일 수 있습니다.

9.3에서보다 나은 선택은 구체화 된보기를 사용하는 것입니다.

+0

"정상적인"테이블에 넣는 것은 옵션이 아닌 비정규 화일 수 있습니다. 구체화 된보기를 살펴볼 것입니다. 그러나 당분간 9.1로 제한됩니다. – losthorse

+0

나는 새로운 테이블을 만들고, 그것을 사용하고, 버리는 것을 의미했다. 임시 테이블처럼. – alexius

0

임시 테이블은 세션 전용입니다. 서로 다른 세션에서 공유하려면 일반 테이블을 사용하십시오 (아마도 로그인되지 않은 것 같습니다).

비정규 화에 대해 걱정이된다면 먼저 살펴보아야 할 것은 이러한 임시 테이블을 별도의 스키마에 저장하는 것입니다. 이렇게하면 분석을 위해 비정규 화 된 데이터 (및 작업 집합 데이터)를 분리하여 보관할 수 있으며 비정규 화 된 테이블을 사용하여 나머지 데이터 집합을 오염시키지 않아도됩니다.

다른 방법으로는 비정규 화가 부족하다는 것을 알 수 있습니다. 예를 들어 잠시 후에 데이터가 변경되지 않으면 변경 불가능한 데이터에 대해 요약 항목을 주기적으로 넣을 수 있습니다.이는 특정 형식의보고를 계속 열어 줄 필요가있을 때 오래된 세부 레코드를 제거 할 수 있기 때문에 비정규 화가 아닙니다.