2014-10-21 2 views
1

Netezza에는 몇 개의 큰 테이블이 있습니다 (수십 메가 바이트의 데이터).Netezza는 메타/시스템 테이블을 사용하여 큰 테이블의 행 수를 얻습니다.

시스템/메타 테이블을 사용하여이 테이블의 행을 계산하는 방법을 찾으려고합니다.

은 내가 사용할 수 있습니다 알고

SELECT COUNT(*) FROM tablename; 

하지만 그 느리고 Netezza의 어플라이언스에 부하를 많이 넣습니다. 정기적으로 이러한 큰 테이블의 행을 계산해야하므로 실행중인 다른 중요한 쿼리의 성능에 영향을 미치고 싶지 않습니다. 거의 작동

SELECT RELNAME TABLE_NAME, 
CASE 
WHEN RELTUPLES < 0 
THEN ((2^32) * RELREFS) + ((2^32) + RELTUPLES) 
ELSE ((2^32) * RELREFS) + (RELTUPLES) 
END NUM_ROWS 
FROM 
_T_CLASS, 
_T_OBJECT 
WHERE 
_T_OBJECT.OBJID=_T_CLASS.OID AND 
_T_OBJECT.OBJCLASS=4905 — DISPLAY ONLY TABLES 
AND RELNAME = UPPER('<TABLE NAME>'); 

:

나는이 쿼리를 발견했다. 이 쿼리의 문제점은 업데이트/삭제 된 행이있을 수 있다는 사실을 다루지 않는다는 것입니다.

Netezza는 정리가 발생할 때까지 데이터베이스에서 삭제 된 행을 유지하므로 행 수가 잘못 표시됩니다.

삭제 된 행을 고려하여 정확한 행 수를 제공하는 쿼리가 있습니까?

답변

1

삭제 된 행을 차지하는 테이블의 정확한 행 수가 항상 보장된다는 것을 알고있는 시스템 테이블이나 뷰는 없습니다.

하나의 절충 솔루션은 기본 테이블에서 매우 얇은 구체화 된보기 (즉, 단일 열)를 작성하는 것입니다. 그런 다음 정확한 행 수를 얻기 위해 mview를 계산할 수 있으며 이는 기본 테이블을 세는 것보다 훨씬 빠릅니다. 실제로 기본 테이블에 대해 1을 셀 수 있으며 옵티마이 저가 자동으로 mview로 리디렉션합니다.

단점은 구체화 된보기에 대한 일반적인 현상이므로 업데이트를 유지하려면 IO 비용을 지불해야합니다. 테이블이 충분히 넓고 기능이 유용하다면 쉽게 가치가있을 수 있습니다.

0

아래에서는 시스템 테이블을 사용하지 않지만 어플라이언스의 성능 영향을 줄일 수 있습니다. 잠재적으로 큰 결과 집합을 응용 프로그램에 반환하는 대신 오랜 시간이 걸릴 수 있으므로 SQL에서 반환 된 행 수를 반환하면됩니다.

는 아래의 시도 보내기

SELECT 
COUNT(*) AS "# Of Rows Your Query Returned" 
FROM 
(
SELECT * from TABLE_NAME; 
) AS "Wrapper";  
0

쿼리의 _T_OBJECT.OBJCLASS = 4905 부분에주의를, 또 다른 객체 클래스와 테이블이있을 수 있습니다. , 대신를 사용

SELECT RELNAME TABLE_NAME, 
CASE 
WHEN RELTUPLES < 0 
THEN ((2^32) * RELREFS) + ((2^32) + RELTUPLES) 
ELSE ((2^32) * RELREFS) + (RELTUPLES) 
END NUM_ROWS 
FROM 
_T_CLASS, 
_T_OBJECT, 
_t_object_classes 
WHERE 
_T_OBJECT.OBJID=_T_CLASS.OID AND _T_OBJECT.OBJCLASS=_t_object_classes.OBJCLASS AND 
_t_object_classes.OBJREFCLASS=4905 -- DISPLAY ONLY TABLES 
AND RELNAME= UPPER('<TABLE NAME>');