Query 12

[삽잡이::DB] SQL_NO_CACHE

Query를 작성하고 수행 시간을 체크해보면처음에는 드럽게(?) 느리던 녀석이 어느정도 적응이 되었는지이상하게 속도가 향상되는 경우를 볼 수 있습니다. 흠... 이상하다... 난 쿼리를 발로짜는데... 예 그렇습니다... 뻔하디 뻔하지만, 바로 '캐시' 때문이지요. 그런거였군~~~ MySQL에서는 Query에 의해 만들어진 결과를보다 효율적으로 사용할 수 있도록 캐시에 저장을 하게 됩니다. 그런데, Query 수행 테스트를 위해서는 캐시가 맥여지면(?) 안되겠지요.그래서 'SQL_NO_CACHE' 를 사용합니다. Query 성능을 비교하거나 성능을 분석하기 위해 유용하게 사용할 수 있겠지요. 발로 짠 내 쿼리를 테스트해보겠어~~

[삽잡이::일기] SQL을 공부하며

요즘... Query문을 작성하며 성능이 멍멍이 같이 나오는멍멍이같은 경험을 하고 있습니다. 하.. 멍멍... 그래서 SQL 관련 서적을 보며이리 저리 신기해하고 바꿔봐야겠다는 열정을 태우며 있는데,쿼리 튜닝에 대한 중요성에 대해서 조금씩 느끼게 되었습니다. 쿼리 튜닝의 경우 각각의 DBMS마다 특성이 있고,자체적으로 지원하는 쿼리들이 있기 때문에 SQL 서적만으로는없지않아 부족한 감을 느낄 수 있다는 사실을 알게되었습니다. 결론은 서적이 정석이겠지만, 구글링과 병행하며쿼리 고수가 되어보자는 것!

[삽잡이::DB] Index를 타라~

인덱스는 '색인'을 뜻합니다. (출처_ 네이버 백과사전) DB에서는 수 없이 많은 데이터속에서 빠르게 검색하기 위해 '인덱스'를 사용하게 됩니다.인덱스란, 원하는 데이터를 쉽게 찾을 수 있게 도와주는 녀석이라는 것입니다.제 주변에서는 흔히들 '인덱스를 타다'라고들 하더군요.. 오빠 차 뽑았다~ 널 데리러 가~ 아무튼, 우리가 만들어놓은 DB 테이블을 기반으로 인덱스를 생성할 수 있습니다. 모든 DBMS는 B*Tree 인덱스를 기본적으로 제공한다고 합니다.(출처_ dbguide.net) 나무를 뿌리부터 거꾸로 세워둔 형태의 구조입니다.어지럽겠다~~ 가지역할을 수행하는 Branch Block은 나무와 같이 분기를 목적으로 사용되고,가지에 달려있는 잎사귀와 같은 Leaf Block을 가리키는 포인터를 가지고 ..

[삽잡이::sql] CASE WHEN THEN WHEN THEN ELSE END !?

case 하시면 뭐가 떠오르시나요? 삽잡이는switch ~ case 문이 떠오르군요.... 예 그렇습니다.... 저는 컴공 출신 풋내기입니다... SQL에서도 case 문이 있습니다.뭐, 사실 if문도 있는 것 보면 그다지 이제 놀랄일도 없지요. 아무튼...개인적으로는 조건이 많이 들어가는 Query문은 성능상 좋지 않을 경우들이 많다고 생각하기에 조심스럽게 사용해야한다 생각하지만... 뭐 모두 case by case니깐요~ 그러면 한번 알아봅시다~ MySQL Reference Manual에는 이렇게 나와있습니다. (출처_ MySQL Reference Manual) 뭐,,, 그런데 하나 이상의 프로그래밍 언어를 다뤄보신 경험이 있다면 그렇게 어렵지 않게 느껴지실 것입니다. CASE 문을 통해 Query에..

[삽잡이::sql]count() 와 IF() 사용 주의사항! 이라 쓰고 삽질이라 읽는다

1SELECT IF(name = '삽잡이', 'Yes', 'No') AS result FROM people_finder;cs 이와 같은 Query문을 통해 각 레코드에 있는 컬럼(name)의 값이삽잡이일 경우 Yes를 그리고 아닐 경우 No를 나타낼 수 있습니다. 해당 Query문의 결과는 아마 이와 같이 출력될 것입니다. 역시 삽잡이는 유일무이하군요... 그런데 말입니다...만약, 삽잡이가 있는 레코드를 제외한 나머지 레코드들의 수를 계산해야할 필요성이 생겼습니다. 1SELECT IF(name = '삽잡이', COUNT(*), COUNT(*)-1) AS result FROM people_finder;cs 이와 같이 Query문을 작성했지요... 그런데... 삽잡이는 분명 있는데 말입니다.계속 거짓으로 ..

[삽잡이::sql] 테이블을 복사 그리고, Index의 중요성

