쿼리 구문 작성

필요한 column만 명시한다.

SELECT * 을 사용하는 것은 피한다.
사용하지 않는 데이터를 호출하는 것만으로도 이미 많은 부하가 생긴다.
특히 text 타입의 데이터를 호출하는 경우는 그 정도가 심해진다.
data type의 byte가 적은 컬럼을 주로 사용하는 것이 좋다.

COUNT(*)을 사용하라.

COUNT(특정column) 으로 호출하는 경우가 있다.
이 경우 해당 컬럼의 NULL값을 제외한 COUNT를 가져오게 된다.
NULL값을 일일이 체크하면 호출 속도가 저하되게 된다.
NULL을 체크해야 하는 경우가 아닌 대부분의 경우 COUNT(*)을 체크한다.
COUNT(*)는 NULL값의 경우도 모두 count에 추가하지만 그로 인해 성능의 저하가 많이 줄어든다.

List 호출이 아닌 1 row 호출을 하는 경우 TOP 1을 사용한다.

성능상의 이슈로 이에 대해 권고하는 것은 아니다.
WHERE 조건절이 동적으로 변하는 경우를 고려한 작성을 하라는 것이다.
물론 QUERY를 호출하기 전 단계(비즈니스 로직 단계)에서 Validation 체크를 충분히 고려하겠지만 개발의 빈틈은 호출하는 쪽과 db쪽 양쪽 모두 없어야 한다.

where조건문의 왼쪽은 되도록 변형되지 않은 순수한 column만을 선언하라.

where name + '' = '조건' 과 같이 왼쪽 조건을 변형하지 말라.
where name = '' + '조건' 과 같이 오른쪽에 조건선언을 하라.
조건 일치를 매 로우마다 확인할 때 왼쪽 조건을 변형하게 된다.
그만큼 부하가 눈에 띄게 증가한다.

커서 및 임시테이블의 내용을 최대한 자제하라.

커서보다는 임시 테이블이 , 임시테이블 보다는 테이블 변수를 사용하는 것이 성능에 좋다.
커서의 경우 내부적으로는 임시 테이블을 사용하지만 임시 테이블을 쓴다고 부하가 더 발생하는 것이 아니다.
오히려 커서의 부가적 기능 때문에 서버 자원을 더 낭비하게 된다.
커서로 처리할 수 있는 것은 모두 임시 테이블이나 테이블 변수로도 처리가 가능하므로 되도록 커서를 쓰지 않는다.

JOIN을 사용하는 경우 INNER JOIN을 되도록 사용하라.

동일한 효과를 가지는 쿼리를 작성할 경우 INNER JOIN이 아닌 LEFT OUTER JOIN을 쓰는 경우가 있다. (습관적으로?)
확연히 속도가 차이가 나므로 INNER JOIN을 사용하는 것이 좋다.

하위쿼리의 사용시 불필요한 SELECT 구문은 줄여라.

아래와 같은 경우를 보자.
view source
print?
1.SELECT  kind     , SELECT name FROM kind_descriptoin WITH (READUNCOMMITTED) WHERE kind_id = kind    ...FROM list WITH (READUNCOMMITTED)WHERE kind = 1
kind라는 값은 WHERE 조건을 통해 하나의 값을 호출하게 되어있다.
kind가 1에 대한 kind_name의 값을 호출 하기 위해 서브쿼리를 사용하였지만 이는 올바른 사용이 아니다
SELECT가 해당 줄을 호출 할 때마다 서브쿼리에 있는 name을 구하는 쿼리를 호출하기 때문이다.
출력하는 줄이 많으면 많을 수록 서브쿼리의 실행 횟수또한 증가하게 되며 불필요한 부하를 가져온다.
따라서 위의 쿼리는 아래와 같이 사용하여야 옳다.
view source
print?
1.SELECT A.kind , B.name ...FROM list AS A WITH (READUNCOMMITTED)INNER JOIN kind_descriptoin AS B WITH (READUNCOMMITTED) ON A.kind = B.kind_idWHERE kind = 1

