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
운영게시판
최근게시물
Oracle Q&A 24109 게시물 읽기
No. 24109
게시판 쿼리시 여러분은 어떻게 사용하시나요?
작성자
와니
작성일
2005-09-15 16:21
조회수
4,410

<게시판 쿼리>
현재 사용하고 있는 게시판의 쿼리구조입니다.
게시판 리스트쿼리에서 주 메인으로 읽어오는 쿼리가 있고 (기본적으로 index_desc 힌트구문을

이용하여 역순으로 가져옴), 리스트 검색시에 조건에 따라서 where문 뒤에 검색조건을 붙이는 형식입니다.

ex)
$where = " WHERE GID > 0";

if(검색조건이 있을경우) {
switch(검색조건타입) {
case 'all': //전체검색
$where .= " AND (TITLE LIKE '%'||:search_text||'%' OR CONTENTS LIKE '%'||:search_text||'%' OR CONTENTS2 LIKE '%'||:search_text||'%')";
break;

case 'contents': //내용검색
$where .= " AND (CONTENTS LIKE '%'||:search_text||'%' OR CONTENTS2 LIKE '%'||:search_text||'%')";
break;

default: //기타(제목, 글번호, 글쓴이)
$where .= " AND ".$param->get('search_kind')." LIKE '%'||:search_text||'%'";
break;
}
}


'list' => "SELECT * FROM
(SELECT /*+ INDEX_DESC($table IDX_${table}) */ ROWNUM RNUM, ID, GID, THREAD, USER_ID, NICKNAME, HEAD, TITLE, FILE_NAME, REF
FROM $table
$where)
WHERE RNUM > :m_rnum AND ROWNUM <= :m_rownum
ORDER BY GID DESC, THREAD ASC, ID DESC"


구성된 인덱스
PK_AAA -> 컬럼(ID)
IDX_AAA_GID -> 컬럼(GID)
IDX_AAA_THREAD -> 컬럼(THREAD)


이렇게 구성이 되어있는데요.. 게시물수는 6만건정도이구요..
그런데 사용자가 좀 몰린다 싶으면 정말 느려지는거 같은데..
제가 사용하고 있는 이 방법의 개선점이 없을까요?

가장 마음에 걸리는 부분이 검색조건이 있을경우인데요..
검색시에도 INDEX_DESC 힌트구문을 사용하여 가져온다는 점이 좀 걸립니다.
검색조건이 있을경우에는 힌트구문을 바꿀수 있게끔 해야 하는게 맞을꺼란 생각이 드는데..
그렇게 되면 검색조건별로 사용되는 컬럼마다 인덱스를 생성해줘야 하는것인지..

예를들어 제목으로 검색할경우 INDEX_DESC(AAA IDX_AAA)가 아니라 제목컬럼으로 인덱스를

생성한 후 INDEX_DESC(AAA IDX_AAA_TITLE) 이렇게 힌트구문을 사용해서 가져와야 하는것인지..
후자의 방법이 성능상 좋지 않을까 하는 생각은 드는데..
그렇게 되면 인덱스의 무분별한 남용을 가져올수도 있다는 생각이 드네요..

과연 어떤방법으로 쿼리 및 힌트구문을 구성하고, 인덱스를 구성하는게 효율적인 방법일까요?

그리고 항상 어떤 한가지 검색조건이 붙는다고 하면.. 예를들어 KIND='A' 이런식의 쿼리가 항상

붙게된다면 인덱스 구성시 KIND 컬럼까지 더한 복합인덱스로 구성을 하는것이 효율적인 것일까요?
이렇게 생성해야 할 여러 인덱스마다 복합인덱스로 구성한다면(항상 KIND는 다 들어가겠죠)

정말 인덱스의 무분별한 사용이라는 생각이 드는데..

좀더 효율적인 방법이나 잘못된 점 지적해주시면 정말~~~ 고맙겠습니다~~ (__)

 

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

 

rownum을 안쪽 쿼리에 넣어주세요.

실행계획을 보시면 알겠지만 6만건 full sacn합니다.

 

이호한(miplus)님이 2005-09-15 16:33에 작성한 댓글입니다.

게시판 속도향상을 위해서는 like '%search%' 를 안쓰는 것이죠...

풀텍스트 검색을 사용하세요...  오라클에도 있을껄여..

이경환(babocom)님이 2005-09-15 16:34에 작성한 댓글입니다.

//호한님 감사합니다.

 그런데.. 플랜보면 테이블 풀스캔이 아니라인덱스 스캔을 하는데..

그리고 rownum을 안쪽 쿼리에 넣게되면 원하는 결과값을 가져올수가 없어요.. ㅡㅜ

 

//경환님..

지금 이쪽 게시판에서는 인터미디어 텍스트를 사용할 수 없는지라

지금은 이렇게 사용해야 하거든요.. ㅡㅜ

 

사용된 플랜은 다음과 같습니다.

operation options object_name id parent_id position cost bytes
SELECT STATEMENT 0 14 61548
SORT ORDER BY 1 0 14 61548
COUNT STOPKEY 2 1
VIEW 3 2 3 61548
COUNT 4 3
TABLE ACCESS BY INDEX ROWID AAA 5 4 3 57960
INDEX RANGE SCAN DESCENDING IDX_AAA 6 5 2

와니님이 2005-09-15 16:53에 작성한 댓글입니다.
이 댓글은 2005-09-15 16:58에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
24113[질문] 최대값 [1]
강명원
2005-09-15
2141
24111내부 서버의 오라클을 외부에 공개하기 [5]
권남
2005-09-15
3012
24110특정날짜부터 2개월 후까지 날짜를 죽 출력하고 싶습니다. [12]
오희철
2005-09-15
11967
24109게시판 쿼리시 여러분은 어떻게 사용하시나요? [3]
와니
2005-09-15
4410
24108급하게 질문입니다....ㅡㅜ [3]
전용범
2005-09-15
2199
24107방화벽(Symantec) 내부로 접속?
김종준
2005-09-15
2922
241068.04 또는 8.05와 windows2000 또는 2003버젼 실무에서 사용중인 분 계시나요? [4]
싸낙배기
2005-09-15
1487
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다