database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 9626 게시물 읽기
No. 9626
distributed table.
작성자
초로기
작성일
2016-01-19 18:40
조회수
8,861

안녕하세요

postgresql (8.2.15) 관련하여 머리 아픈일이 있어 글 씁니다.

 

아래와 같이 함수를 사용하면 다음과 같은 에러가 발생합니다.

select zqm_class_nm(matnr,desc1) from zqmt0170;

ERROR: function cannot execute on segment because it accesses relation "zqmv0001" (functions.c:155)

 

함수는 matnr,desc1 인자값을 통해 테이블 조건조회입니다.

 

찾아보니까 distributed table 사용으로 지원이 안된다고 하는데

정확히 distributed table이 무엇이고, 어떻게 튜닝해야할지 감이 안잡힙니다.

 

혹시 이 문제에 대해 아시는 분 있으시면 답변부탁드립니다.

이 글에 대한 댓글이 총 3건 있습니다.

zqm_class_nm 함수가 어떻게 생겼는지를 몰라서 문제 원인에 대해서 전혀 감을 잡질 못하겠네요.

김상기(ioseph)님이 2016-01-25 12:48에 작성한 댓글입니다.

안녕하세요.

 

저도 Greenplum DB (PostgreSQL)에서 해당 문제를 겪고 있습니다.

Workaround로 서브쿼리로 사용할수 있지만

Function을 꼭 사용해야하는 경우로 대안이 없을까요?

 

 

* Oracle test

 

1. Function 생성

 

 

CREATE OR REPLACE FUNCTION get_dep_name ( dep_id NUMBER )

RETURN VARCHAR2 IS

 

sDepName VARCHAR2(30);

BEGIN

SELECT department_name

INTO sDepName

FROM departments

WHERE department_id = dep_id;

 

RETURN sDepName;

END;

 

 

 

2. Function 실행

 

SQL> SELECT a.employee_id, a.first_name || ' ' || a.last_name names,

2 get_dep_name(a.department_id) dep_names

3 FROM employees a

4 WHERE a.department_id = 100;

 

EMPLOYEE_ID NAMES DEP_NAMES

----------- ---------- ----------

108 Nancy Gree Finance

nberg

 

109 Daniel Fav Finance

iet

 

110 John Chen Finance

111 Ismael Sci Finance

arra

 

112 Jose Manue Finance

 

EMPLOYEE_ID NAMES DEP_NAMES

----------- ---------- ----------

l Urman

 

113 Luis Popp Finance

 

6 rows selected.

 

SQL>

 

 

3. Function 미생성시 대안 쿼리

 

SQL> SELECT a.employee_id, a.first_name || ' ' || a.last_name names,

2 ( SELECT b.department_name

3 FROM departments b

4 WHERE a.department_id = b.department_id ) dep_names

5 FROM employees a

6 WHERE a.department_id = 100;

 

EMPLOYEE_ID NAMES DEP_NAMES

----------- ---------- ----------

108 Nancy Gree Finance

nberg

 

109 Daniel Fav Finance

iet

 

110 John Chen Finance

111 Ismael Sci Finance

arra

 

112 Jose Manue Finance

 

EMPLOYEE_ID NAMES DEP_NAMES

----------- ---------- ----------

l Urman

 

113 Luis Popp Finance

 

6 rows selected.

 

SQL>

 

 

 

 

 

* GPDB

 

1. Function 생성

 

CREATE OR REPLACE FUNCTION get_dep_name ( dep_id numeric )

RETURNs VARCHAR as

$BODY$

DECLARE

sDepName VARCHAR(30);

BEGIN

SELECT department_name

INTO sDepName

FROM departments

WHERE department_id = dep_id;

 

RETURN sDepName;

END;

$BODY$

LANGUAGE plpgsql VOLATILE;

 

 

 

 

2. Function 실행

 

chsdb=# SELECT a.employee_id, a.first_name || ' ' || a.last_name names,

chsdb-# get_dep_name(a.department_id) dep_names

chsdb-# FROM employees a

chsdb-# WHERE a.department_id = 100;

ERROR: function cannot execute on segment because it accesses relation "public.departments" (functions.c:155) (seg10 slice1 sdw2:40004 pid=31390) (cdbdisp.c:1326)

DETAIL:

SQL statement "SELECT department_name FROM departments WHERE department_id = $1 "

PL/pgSQL function "get_dep_name" line 4 at SQL statement

chsdb=#

 

 

3. Function 미생성시 대안 쿼리

 

chsdb=# SELECT a.employee_id, a.first_name || ' ' || a.last_name names,

chsdb-# ( SELECT b.department_name

chsdb(# FROM departments b

chsdb(# WHERE a.department_id = b.department_id ) dep_names

chsdb-# FROM employees a

chsdb-# WHERE a.department_id = 100;

employee_id | names | dep_names

-------------+-------------------+-----------

113 | Luis Popp | Finance

108 | Nancy Greenberg | Finance

109 | Daniel Faviet | Finance

111 | Ismael Sciarra | Finance

112 | Jose Manuel Urman | Finance

110 | John Chen | Finance

(6 rows)

 

chsdb=#

 

김민석(minsuc)님이 2016-02-08 02:04에 작성한 댓글입니다.

Greenplum 데이터베이스 기능 한계인가 보네요.

PostgreSQL에서는 해당 함수와 그 함수 사용에는 전혀 문제가 없습니다.

해당 문제는 Greenplum 벤더사에 문의를 해보셔야 할 것 같습니다.

8.2 버전에서도 잘 되었던것 같은데 ....

 

혹 이 기능 미흡에 대한 부분이 아니라,

칼럼의 별칭 사용에 문제가 있는 것이 위와 같은 오류 메시지로 표시되는 것일 수도 있지 않을까 하는 생각을 합니다.

 

전통적으로 PostgreSQL에서 칼럼 별칭은 as 예약어와 함께 썼거든요.

SELECT a.employee_id, a.first_name || ' ' || a.last_name as names,
get_dep_name(a.department_id) as dep_names
FROM employees a
WHERE a.department_id = 100;
 

이렇게 해서 오류가 생기지 않으면, as 문제 일 수 도 있겠죠.

김상기(ioseph)님이 2016-02-11 00:53에 작성한 댓글입니다.
이 댓글은 2016-02-11 01:06에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
9629질문 다시 드립니다. [1]
황일기
2016-01-25
8003
9628질문드립니다. [1]
황일기
2016-01-25
8233
9627text and character varying 의 차이 [1]
초보
2016-01-22
8581
9626distributed table. [3]
초로기
2016-01-19
8861
9625aes 256 암호화 문의드립니다. [2]
정성헌
2016-01-17
12078
9624트리거확인어떻게해야할까요? [1]
김원진
2016-01-11
9624
9622postgre의 중국어(간체) 인식에 대해 질문이 있습니다 [4]
장승우
2016-01-08
10176
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다