ASP,Java,SQL2008. 10. 31. 16:40
게시판의 페이징 쿼리를 연구(?)하던 중 희안한 현상을 발견했다.
다음의 두 쿼리를 보자.

1. SELECT TOP 5 * FROM
(SELECT TOP 10 * FROM tableA ORDER BY field1 ASC) AS A ORDER BY field1 DESC;

2. SELECT TOP 5 * FROM
(SELECT TOP 10 * FROM tableA) AS A ORDER BY field1 DESC;

field1은 PK로 INDEX가 ASC로 걸려있다.
어짜피 INDEX가 field1 ASC로 걸려있기 때문에 위 두개의 inner 쿼리 문은 같은 결과를 같는다.
그러나 이를 다시 DESC로 정렬하여 밑에서 5개를 가져오려고 할 때 문제가 발생한다.
2번 쿼리는 내부 쿼리 결과를 무시하고 다시 tableA 를 field1 DESC 하여 TOP 5 를 가져온다.

수행계획을 보면 차이점을 알 수 있다.


단순히 생각했을 때 inner 쿼리를 수행한 결과를 메모리에 저장하고 나서 그걸 다시 sort 하여 TOP 5를 가져오는 것이 아니네?
2번 쿼리를 보면 inner 쿼리의 내부 TOP을 수행한 뒤 바로 외부의 TOP을 수행했다. 
sort 연산은 수행하지 않았다.
둘다 select 연산은 맨 마지막에 한 번만 수행했다.

그럼 정렬 대상을 INDEX가 안걸려있는 field로 해보면 어떨까?

3. SELECT TOP 5 * FROM
(SELECT TOP 10 * FROM tableA) AS A ORDER BY field2 DESC;


하~ 이러니 sort 연산을 한다. 결과도 원하는대로 나온다.(당연하겠지만)
(※ 어? 근데 쿼리비용을 보면 3번이 더 적네?? 그래서 3번 쿼리를 실행하면서 1번쿼리도 동시에 실행시켜봤는데 비용은 같은 44.97%로 나왔다.ㅎㅎ)

암튼 이 결과 INDEX 가 걸려있는 field를 sort 할 때는 sort 연산이 이뤄지지 않는다는 걸 알았다. ASC든, DESC든.

그리고 innser 쿼리 결과를 재정렬하여 TOP 으로 가져오고자 할 경우 inner 쿼리에도 sort 를 걸어줘야 한다는 것도 알았다.
왜 그렇게 되는지는 정확히 알 수 없지만..ㅎㅎㅎ

Posted by gildong0
SWT/JFace2008. 10. 22. 17:33

뭘 가지고 SWT/JFace 프로그램을 만들지?

뭐 잡담은 그만하고 답은 eclipse 다. 나는 현재의 최신버전인 Ganymede 로 해봐야지. (정확히는 Ganymede RCP 버전)

근디 이놈의 eclipse는 3.3 버전부터인가 처음 설치하고 실행할 때마다 다음과 같은 오류가 뜬다.

 

ecilpseErr.gif

 

대처방법은?

구글신에게 물어보면 여러가지가 있다. 그 중 내가 적용해서 성공한 방법은 아래와 같다.

 

-Xmx512m   ☞  -Xmx256m

 

메모리를 256을 최대로 잡으면 되더라. 사실 잘 이해가 안된다. 많이 잡으면 많이 잡을 수록 eclipse 입장에선 더 나은 환경에서 돌 수 있을 텐데.

암튼 일단 Ganymede를 드디어 실행했다!

 

ganymede.gif

 

근데 그냥 eclipse 만 설치한다고 해서 SWT/JFace 프로그램을 짤 수 있는 건 아니었다.(암튼 인생 수월하지 않네. ㅡ.ㅡ)

 

eclipse에서 생성할 수 있는 Project 에는 기본적으로 SWT Project 란게 없다. 그냥 일반 Java Project 로 생성해야한다.

이러다보니 Java Project를 생성해 보면 Build Path 에 SWT 나 JFace 관련 Library 들은 안올라와 있으니 이걸 하나씩 찾아서 추가해줘야 한다. (Eclipse 는 Project 분류에 SWT/JFace Project를 추가해달라!)

 

  1. 생성한 Project 에서 오른쪽 마우스클릭으로 열린 메뉴 중 맨 밑에 있는 Properties 를 선택한다.

    projectProperties(1).gif

  2. 좌측 메뉴 중 Java Build Path 를 선택한 뒤 오른쪽에 Libraries 탭을 선택한다. (아래 화면 중 원래는 JRE System Library 하나 밖에 없다. 나머진 3번을 따라서 추가해줘야한다.)

    projectLibraries.gif

  3. 위 Libraries 들을 추가한다. 각 Library 위치 내용은 아래와 같다.

    Variable Entry Name Path (* %eclipse% : eclipse가 설치된 Root 폴더)
    BOOT_LIB %eclipse%/plugins/org.eclipse.core.boot_3.1.100.v20080218.jar
    COMMANDS_LIB %eclipse%/plugins/org.eclipse.core.commands_3.4.0.I20080509-2000.jar
    COMMON_LIB %eclipse%/plugins/org.eclipse.equinox.common_3.4.0.v20080421-2006.jar
    JFACE_LIB %eclipse%/plugins/org.eclipse.jface_3.4.1.M20080827-2000.jar
    RUNTIME_LIB %eclipse%/plugins/org.eclipse.core.runtime_3.4.0.v20080512.jar
    SWT_LIB %eclipse%/plugins/org.eclipse.swt.win32.win32.x86_3.4.1.v3449c.jar
    WORKBENCH_LIB %eclipse%/plugins/org.eclipse.ui.workbench_3.4.1.M20080827-0800a.jar