view의 총 사용을 줄여라.

view를 사용할 바엔 바로 사용하는 것이 단계 수를 줄이므로 더 낫다.

저장 프로시저를 사용하라.

저장 프로시저는 복잡한 SQL문을 단순화 시켜주고, 보안문제를 해결해주며 더 나아가 빠른 성능의 매개변수, 출력 매개변수, 리턴 값을 사용할 수 있다.

쿼리 구문 튜닝

MSSQL을 사용하는 경우 예상 실행 계획을 자주 확인하라.

MSSQL은 쿼리분석기에서 쿼리를 테스트 하기 편하다.
좋은 기능 중 하나가 예상 실행 계획인데 해당 쿼리가 성능상 어떤 장, 단점을 가지고 있는지 보기 쉽게 아이콘으로 표시해준다. (그래픽 실행 계획 아이콘)
실행계획의 내용은 버릴것이없으므로 꼼꼼히 따져봐야 한다.
튜닝의 시작은 성능 분석이다.

Index를 타는지 항상 체크하라.

Index를 활용하지 않은 검색은 데이터가 많으면 많을수록 성능은 급격히 떨어진다.
게시판 schema를 잘못 짠 경우 이런 현상이 발생하는데 이에 대한 점검을 늘 해야한다.
흔히 오해하기 쉬운 것 중 하나가 WHERE 조건절은 필요한 column만 존재해야 한다는 의식이다.
WHERE 조건절에는 Clustered Index Seek를 타기 위한 column이 우선 존재해야 하고 그 후에 원하는 데이터를 얻기 위한 조건절이 존재해야 한다.
조건자체가 Clustered Index column이면 제일 좋다.
조건절에 Index에 해당하는 columns이 존재하는 경우 우선적으로 해당 조건을 만족하는 행을 호출한 후 나머지 조건에 대해 만족하는 행을 다시 호출하게 된다.

Clustered Index Seek를 항상 체크하라.

Clustered Index Scan을 타는 것 만으로도 속도는 향상이 되지만 완전하진 않다.
Clustered Index column의 일정 구간을 타는 Seek여야 대량으로 증가하는 Data에 대한 부하를 감당할 수 있다.
이를 위해 Index의 구간 체크를 해야 한다.

만약 검색하는 column이 Clustered Index Column인 경우는 단방향 WHERE 조건문으로도 Index Scan이 성립이 된다.
자신의 컬럼에서 그대로 찾아서 시작 지점부터 끝까지 Index를 타면 되기 때문이다.

하지만 일반 Non Clustered Index의 경우는 Clustered를 찾기 위해 해당 column의 Clustered Index 정보를 호출해야 하는 부담이 생긴다.
왜냐하면 결국 호출을 하기 위해서는 해당 데이터의 위치를 찾아야 하고 이 위치를 가장 밀도있게 알고 있는 Clustered Index에서 해당 데이터의 위치를 찾아 가져오기 때문이다. (바로 찾게 되면 Clustered Index보다 범위가 크기 때문에 중간에 Clustered Index를 통해 찾는다.)
결국 구간 체크가 아닌 Non Clustered Index의 단방향 WHERE 조건문은 Clustered 의 전체 스캔을 하게 되는 결과를 가져온다.

Clustered Index와 Non Clustered Index의 Index 구조의 차이는 다음 두 페이지에서 확인할 수 있다.

 

기타 잡설

Index 설정시 DESC 정렬을 해야 빠르다?

그렇지 않다.
오름차순이건 내림차순이건 Index가 걸려있으면 조건에 따라 Clustered Index를 찾아 가게 된다.
다만 여러번 테스트를 해보았을 때 극소한 차이로 DESC가 걸린 정렬이 좀더 빠른 경우가 있었다.
이는 논리적인 검색으로 인한 빠르기 차이가 아닌 Data의 실제 물리적인 위치를 Index하는 과정에서 DESC가 좀더 효율적이기 때문이 아닐까 싶다. (이는 추측일 뿐이며 논리적으로 속도의 차이는 없다고 봐야 한다.)