똑같은 데이터를 가지고 테스트할 일이 있어서테이블을 복사하고자 시도했었습니다. (그냥 dump로 복사할껄...) 1CREATE TABLE NEW_테이블명 AS SELECT * FROM OLD_테이블명cs select 문 안에 들어있는 테이블의 데이터를 복사하여새로운 테이블에 붙여넣을 수 있습니다. 참고로 구조만 복사할 경우에는 LIKE 를 사용하시면 됩니다.이렇게요~! 1CREATE TABLE NEW_테이블명 LIKE OLD_테이블명cs 간단하지 않습니까? 뭐야 쉽네~ 별거 없네~ 그런데 이렇게 복사한 테이블을 사용하여테스트를 진행했을 때에는엄청난 혼란만 키웠을 뿐입니다. 예... 쿼리가... 너무 오랫동안 실행하고 있어서....찾아봤더니!!!! 기존에 Index를 탔었는데,이 복사한 Table에서는 I..

[삽잡이::sql] 내가 작성한 Query는 어떻게 실행되려나... EXPLAIN !

EXPLAIN is used to obtain a query execution plan (that is, an explanation of how MySQL would execute a query).(출처_ MySQL) EXPLAIN은 쿼리 실행에 대한 계획을 알고 싶을 때 사용합니다.우와 삽잡이~~ 영어좀 하는데~~~ 하하하... 혼자놀기... 어떻게 DB가 실행될지 즉, 어떻게 Data를 가져올지에 대한 실행 계획을 확인할 수 있다는 것입니다. MySQL에서는 쿼리 옵티마이저(Optimizer)를 통해 빠르고 효율적으로 수행할 Query를 만들기 위해 최적화 작업을 시행합니다.이에 잘 구조화 된 SQL Query를 작성하여 Query문 변경 없이 잘! 사용하면 DBMS의 내부 엔진에 있는 옵티마이저가 ..

#067_닷넷(.NET)_.Net Framework 기본 - LINQ 내부 표현 방식

안녕하세요 삽잡이입니다. 이번 시간에는 LINQ 내부 표현 방식에 대해서 알아보려고합니다. LINQ는 내부적으로 어떻게 동작하고 있는 것일까요? 사실 이와 같이 코드를 구현하게 되더라도,모두 컴파일러가 함수를 호출해주게 됩니다. 이처럼 자동으로 호출해주는 기능들 가운데서Func와 Action이라는 대리자에 대해서 알아보고자합니다. Func, Action 대리자는 모두 delegate입니다. 당연한 소리를...함수를 가리키고 함수처럼 동작하는 객체로써,함수를 호출하려고 사용하지요. 대리자를 범용적으로 사용하는 방법에는 두가지가 있습니다.Func는 return 타입을 갖고, 인수가 없는 놈부터 시작하여서 여러개인 놈들을 미리 만들어 놓습니다.그리고 Action은 return 타입이 void이며, 인수가 없는..

#066_닷넷(.NET)_.Net Framework 기본 - LINQ의 역할 (사용자 정의형)

안녕하세요 삽잡이입니다. 이번 시간에는 사용자 정의형에 대한 LINQ에 대해서 좀 알아보려고합니다. 사용자 정의 타입 또한 LINQ가 가능합니다.또한, where 즉, 조건 절에서 결과치가 bool 형식이라면 몇 개의 조건을 줘도 상관없습니다. 제네릭 컬렉션의 경우 모두 IEnumerable 형식을 상속받습니다.따라서, LINQ의 동작에 대해서 걱정할 것이 없습니다.하지만, 기본적으로 IEumerable 형식을 지원하는 LINQ에서비 제네릭 컬렉션의 경우 제네릭 이전에 나온 인터페이스로써 꼼수(?)를 써야 LINQ를 사용할 수 있게 됩니다. 그 꼼수는 바로 OfType() 이라는 호환 가능한 확장 메서드를 사용하는 것입니다. 내부적으로 ArrayList는 모두 다 저장할 수 있는 object 타입입니다...

#065_닷넷(.NET)_.Net Framework 기본 - LINQ의 역할 (기본형) 2

안녕하세요 삽잡이입니다. 이번 시간에는 LINQ 쿼리를 가지고 놀 때기본형식으로 가지고 노는 경우에 대해서 지난시간에 이어 설명해보려고합니다. LINQ에도 확장 메서드가 사용되고 있다는 사실을 아십니까?사실, 확장 메서드는 IEnumerable 형식의 인터페이스에 만들어져 있습니다. 따라서, LINQ를 동작시키는 모든 형식은 IEnumerable의 수 많은 기능을 사용할 수 있습니다.즉, IEnumerable를 구현한 녀석이라면 모두 다 확장 메서드를 사용할 수 있다 이겁니다. 어마어마하죠? 아무튼... LINQ는 두가지로 실행할 수 있다는 사실을 아십니까?바로, '즉시 실행'과 '지연 실행'입니다.즉시 실행의 경우 LINQ 쿼리를 때렸을 경우 '지금' 동작이 수행되는 것이고, 지연 실행은 LINQ 쿼리..