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
운영게시판
최근게시물
MySQL Q&A 26515 게시물 읽기
No. 26515
Mysql Client ran out of memory 에러... -_ㅜ
작성자
발바닥
작성일
2007-03-20 13:48ⓒ
2007-03-20 14:51ⓜ
조회수
7,028

잘 실행이 되다가... 한참후( 실행후 1~2시간 이후에 ) 
( 1개의 Connection 으로, 초당 10~30 건정도의 insert 및 update 를 해야하는 일들을 수행하고 있습니다.  ) 

갑자기..

Out of memory (Needed 8164 bytes)
Mysql Client ran out of memory

라는 에러가 뜹니다.

쿼리자체는 . 

select a from table where b = '%d' order by a desc limit 1

이런 쿼리에서 에러가 나구요.. 그후로.. 쭈욱, 같은일을 할때 계속 에러가 납니다. ㅜ_ㅠ



해당 테이블에는 30만건정도의 데이터가 insert 되어져 있고,
MyISAM 테이블을 사용하고 있습니다. 


쿼리에 의한 리턴값이 너무 많을때 발생한다고 하는데..
limit 1 로 한개의 row 에 한개의 a 컬럼만 가져오는데, 리턴값이 너무 많다는건 이해할수 없는것 같구요.. -_ㅠ



조언좀 부탁드릴께요. ^^ __



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

select a from table where b = '%d' order by c desc limit 1


위의 해당쿼리는 1건을 가져오는데, 

무조건 30만건의 테이블을 풀로 다 읽게됩니다.


업무룰상 c컬럼으로 정렬해서 가져와야만 하는지 체크하십시오.


1. 정렬을 굳이 안해도 된다면 order by구문을 제거하시고

2. where 조건에서 b가 체크조건인 경우라면 만족하는 1건을 찾을때까지의 스캔은 감당하셔야겠네요

3. b컬럼에 인덱스가 있다면, 인덱스를 사용할 수 있도록 변경고려해보십시오.


쿼리자체가 db야 죽어라하는 구문이네요.

옵티마이저에 대한 이해가 필요하리라 생각됩니다.

사리동님이 2007-03-20 14:34에 작성한 댓글입니다. Edit

select a from table where b = '%d' order by a desc limit 1


먼저..;;앗..죄송합니다.;; 쿼리적는데 실수가..있었네요...

정렬형 컬럼이 c 가 아니라, a 동일한 컬럼이었습니다.쿨럭;


음..지금 상황이 a가 auto_increment 이고, 해당 b값의 최근 insert 된 a 값을 가져오는 겁니다.~ 쿨럭;



1. 정렬을 굳이 안해도 되긴합니다.

그래서...


select max(a) from table where b = '%d'  라는 쿼리를 실행보았었는데...

결과가 나오는데까지 나오는 속도가 엄청나게 느립니다. 흑흑 -_ㅜ 

처음 쿼리속도와의 차이가 상상이상입니다.;; 쿨럭;;


2. b의 체크조건이 필요합니다. 그정도의 스캔은 감당하고 있습니다.흑


3. b 컬럼은 인덱스 키이긴 합니다.

저 쿼리에서. b에대한 인덱스는 탈거라 생각되는데... 흑흑...



잡담..흑흑 ..

어느정도의 스캔시간은 알고 있는데요..흠... max 보담 저렇게 하는게 반응속도가 더 빠르더라구요-

max 말고 다른 좋은 방법있으면 조언 부탁드려요-흑흑...


select a from table where b = '%d' order by a desc limit 1 이런 식의 쿼리와

select max(a) from table where b = '%d'  식의 쿼리 리턴속도가..흠

어플리케이션단에서, ms 단으로 체크를 하는데....


평균 속도차가 900ms 정도 납니다. -_ㅜ 1건에 대해서..흑



근데.. Mysql Client ran out of memory 가 나오는 것은 왜일까요..악; 

수백만건도 잘 되는것 같던데... ㅡ_ㅜ

흑흑..

발바닥님이 2007-03-20 15:01에 작성한 댓글입니다.
이 댓글은 2007-03-20 15:17에 마지막으로 수정되었습니다. Edit

select a from table where b = '%d' order by a desc limit 1

select max(a) from table where b = '%d'  


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

위 where 조건의 b='%d'는 b like '%d'의 패턴매칭으로 검색하는 것을 전제하여 설명드립니다.

b = '%d' 가 맞다면 index를 사용합니다.

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

두가지의 쿼리가 모두 난리났네요.

b컬럼이 인덱스가 있다하더라도, 인덱스를 사용하지 못합니다.

%가 앞에 나오면 인덱스를 사용할 수 없어요.

따라서 위 두 쿼리는 모든 테이블을 읽으면서, 해당 b컬럼으로 모두 체크하고

a값으로 정렬해서 최대값을 뽑는 것입니다.


요구사항자체(%d) 조건 자체가 멍텅구리 조건으로 들어오네요.

무조건 다 읽습니다. 매번 30만건. 

요구사항을 변경하시거나, 처리방법을 변경해야합니다.


죄송합니다만, 위의 쿼리는 대책이 없습니다.

해당 DB설계 및 요구사항의 정의자체가 db입장에선 욕나오는 거랍니다.


해결방안은

%d로 검색하여 나오는 결과를 인덱스나 클러스터를 사용하여 필요로하는 것만 

뽑아낼 수 있도록 해주셔야합니다.

그후에 결합인덱스를 사용하여 더 빠르게하는 방법이 가능하겠습니다.

어줍짢은 지식으로 말씀드리는 것 같아 송구스럽습니다.


해당 Mysql Client ran out of memory 에러는

첫째, 해당 릴리즈의 버그라는 것과 둘째, 메모리설정변경 두가지라고 하네요.

아래 링크 참고,

http://www.litespeedtech.com/support/forum/archive/index.php/t-490.html


추가적인 설명이 필요하시면 메일줘보십시오. 말로 설명해드리겠습니다. ^&^

DB를 이해해주셔야 합니다.


lsdubf@hotmail.com 사이트는 오랜만에 들어왔다가 글남겨서 본 글을 다시 보진 않습니다.


사리동님이 2007-03-20 16:05에 작성한 댓글입니다.
이 댓글은 2007-03-20 16:08에 마지막으로 수정되었습니다. Edit

패턴매칭은 아니에요ㅎㅎ


괜히 '%d' 라고 썼나바욤-ㅎㅎ

b 에는 unsigned 형 integer 값이 치환되서 들어가진답니다.ㅎㅎ


좀더 연구를...우윽;;; OTL

발바닥님이 2007-03-20 17:22에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
26518최대 최소 구하기.
김태호
2007-03-21
1872
26517현재 쿼리문에서 정렬을 추가시키려고 하는데 안됩니다. [4]
김두홍
2007-03-21
2229
26516로그 지우는법에 대해서 문의드립니다 [1]
김수현
2007-03-20
2159
26515Mysql Client ran out of memory 에러... -_ㅜ [4]
발바닥
2007-03-20
7028
26514wait_timeout 이 이상하네요 [1]
한상
2007-03-20
2642
26513MySQL 설치 문의 드립니다...-초심자 [1]
손관현
2007-03-19
2312
26512ODBC테이블
별님
2007-03-19
1996
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2025 DSN, All rights reserved.
작업시간: 0.011초, 이곳 서비스는
	PostgreSQL v17.4로 자료를 관리합니다