Clustered Index Seek를 타면 무조건 빠르다?

그렇지 않다.
검색 조건이 모두 Index를 만족하지 않는 경우 WHERE 조건절에 Clustered Index column의 조건을 추가한 다음의 경우를 보자.
view source
print?
1.SELECT  * FROM test_query WITH (READUNCOMMITTED) WHERE idx > 0 AND content = 'testValue300000'

Clustered Index column이 검색 조건에 존재하므로 Clusterd Index Seek를 타게 된다.
하지만 성능상의 이슈는 없다.
왜냐하면 Clustered 전체 절을 검색하는 결과가 되기 때문이다.

Non Clustered Index column은 무조건 마지막엔 Clustered Index Column을 조회한다?

그렇지 않다.
Primary Key가 없는 (Clustered Index 설정이 없는) 테이블의 경우 결국 Non Clustered Index의 주소값을 이용해 데이터를 검색하게 된다.
다만 데이터 검색이 데이터의 순서와 index의 순서가 일치하는 Clustered Index가 더 빠르기 때문에 Clustered Index가 있는 경우 해당 Column의 주소값을 참조하는 것이다.

Clustered Index 검색이 무조건 Non Clustered Index보다 빠르다?
그렇지 않다.
단일 열 검색의 경우 두 검색의 속도는 거의 동일하다고 보아야 한다.
다만 검색한 내용이 범위대상과 같은 여러줄의 리스트가 되면 페이지의 단편화 현상과 연관하여 Non Clustered Index의 속도가 느려지게 된다.
이유는 여러열을 찾게 되는 경우. 이중 범위 검색의 경우 데이터가 서로 밀집되어 있으므로 Clustered Index에서는 바로 시작 지점에서 끝 지점까지의 데이터를 호출하면 되지만 Non Clustered Index는 각 열에 대해 포인트 점프를 통해 리스트를 호출해야 한다. 단편화가 되지 않은 경우 이 부분의 부하가 그리 크지 않지면 단편화가 심할 수록 그 속도는 저하되게 된다.


출처 : http://luvstudy.tistory.com/6
저작자 표시 비영리 동일 조건 변경 허락
      Java  |  2011/06/27 17:50





1. Help > software updates
2. Name : Properties Editor  
3. URL : http://propedit.sourceforge.jp/eclipse/updates/


저작자 표시 비영리 동일 조건 변경 허락
      Java  |  2011/06/16 16:08




Informix
Driver Class : com.informix.jdbc.IfxDriver
JDBC URL : jdbc:informix-sqli://<host>:<port>/<database>:informixserver=<dbservername>
Required File : ifxjdbc.jar  Download


JavaDB/Derby
Driver Class : org.apache.derby.jdbc.ClientDriver
JDBC URL : jdbc:derby:net://<host>:<port1527>/<databaseName>
Required File : derbyclient.jar  Download


Microsoft SQL Server 2000
Driver Class : com.microsoft.jdbc.sqlserver.SQLServerDriver
JDBC URL : jdbc:microsoft:sqlserver://<host>:<port1433>;DatabaseName=<database>
Required File : msjdbc.jar  Download


Microsoft SQL Server 2005
Driver Class : com.microsoft.sqlserver.jdbc.SQLServerDriver
JDBC URL : jdbc:sqlserver://<host>[:<port1433>];databaseName=<database>
Required File : sqljdbc.jar  Download


MySQL (Connector/J)
Driver Class : com.mysql.jdbc.Driver
JDBC URL : jdbc:mysql://<host>:<port3306>/<database>
Required File : mysql-connector-java-nn-bin.jar  Download


Oracle (Thin JDBC Driver)
Driver Class : oracle.jdbc.driver.OracleDriver
JDBC URL : jdbc:oracle:thin:@<host>:<port>:<SID>
                       jdbc:oracle:thin:@<host>:<port>/<service>
                       jdbc:oracle:thin:@<TNSName>