참, 위에서 각 JAR파일 이름에 먼 숫자들이 줄줄이 붙어 있는데 대충 알겠지만 버전을 의미하는 거다. 그러니 똑같은 거 없다고 땅 파지 말고 그 앞에 까지만 같은걸로 찾으면 된다. 그리고 eclipse RCP 버전을 깔면 기본적으로 위 JAR 파일들이 다 있지만 다른 버전을 깔면 없을 수 있다. 이럴 땐 지체말고 eclipse.org 에 방문해서 해당 파일을 다운받아다가 plugins 폴더 밑에 갖다 두면 된다.

 

자! 그럼 이제 프로그램 짤 준비는 다 된거 같으니 슬슬 기술 들어가 보까나~

이 글은 스프링노트에서 작성되었습니다.

'SWT/JFace' 카테고리의 다른 글

SWT/JFace 초짜 도전기 -(2) 안녕 세상~  (0) 2008.11.01
Posted by gildong0
WEB2008. 10. 6. 13:11
크롬(Chrome)을 사용하면서 그 깔끔한 인터페이스에 적응될 즈음
영문사이트에 갔을 때 막히는 단어를 만났을 때 그동안 firefox에서 잘 사용하던 google Toolbar의 번역기능이 그리웠다. 그래서 생각했지. 
"google이 만든거니깐 당근 자기꺼인 toolbar도 깔리겠지?"
그러나 이는 때이른 추측이었을까?
아직 여기까진 손을 못댔나부다. ㅡ.ㅡa

Posted by gildong0
CSS, HTML2008. 10. 2. 08:17
우선 기본적인 CSS 로는 도저히 어떻게 해도 방법을 찾을 수 없었다.
아래의 소스를 보자.

<div id="a">left</div>
<div id="b">right</div>

a, b 영역을 좌우로 정렬하려면 CSS 에서 다음과 같이 하는 것이 기본적인 방법이다.

#a{
   float:left;
   width:200px;
}
#b{
   float:left;
   width:500px;
}

그런데 문제는 창의 크기가 a 와 b 영역의 가로 크기보다 작게 줄여보면 당황하게 된다!
b 영역이 밑으로 밀리기 때문이다. 헉 ㅜㅜ


이건 뭐 <span>으로 바꿔봐도 안되고, position:absolute 로 주는 수 밖에는 방법이 없다.
그럼 아예 top 과 left 를 지정해서 줘보자.

#a{
   position:absolute;
   width:200px;
   top:10px;
   left:10px;
}
#b{
   position:absolute;
   width:500px;
   top:10px;
   left:210px;
}


자, 이제 된 거 같다. 그럼 이제 밑에 footer를 넣어볼까?
그런데 ... 어이구?!? 이거 위에 a 와 b 영역 모두 absolute로 했기 때문에 footer도 따라서 absolute로 할 수 밖에 없네?? ㅠㅠ
일단 해보자.

#a{
   position:absolute;
   width:200px;
   top:10px;
   left:10px;
}
#b{
   position:absolute;
   width:500px;
   top:10px;
   left:210px;
}
#c{
   position:absolute;
   width:700px;
   top:30px;
   left:10px;
}


머 생각대로 잘 배치가 됐다.
자 그럼 이제 본문(right) 영역에 내용을 채워볼까? .... 헉!!!!! 이게 뭐야?!? footer가 그냥 지자리에 있자나?


본문영역은 어떤 내용이 들어올지 모르기 때문에 높이가 정해져 있지 않다. 그렇다면 footer가 알아서 본문영역(id=b)의 크기에 맞춰 그 아래에 위치해야하는데 position을 고정해놨으니 당연한 결과다.

자 그럼 float 도 안되고, position:absolute도 안되고, 이제 뭘 시도해봐야 하나? ㅠ.ㅠ

하나씩 차근차근 생각해보자. 우선 본문영역(id=b)과 footer는 서로 상대적이어야 한다. 본문영역의 크기에 따라 footer의 위치가 변하기 때문이다.
가만! 그럼 left는? 거기는 뭐 이래나 저래나 그자리에만 있으면 되자너?
그렇지!!!! 이렇게 해결하면 되겠구나~~!!!

#a{
   position:absolute;
   width:200px;
   top:10px;
   left:10px;
}
#b{
   margin-left:210px;
}
#c{
   width:700px;
}


이런 걸 꽁수라고 해야하나? 어쨋든 <div>만으로 레이아웃 구성하기 넘 힘들다. 하다보면 계속 <table>로 돌아가고픈 유혹이 끊이질 않는다. 하지만 계속 시도는 해봐야겠다. ^^;;;
Posted by gildong0