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 23952 게시물 읽기
No. 23952
[질문] 쿼리문 응답시간이 너무 느립니다~!!! orz...
작성자
최성화(metell)
작성일
2005-09-05 16:08ⓒ
2005-09-05 16:09ⓜ
조회수
1,354

--area_code_all이라는 테이블과 POI라는 테이블이 있습니다.

--POI에서 사용자가 선택한 값과 가장 근사치를 찾아서 L_CODE를 구하고 그 값으로

--area_code_all의 L_CODE와 비교하여 같은 레코드의 do, si, dong을 구할라고 합니다.

--(POI에서 전체 검색하면 넘 느려서 범위를 주었습니다. between으로)...

--그리고 POI에서 가장 근사치의 L_CODE로 선택된 레코드에서 name값도 뽑아오면 완료~! BUT~!!!

 

 

--(1) 도 시 동만 출력하기, 응답시간 빠릅니다. 100ms미만
select do,si,dong from area_code_all where l_code =
(select L_CODE FROM
(SELECT NAME, H_CODE, L_CODE, KATX, KATY FROM POI WHERE KATX BETWEEN 325779.76-500 AND 325779.76+500 AND KATY BETWEEN 537096.13-500 AND 537096.13+500)b
WHERE ( ABS(b.katx - 325779.76) + ABS(b.katy - 537096.13)) =
(SELECT MIN( ABS(katx - 325779.76) + ABS(katy - 537096.13) ) FROM
(SELECT NAME, H_CODE, L_CODE, KATX, KATY FROM POI WHERE KATX BETWEEN 325779.76-500 AND 325779.76+500 AND KATY BETWEEN 537096.13-500 AND 537096.13+500)));

 

 

--(2) (1)번과 같다고 생각되는데 응답시간이 없청 느립니다. 20초안팍
select a.do,a.si,a.dong from area_code_all a,
(select L_CODE, NAME FROM
(SELECT NAME, H_CODE, L_CODE, KATX, KATY FROM POI WHERE KATX BETWEEN 325779.76-500 AND 325779.76+500 AND KATY BETWEEN 537096.13-500 AND 537096.13+500)b
WHERE ( ABS(b.katx - 325779.76) + ABS(b.katy - 537096.13)) =
(SELECT MIN( ABS(katx - 325779.76) + ABS(katy - 537096.13) ) FROM
(SELECT NAME, H_CODE, L_CODE, KATX, KATY FROM POI WHERE KATX BETWEEN 325779.76-500 AND 325779.76+500 AND KATY BETWEEN 537096.13-500 AND 537096.13+500)))c
where a.l_code = c.l_code;

 

 

--(3) 원래 원하는 값입니다. area_code_all의 도 시 동값과 poi의 name까지... 당근 응답시간 엄청 느립니다. 20초 초과
select a.do,a.si,a.dong,c.name from area_code_all a,
(select L_CODE, NAME FROM
(SELECT NAME, H_CODE, L_CODE, KATX, KATY FROM POI WHERE KATX BETWEEN 325779.76-500 AND 325779.76+500 AND KATY BETWEEN 537096.13-500 AND 537096.13+500)b
WHERE ( ABS(b.katx - 325779.76) + ABS(b.katy - 537096.13)) =
(SELECT MIN( ABS(katx - 325779.76) + ABS(katy - 537096.13) ) FROM
(SELECT NAME, H_CODE, L_CODE, KATX, KATY FROM POI WHERE KATX BETWEEN 325779.76-500 AND 325779.76+500 AND KATY BETWEEN 537096.13-500 AND 537096.13+500)))c
where a.l_code = c.l_code;

 

--[질문1] (2)이 왜 느린지 답변부탁드립니다. 제가보기엔 (1)번과 같아보이는데... =ㅂ=;;

--[질문2] (3)번을 빠르게 하는 방법 없을까요?

-- 고수님들의 우문현답 부탁드립니다. 그럼 좋은 하루 되시길~


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

이유가 많을 수 있으니...

각각의 실행 시의 실행 계획과 인덱스 상황을 올려주심이...

 

그리고 하나더..

 

아마도 저번에 가장 가까운 지점을 구하는 문제를 올리셨던 분이신듯 한데요...

 