Required File : ojdbcxx.jar  Download
Oracle JDBC FAQ


Oracle (OCI JDBC Driver)
Driver Class : oracle.jdbc.driver.OracleDriver
JDBC URL : jdbc:oracle:thin:@<host>:<port>:<SID>
                      jdbc:oracle:thin:@<host>:<port>/<service>
                      jdbc:oracle:thin:<TNSName>
Required File : ojdbcxx.jar  Download    Oracle Database Instant Client
Oracle JDBC FAQ


PostgreSQL
Driver Class : org.postgresql.Driver
JDBC URL : jdbc:postgresql://<host>:<port5432>/<database>
Required File : postgresql-nn.jdbc3.jar   Download



Sun에서 제공하는 JDBC Driver 리스트



출처 : http://blog.outsider.ne.kr/267
저작자 표시 비영리 동일 조건 변경 허락
      Java  |  2011/06/02 10:30





교육

  • "HTML V5 and XHTML V2"(Adriaan de Jonge, developerWorks, 2007년 11월): HTML V5와 XHTML V2를 통해 기존 버전을 개선하는 과정에서 개발자들이 선택한 접근 방식은 매우 달랐다. 이러한 접근 방식의 차이로 인해 결과도 달라졌다. 또한, 여러 해 만에 처음으로 곧 공개될 브라우저 버전의 경향이 불확실했다. 이러한 두 가지 표준의 세부적인 내용의 근간이 되는 전체적인 개념을 확인할 수 있다.

  • "New elements in HTML5"(Elliotte Rusty Harold, developerWorks, 2007년 8월): HTML5의 몇 가지 새로운 요소에 대한 개요를 확인할 수 있다.

  • "An Introduction to MathML"(David Carlisle, developerWorks, 2009년 12월): MathML은 W3C 권장사항으로 수학 표현식을 마크업하는 데 필요한 XML 어휘를 정의한다. HTML5를 사용하면 MIME 유형과 서버 구성을 변경하지 않아도 MathML을 직접 웹에 배치할 수 있을 것으로 보인다.

  • "Android and iPhone browser wars, Part 1: WebKit to the rescue"(Frank Ableson, developerWorks, 2009년 12월): 이 기사는 두 개의 파트로 구성된 연재 기사 중 첫 번째로 브라우저 기반의 iPhone과 Android 애플리케이션을 개발하는 과정을 다룬다.

  • "The future of HTML, Part 1: WHATWG"(Ed Dumbill, developerWorks, 2005년 12월): 두 개의 파트로 구성된 이 연재 기사에서 Edd Dumbill은 웹 작성자와 브라우저 개발자, 표준화 기구에서 제안하는 다양한 HTML 발전 방향을 살펴본다.

  • w3schools.comHTML 튜토리얼에서 HTML에 관한 모든 것을 배울 수 있다.

  • CSS 튜토리얼에서는 CSS를 사용하여 다양한 웹 페이지의 양식과 레이아웃을 모두 한 번에 제어할 수 있는 방법을 배울 수 있다.

  • JavaScript 튜토리얼: 웹의 스크립팅 언어를 사용하는 방법을 배울 수 있다.

  • HTML5: A vocabulary and associated APIs for HTML and XHTML: Editor's Draft 13 January 2010: 최근에 발표된 HTML 스펙 Editor's Draft를 읽어보자.

  • 곧 간행될 Dive Into HTML5(Mark Pilgrim, O'Reilly Media)에서 발췌한 글을 읽어보자.

  • HTML5 갤러리에서 HTML5 마크업을 사용하는 웹 사이트를 확인할 수 있다.

  • HTML5 Tag Reference: 알파벳 순서로 정렬된 HTML5 태그 참조를 확인할 수 있다.

  • HTML5 doctor 웹 사이트에는 HTML5를 구현하는 데 도움이 되는 정보가 많다.

  • HTML 5 Cheat Sheet에는 현재 지원되는 모든 태그와 해당 설명 및 속성 그리고 HTML4에서의 지원 상황이 표시되어 있다.

  • CSS 3 Cheat Sheet: 여기에서 편리한 CSS3의 기본 기능과 인쇄 가능한 참조 카드를 확인할 수 있다.

  • HTML5 데모 웹 사이트에는 다양한 HTML5 실험 및 데모 사이트를 가리키는 링크가 있다.

  • 이 데모는 브라우저상에서 기능이 다양한 대화식 3D 애플리케이션을 구현하는 데 필요한 오픈 소스 웹 API인 O3D를 사용하여 브라우저의 3D 그래픽 렌더링 능력을 실제로 증명한다.

  • lifehacker.com에서 How HTML5 Will Change the Way You Use the Web 기사를 읽어 보자.

  • Yes, You Can Use HTML5 Today!: HTML5의 세계를 소개하는 또 다른 우수한 기사이다.

  • css3.info.com: CSS3에 관한 모든 정보를 얻을 수 있다.

  • Introduction to CSS3: 곧 공개될 CSS3 스펙의 W3C Working Draft를 읽어보자.

  • Introducing the CSS3 Multi-Column Module에서는 W3C 다중 컬럼 모듈을 깊이 고찰한다. 이 모듈은 요소 내부에 있는 다중 컬럼으로 컨텐츠가 전달될 수 있도록 하기 위한 것이다.

  • Mozilla.org에서 CSS3 컬럼을 배워보자.

  • CSS3 transitions and 2D transforms: 이 기사에서 Opera의 CSS3 트랜지션과 변환에 관해 배울 수 있다. 또한, SVG와 SMIL도 확인하자.

  • Mozilla.org에서 제공하는 이 캔버스 튜토리얼에는 HTML 페이지에서 <canvas> 요소를 구현하는 방법이 설명되어 있다.

  • Apple Developer Central에 있는 Using the Canvas에서는 Javascript 캔버스 오브젝트를 지원하는 WebKit 기반 애플리케이션 및 Safari, Dashboard를 살펴본다. Javascript 캔버스 오브젝트를 이용하면 HTML 내에서 임의의 컨텐츠를 편리하게 그릴 수 있다.

제품 및 기술 얻기

  • TheoraXiph.org Foundation의 개방된 비디오 압축 형식으로 무료이다.

  • O3D AP: O3D는 브라우저상에서 기능이 다양한 대화식 3D 애플리케이션을 구현하는 데 필요한 오픈 소스 API이다.


출처 : HTML5와 CSS3를 사용하여 최신 웹 사이트 구축하기(IBM)

저작자 표시 비영리 동일 조건 변경 허락
      JavaScript  |  2011/06/01 16:37




Float이나 Double로 사칙연산을 하는 경우 정확한 값을 얻지 못할 때가 있고,
이는 소수점 이하의 값을 제대로 읽지 못하기 때문이다.

예를 들어 0.2 * 0.4 의 결과가 0.0800000005 이렇게 나오는 경우이다.

이럴때는 BigDecimal을 이용하자.
java.math.BigDecimal 을 import해야한다.

// 예제에서는 String 타입을 인자로 넣었다.
BigDecimal preNum = new BigDecimal("6");
BigDecimal postNum = new BigDecimal("2");

// 곱하기
mutipleResult = preNum.multiply(postNum);
// 나누기, 반올림해서 소수점 둘째자리까지 보여준다.
divideResult = preNum.divide(postNum, 2, BigDecimal.ROUND_UP);
// 더하기
addResult = preNum.add(postNum);
// 빼기
subtractResult = preNum.subtract(postNum);


[출처] http://junp.tistory.com/114
저작자 표시 비영리 동일 조건 변경 허락
      Tag - BigDecimal
      Java  |  2011/05/19 10:35



♥Cloe♥'s Blog is powered by Daum