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 5781 게시물 읽기
No. 5781
sp 와 query중에서 어떤 방법이 더 효율적일까요.
작성자
떼송이
작성일
2005-01-05 19:22
조회수
2,334

1.

php를 사용할때, pg_query()에다가 Select문을 넣고 파싱후, 루프에 Fetch를 써서 데이터를 가져 오는 방법과

 

2.

미리 cursor를 반환하는 stored procedure를 만들어 두고, pg_query('begin;spname('cursor명')); 후에 pg_query('fetch in all cursor명)후 Fetch해서 루프를 돌려 데이터를 가져온후 커서를 닫고 트랜잭션을 종료한다고 할때..

 

 

어느 것이 효과적일까요..? 그냥 일반적인 데이터 출력시에..

 

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

이곳에서 꽤 많은 이야기가 있었는데요,

php 에서라면, 그냥 첫번째 방식으로 문제를 풀어가는 것이 정신건강에 좋습니다. :)

 

이 문제를 고민하는 경우는 대부분 대용량 자료 처리 때문인데, 웹기반에서의 대용량 자료 처리에 대한 근본적인 출발점 자체를 달리하는 것도 좋은 방법 같습니다.

 

경험에 의하면, 그 자료가 수천건만 넘어가도 사람들은 그 자료 목록을 일일히 살펴보면서 처음부터 끝까지 목록을 전부 보질 않습니다. 이것을 전부 보여주어야한다는 기존 전통적인 웹 네이게이팅이 처음부터 잘못되었다고 감히 말하고 싶네요.

 

"당신이 원하는 자료가 10만건이 발견되었다"

이런 식의 처리 결과를 종종 보게되는데, 개인적으로는 이것만큼 쓸데없는 처리가 없다고 봅니다. 저 경우는 이미 그 "당신이 원하는 자료는 당신이 요청한 방식으로는 찾을 수 없다"와 마찬가지의 결과입니다.

 

좀 엉뚱한 이야기였는데, 아무튼 웹기반에서의 커서 사용은 미들웨어에서 그 일을 맞지 않는다면, 별로 쓸모가 없습니다.

 

김상기(ioseph)님이 2005-01-06 14:02에 작성한 댓글입니다.

에 넵..  정말 정신건강 상에 1번의 방법대로 풀어나가야 할것 같다는 생각이 사실 듭니다. (또한가지 방법은 SP를 사용하는 펑션을 이름하고, 인수만 나열해 주면 SELECT 문을 써서 하는것처럼 쓰게하는 펑션을 만들어 쓸까도 생각하고 있어요. 정신 건강을 위해서)

 

아 그리고 전통적인 웹 네비케이팅이 첨부터 잘못되었다고 말씀드리고 싶은 것은 전적동감을 표합니다. 대부분(!) 게시판 만드는 웹 프로그래밍 책에 쉽게 만들어 보자고 처음부터 전혀 대용량 DB를 고려하지 않는(즉, 트랜잭션 성격에 따른 자료관리를 전혀 고려하지 않은) 통~ 테이블을 기반으로 게시물을 구현하기 급급하여 설명되었구.. 그것이 실무에 거부감없이 받아들여지다보니 전통(?)이 되다 시피 하였다는 생각.. 예전부터 늘하던 생각입니다. ^^

 

쿼리를 SP에서 사용하고픈 생각은.. 엇비슷한 쿼리가 많아서 인수로 WHERE절을 어떻게 사용하여 데이터를 뽑아 올까 고민하다가 흘러 흘러 거기까지 갔어요. 엇비슷한 QUERY를 매번 다른 페이지에서 정의하여 사용하기도 껄끄럽고, 수정하기도 그렇고요.

 

좋은 말씀 감사드립니다.

떼송이님이 2005-01-10 18:08에 작성한 댓글입니다. Edit

곰곰히 생각해 봤는데 단순 쿼리라면 1번의 방식으로 해도 문제가 없을것 같은데 웹 에서 커서를 꼭 써야 할 만한 이유(?)가 될만한 껀수를 발견해서 글을 적을까 합니다.

 

로그인을 할때 대부분 사용자명과 비밀번호가 맞으면 세션에서 로그인 했음. 하고 해 줄 수도 있지만, 보다 향상된 보안을 위해, 다음과 같은 일련의 로직을 SP에서 구현을 염두한다면...

 

(이것을 application level에서 체크하면서 쿼리를 날리기는 매우 귀찬은 작업이기 때문에... SP로 만들자고 이미 마음이 정해져야 겠죠.)

 

1. 사용자가 존재하면 비밀번호를 체크, 아니면 Raise Exception.

2. 비밀번호가 맞으면 커서를 열고 사용자 정보 반환,

  (바로 이때(!!!) 커서는 1개의 로우만 가지고 있기 때문에 커서로써의 의미는 떨어지지만, Row를 반환할 수 있는 방법이기에 사용)

 

3. 비밀번호가 틀리면, 틀린날자, 횟수 + 1

    3-1 만일 비밀번호가 3회 이상틀리면 사용자 계정 중지. 후 Raise Exception.

    3-2 만일 비밀번호가 3회 미만 틀리면 Raise Execption만

 

^^ Row를 가져올 딴 방법이 있다면 가르쳐 주세요~ (text로 몽땅 담아서 가져 오는 방법 말구..)

떼송이님이 2005-01-13 11:50에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
5785테이블 join시... [2]
마법사
2005-01-06
2225
5783트리거에 관한 질문이요 [3]
초짜
2005-01-06
3707
5782서버 encoding이 uif-8인 환경에서 HTML encoding이 euc-kr인 Web 사이트 제작질문 [3]
떼송이
2005-01-06
4823
5781sp 와 query중에서 어떤 방법이 더 효율적일까요. [3]
떼송이
2005-01-05
2334
5780postgresql-8.0.0-rc2로 Window XP 설치 [1]
왕초보
2005-01-05
2456
5779DB 클러스터링 해보셨나요?
박성철
2005-01-05
2418
5777디비에 자동으로 인덱싱을 하려고 하는데 [1]
왕태봉
2005-01-03
2155
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다