문제 해결을 특정 범위 이내(여기에서는 거리 범위 500으로 제한)로 제한 하시는 것을 사용하여 중간 결과 집합을 줄임으로 인해서 목적을 달성하신 듯 하네요....^^(현업에서 업무에 맞다는 보증만 있으면 이도 좋은 방법입니다. 단 한가지 고려할 것은 여기서의 거리 개념이 2차원에서의 거리개념이면 ABS로 했을 때의 500단위 거리 범위가 위치에 따라 달라져서... 남북,동서로 각각 500거리 범위내의 점을 구하려는 시도가 올바른 결론을 도출하지 못할 수도 있습니다.--ABS 범위는 정방형 범위가 됩니다. 즉 반경의 개념하고는 다르므로 실제 반경으로는 500단위가 넘는 경우의 점도 잡히겠죠..하기사 검색범위를 좁히는 것이 목적일 때는 이런 세밀한 부분은 문제가 되는 부분이 아니겠지만요..^^)

 

그리고..

 

위의 SQL은 동일한 SQL이 일단 아닙니다.

 

만약 최단 거리내의 지점이 한 지점이 넘으면 1번 SQL은 too-many-rows 에러를 뿜으며 죽습니다.(물론 업무성격에 따라 절대로 이런 일은 없을 수도 있습니다.--> 어떤 점에서 가장 가까운 점이 하나를 초과하는 일은 사실상 불가능한 경우.... 그렇지만 전산이라는 놈이 만의 하나 때문에 설계를 뜯어 고치는 놈이라서... 어쨋든 님의 SQL은 특정 데이타가 입력되면 에러를 유발시킬 수 있는 SQL입니다.)

 

 

 

 

 

김흥수(protokhs)님이 2005-09-05 17:44에 작성한 댓글입니다.
이 댓글은 2005-09-05 17:52에 마지막으로 수정되었습니다.

흥수님 답변감사합니다. 꾸벅... (실행 계획과 인덱스 상황이라니...모르겠군요... orz... select update 만 하던 저한테는 아직은 무리인듯합니다. ㅠ_ㅠ 책한권사서 공부좀 해야할듯 )

 

최성화(metell)님이 2005-09-06 08:45에 작성한 댓글입니다.

 

실행계획이나 인덱스 상황을 검사하기는 쉽습니다.

그리고 반드시 그런것을 습관화하시는 것이 좋습니다.

가장 쉽게 실행계획을 뽑아내는 방법은

 

SQL-PLUS에서

 

set autotrace on

 

이라고 치십시오.

그러면

그다음부터 사용하는 SQL은

SQL의 실행 후 실행된 SQL의 실행계획을 보여줍니다.

 

그 실행계획을 올려주시면 됩니다.

 

인덱스 상황은...

어떤 테이블에 어떤 인덱스가 어떤 컬럼에 걸려있으며 어떤 순서로 걸려 있다는 것을 알아내시면 됩니다.

 

가장 쉬운 방법은 user_ind_columns라는 시스템 뷰에 그 정보가 있으니....

 

select index_name,column_name,column_position

 from user_ind_columns

where table_name = '테이블명'

order by index_name,column_position

 

이렇게 알아보시면 됩니다.

 

 

김흥수(protokhs)님이 2005-09-06 15:37에 작성한 댓글입니다.

흥수님 댓글 감사합니다. 꾸벅...

최성화(metell)님이 2005-09-07 14:13에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
23956instance level trace를 하려고 합니다. [1]
이은주
2005-09-05
1215
23955[질문]오라클 데이터좀(복원)..살려주세요... [2]
김성훈
2005-09-05
1225
23953쿼리의 결과값이 없을때? [2]
나승용
2005-09-05
8818
23952[질문] 쿼리문 응답시간이 너무 느립니다~!!! orz... [4]
최성화
2005-09-05
1354
23951export시 백업시 데이타파일이 백업되는 시점에 대해 [3]
누리
2005-09-05
1403
23950[질문]Oracle 10g 책소개 부탁합니다. [2]
아폴론
2005-09-05
1161
23949redolog 파일이 없어졌어요????? [2]
이영주
2005-09-05
1098
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다