간단한 SQL 툴입니다.

 

하지만 어느정도 SQL을 사용할 수 있는 개발자가 되어야 쓸테니 SQL_ADVANCE로 프로그램명을 적었습니다.
용도는 개발자가 test/ibatis/c#용 쿼리를 만들때 시간을 단축하거나 insert 문 형태로 쿼리문 백업,
DB tool 이 없는 환경에서 간단한 작업용 입니다.

 

 아래의 스크린샷과 간단한 기능 설명을 참고 하여 사용 하시면 됩니다.
당연히 프리웨어 이며,다른 곳에 포스팅 하실때에는 출처 표시만 하면 됩니다.

 

It is a simple SQL tool.


However, I gave the name of the program to SQL_ADVANCE developers that use
SQL to some extent because write necessary.
reduce the time when the developers to
create a query of test / ibatis / c #, in an environment not query statement, backup,
and DB tool in the form of insert statements, applications, is a simple task.


It is referred to a simple function describes the screen shot below, please use.
Is a freeware of course.

 

 

SQL_ADVANCE.exe

 

 

Open connect String : load saved database server connect string (데이터 베이스 서버 연결 문자열을 불러옵니다.)
Open select SQL : load saved select query string  (이전에 저장한 select 쿼리를 불러옵니다.)
Open result SQL : load result query string (이전에 저장한 결과 표시부분의 쿼리를 불러옵니다.)
Save connect String : save database server connect string ( 데이터 베이스 연결 문자열을 저장합니다.)
Save connect String : save select query string
Save connect String : save result query string
Hide checkbox : Server connect string hide/show
select button : select query excute
connect Type : Connection type select (OLE/MSSQL)
Don't show grid checkbox : not drowing grid table. save drowing time.
ConvertSQLType : select query result to selected query type (insert/update/delete)
Convert Line : converted range
first - fist line only
select - first line selected (requirement grid table)
multi selected - multi selected (requirement grid table)
allrows - select query result all rows.
Last - last line only
convert button - select query result convert
excute button - result area querys excute

 

 

 

by Tomoya 2013.08.05 14:54

 시드노벨 + 디앤씨 게임즈 에서 My Egg - 시드 농장이야기라는 게임 어플을 만들었다.

게임 진행에 따라 보상 일러스트를 주는데..

 

게임이 단순히 알 놓고 물 뿌리고 15분정도 기다렸다 알깨는게 다다..한마디로

그냥 재미는 갖다 버리고 생 노가다만 있는 게임..

 

그것도 안드로이드에서 알까는데 걸리는 시간은 아이폰에서의 1.5~2배..

일러스트만 보려고 해도 한 시리즈의 일러스트를 다 보려면 알을 까서 1캐릭 나오는데 해당 시리즈 캐릭

50번을 보고 경험치를 모아야 마지막 3번째 CG가 열리는 방식이라..몇일이 걸릴지 모르는 식..-_-;;

 

 그래서 아이폰 파일 조금 손봐서 일러스트 공개..

게임을 해보려면 아래 링크로..

오마케(omake - 클리어 데이터) 파일은 아이폰용..

(적용하려면 ifunbox 설치후 My Egg - Documents 에 덮어쓰면 된다.

현 1.02 버전에서는 잘 되지만 막거나 변경할지도?)


omake.zip


아이폰 링크

https://itunes.apple.com/app/my-egg/id626102565

 

안드로이드 링크

https://play.google.com/store/apps/details?id=com.dncgames.myegg

 

p.s 아빠하고 나하고 yo 은근히 볼만하다..개그 + 4차원 + 훈훈함..그럭저럭 잘 맞는 조합인가..

p.s2 일러스트는 맘에 들지만..2/3를 사다 본 입장에선 봤던 일러스트 우려먹기 느낌이 강하다만..

폰 배경화면으로 쓸수 있다는 점에서는 괜찮은가.. 

p.s3 일러스트를 올릴까 말까하다 역시 걸리는 건 저작권 문제..보고 싶으시면 아이폰용 오마케 파일 설치해서 보거나 

댓글로 메일신청.. 단지 책으로 사서 봤다면 대부분 한번쯤은 봤다 싶을듯..

 

p.s4 2013-06-10 현재 아이폰 버전 1.0.5 버전용으로 omake2 추가

 

omake2.zip


by Tomoya 2013.05.20 09:57

 

2

 

 

 

 

 

 

 

 

 

 

 

 

'취미 > 일본' 카테고리의 다른 글

2012_0413_0415_osaka_part2  (0) 2012.04.15
2012_0413_0415_osaka_part1  (0) 2012.04.15
by Tomoya 2012.04.15 19:57

 

 

 

 

 

 

 

여ㅎ

_

 

_

 

 

 

 

 

 

'취미 > 일본' 카테고리의 다른 글

2012_0413_0415_osaka_part2  (0) 2012.04.15
2012_0413_0415_osaka_part1  (0) 2012.04.15
by Tomoya 2012.04.15 19:54

http://snoopybox.co.kr/1515

제일 나은듯,.
by Tomoya 2012.01.25 14:32

C# 로 AES 알고리즘 함수 암.복호화 작성후
CLR 로 덮어 씌워 DB에서 실행.

데이터베이스 권한 수준 안전에서도 잘 돌아간다.

AES 알고리즘 부분은 구글에서 검색시 여러가지 방법으로 구현한 것들이 많고(ex: http://bullpeng.tistory.com/61)
.net framework 3.5 이상버전(VS2008이상)에서 System.Security.Cryptography 에 라이브러리가 잘 정의되어 있다.

CLR 사용해서 키를 정해두고 중요개인정보는 암호화해서 저장해두면 웹서버/디비서버 다 털지 않는한 DB만 가져가선 볼 수 없다.
by Tomoya 2011.12.08 17:00

참 오랜만에 글 쓰는듯..
7월엔 놀고 8월엔 공부하고,9월엔 공부하면서 "슬슬 결과물을 하나는 내보자." 생각하면서 추석뒤에 1차로 뽑아낸 결과물입니다.

아직 초기 테스트 버전이기에 정말 심플합니다.

기능중 일부만 소개 할 것 이기에 2가지만 넣었습니다.

*이 프로그램을 테스트하기 위해선 MS SQL SERVER 2005 EXPRESS 버전 이상이 필요합니다.
필자의 개발환경및 테스트 환경은 SQL SERVER 2008 R2 EXPRESS 32bit(winxp)/64bit(win7) 이었습니다.

먼저 이 부분은 CLR 설정 부분입니다.
*CLR을 활성화 하신분이면 넘어가셔도 됩니다.
*따로 적거나 하지 않으셔도 아래 첨부된 sql 파일에 주석까지 다 달려 있으니 그대로 해보시면 됩니다.

--CLR을 활성화 하는 설정입니다.
SP_CONFIGURE 'CLR ENABLED',1
RECONFIGURE WITH OVERRIDE
GO

--CLR을 활성화 합니다.
SP_CONFIGURE
GO

 아랫 부분은 프로그램 등록 및 테스트 입니다.
*편의상 C드라이브 루트 밑에 위치시켰고 편한쪽에 위치 시키시면 됩니다.

 --현재 DB에 어셈블리로 등록합니다.
CREATE ASSEMBLY ASM_GetDBSystemInfo FROM 'C:\GetDBSystemInfo.dll'
WITH PERMISSION_SET = UNSAFE
go

--등록된 어셈블리중 시스템정보표시 프로시저(현재하드디스크용량만 표시)를 등록합니다
CREATE PROC usp_clr_GetSysInfo
AS EXTERNAL NAME ASM_GetDBSystemInfo.StoredProcedures.usp_clr_GetSysInfo
GO

--등록된 시스템정보 표시 프로시저를 호출합니다.(테스트)
EXEC usp_clr_GetSysInfo
GO

--DB 시스템에 커맨드 명령을 날리고 결과를 반환하는 테이블 반환 함수를 지정합니다.
CREATE FUNCTION usp_command(@input NVARCHAR(512))
RETURNS TABLE
(cammand_Result NVARCHAR(512))
AS
EXTERNAL NAME ASM_GetDBSystemInfo.StoredProcedures.usp_command
GO

--DB 시스템에 커맨드 명령을 날려 IP정보를 확인 합니다.
SELECT * FROM usp_command('ipconfig /all');

간단하죠?
이제 usp_command('커맨드') 를 이용해서 간단히 DB시스템을 확인하고 제어 할수 있게 되었습니다.
작성 하실때 CREATE FUNCTION usp_command 부분에서 이름을 다르게 정하시면 그 이름으로도 사용 가능합니다.
또한 매니지먼트 스튜디오에서 DB->프로그래밍기능->어셈블리/함수 쪽에서 유저권한같은 세밀한 설정도 가능합니다.


* 이 프로그램은 프리웨어이며 상업적 이용도 가능합니다. 단 컨텐츠 무단 변경/재배포는 불가능 합니다.
또한 이 프로그램을 사용함으로서 발생 할 수 있는 문제에 대해서 책임지지 않습니다.

10.5일 추가사항.
현재 dll파일이 인증서 없이 제작 되어 있어 SYSADMIN 관리자 권한하에 TRUSTWORTHY ON 설정이
어셈블리 등록전에 필요합니다.
ALTER DATABASE ASNS SET TRUSTWORTHY ON;
를 사용하면 사용가능합니다.(인증서는 향후 추가 해보겠습니다)

by Tomoya 2011.09.23 13:45
고객사 A쪽에 업데이트 시
하위고객사 몇십군데에서 업데이트 되도록 되어있다.
문제는 하위고객사에서 톰캣 설정을 어떻게 했는지 확신 하지 못한다는 점,..
함부로 바궜다간 되는데서 안된다고 연락 올수 도 있다.

그래서 검색 해보니 http://ihoney.pe.kr/432 이런 글이 있었다.
생각해보니 디버깅용으로 보여주는 부분을 컴퓨터가 이해하게만 하면 되는게 아닌가?

약간의 오버헤드는 있지만 검색어를 인코딩 검사하는 정도야 40명이하의 유저의 상황에선
무시 할수 있는 부하라고 생각 되어 약간 고쳐 넣었다. 

String tmpSearchText = (String)request.getParameter("SearchText")    != null ? request.getParameter("SearchText").trim()        : "";
 
 String SearchText = "";
 boolean notfind = true;
 if ( tmpSearchText != null && !tmpSearchText.equals("")) {
     String charset[] = {"euc-kr", "ksc5601", "iso-8859-1", "8859_1", "ascii","utf-8"};
   
     for(int k=0; k<charset.length ; k++){
            for(int l=0 ; l<charset.length ; l++){
                if(k==l){//변환전 인코딩과 변환후 인코딩이 동일할 때
                    continue;
                }
                else if(!notfind)//인코딩을 찾았을때
                {
                 break;
                }
                else//대상 인코딩과 현재인코딩이 다를 경우 테스트
                {
                    if(new String(request.getParameter("enc_test_text").trim().getBytes(charset[k]),charset[l]).equals("테스트A1"))
                    {
                     //System.out.println(charset[k]+" : "+charset[l]+" : "+ //인코딩 확인용 디버깅 코드
                       //new String(tmpSearchText.getBytes(charset[k]),charset[l]) + " " +
                       //new String(request.getParameter("enc_test_text").trim().getBytes(charset[k]),charset[l]));
                   SearchText = new String(tmpSearchText.getBytes(charset[k]),charset[l]);//지정된 인코딩으로 설정
                   notfind = false;//인코딩 Find로 설정
                   break;
                    }
                }
            }
        }
    }
 
 if(notfind) SearchText = tmpSearchText;//인코딩을 찾을수 없었을 땐 기본 인코딩으로 설정//변환전 인코딩과 변환후 인코딩이 동일할 때
by Tomoya 2011.06.13 14:49

TB_A 의 데이터는 약 500만건
조건 테스트시 사용한 대상 건수는 10만건~60만건 이었습니다.
테스트 DB 용량은 5GB입니다.
대상 DB는 SQL2005 STD SP4 입니다.

결과는 보시다시피 RANK사용시는 미세한 차이를 보이고
ROW_NUMBER 사용시는 10배 가얀 차이를 보입니다.
가장 최근 결과가 필요하기에 ID DESC를 넣어야 했기에
ID ASC 시 ROW_NUMBER가 효율이 좋지만
RANK로 처리했습니다.
또한 현재는 rank_num을 매김에도 불구하고 bottom 값을 추가로 가져올 방법이 적당히 안보여
카운트를 추가로 처리하고 있습니다.(실제 카운트를 넣어도 0.1초 정도만 추가되는걸 확인 했습니다만..)
상황에 따라 행 번호가 필요한 부분 에서는 rank_num 매기는 서브쿼리 부분을 테이블 x로 처리해서
rank_num을 넘겨 처리하고 있습니다.

기본 쿼리 형태

select 데이터
FROM TB_A  a, tb_B b
where a.id in (
 select a.id from
  (select a.ID,ROW_NUMBER() OVER (ORDER BY a.ID) as rowsnum
   FROM TB_A a
   where 검색조건 ) a
 where a.rowsnum between 10 and 20)
 and 테이블조인조건

위의 상태에서 정렬 방법 변경 테스트

1번 ROW_NUMBER() OVER (ORDER BY a.ID)

(11개 행이 영향을 받음)
테이블 'TB_B'. 검색 수 0, 논리적 읽기 수 22, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
테이블 'TB_A'. 검색 수 1, 논리적 읽기 수 14829, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.

(12개 행이 영향을 받음)

SQL Server 실행 시간:
   CPU 시간 = 422ms, 경과 시간 = 435ms.

2번 ROW_NUMBER() OVER (ORDER BY a.ID DESC)

(11개 행이 영향을 받음)
테이블 'TB_B'. 검색 수 0, 논리적 읽기 수 22, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
테이블 'TB_A'. 검색 수 1, 논리적 읽기 수 143214, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.

(12개 행이 영향을 받음)

SQL Server 실행 시간:
   CPU 시간 = 5219ms, 경과 시간 = 5209ms.

3번 RANK() OVER (ORDER BY a.ID)

(11개 행이 영향을 받음)
테이블 'TB_B'. 검색 수 1, 논리적 읽기 수 2, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
테이블 'TB_A'. 검색 수 5, 논리적 읽기 수 3091, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
테이블 'Worktable'. 검색 수 0, 논리적 읽기 수 0, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
테이블 'Worktable'. 검색 수 0, 논리적 읽기 수 0, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.

(16개 행이 영향을 받음)

SQL Server 실행 시간:
   CPU 시간 = 1281ms, 경과 시간 = 819ms.

4번 RANK() OVER (ORDER BY a.ID DESC)

(11개 행이 영향을 받음)
테이블 'TB_B'. 검색 수 1, 논리적 읽기 수 2, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
테이블 'TB_A'. 검색 수 5, 논리적 읽기 수 3091, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
테이블 'Worktable'. 검색 수 0, 논리적 읽기 수 0, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
테이블 'Worktable'. 검색 수 0, 논리적 읽기 수 0, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.

(16개 행이 영향을 받음)

SQL Server 실행 시간:
   CPU 시간 = 1343ms, 경과 시간 = 848ms.

현재 사용 쿼리

SELECT 데이터,전체카운트  
FROM tb_A a (NOLOCK) LEFT OUTER JOIN tb_E e (NOLOCK) on (a.E_id = e.E_id ) 
,tb_C c (NOLOCK)  ,tb_B b (NOLOCK),tb_D d (NOLOCK) ,
( SELECT count(*) as cnt   FROM TB_A
WHERE 조건) y 
WHERE a.id in (
 SELECT x.id
 FROM  (
  SELECT ID,RANK() OVER (ORDER BY ID DESC) as rank_num 
  FROM TB_A
  WHERE 조건
 ) x 
 WHERE x.rank_num BETWEEN (20*0)+1 AND (20*1) -- 페이징 부분

AND 조인조건
ORDER BY a.id DESC

트위터 @ 성대중(SQL SERVER MVP) 님의 조언을 받아 TOP TOP 방식으로 변경해 보았다.

변경 쿼리

SELECT 데이터

FROM 대상테이블s , 대상카운트 ,

(SELECT TOP 표시수 x.id

         FROM  (

                  SELECT TOP 표시수*(페이지번호+1) ID 

                  FROM 대상테이블

                  WHERE 조건

                  ORDER BY ID DESC

         ) x  ORDER BY ID) z

WHERE a.id = z.id

AND 조인조건

ORDER BY a.id DESC

비용 비교
RANK
CPU 시간 = 63ms, 경과 시간 = 76ms.
CPU 시간 = 63ms, 경과 시간 = 76ms.
CPU 시간 = 62ms, 경과 시간 = 76ms.

CPU 시간 = 672ms, 경과 시간 = 500ms.
CPU 시간 = 703ms, 경과 시간 = 457ms.
CPU 시간 = 751ms, 경과 시간 = 477ms.

TOP TOP
CPU 시간 = 15ms, 경과 시간 = 19ms.
CPU 시간 = 15ms, 경과 시간 = 18ms
CPU 시간 = 16ms, 경과 시간 = 17ms.


CPU 시간 = 297ms, 경과 시간 = 475ms.
CPU 시간 = 375ms, 경과 시간 = 468ms.
CPU 시간 = 343ms, 경과 시간 = 486ms.

 ..서브트리 코스트에선 36대 0.8로 1/50로 줄어 든것을 확인 했는데..10만건 테스트 시 시피유,I/O 타임이 생각보다 줄지 않았다.
왜 일까..한번 고민해봐야 할듯..그리고 대상건을 30만건으로 늘려 비교시엔 타임이 오히려 RANK가 더 좋게
나오는 현상도 원인을 찾아 봐야 할듯..

by Tomoya 2011.06.08 09:44
회사에서 제작하다 좀 안 맞는 부분이 있어 버려진 프로그램..
항상 켜져 있어야 되는 프로그램이 있을 경우 사용 하면 된다.
항상 죽이고 싶은 프로세스가 있다면 die로 두고 꺼도 좋지만..그런 경우 있으려나..;
작업 추가로 등록하고 해당 작업 명 더블클릭시 수정/삭제 가능

작업추가로 등록하고 윈도우 시작시 감시 프로그램을 자동으로 시작하게 하고 싶으면 서비스 등록해두고
서비스 삭제하면 윈도우즈 시작시 자동 실행하지 않는다.

종료시 트레이에서 우클릭 종료해야 꺼짐.(전체화면에서 종료 버튼 누를시 트레이 최소화)

DB체크 기능이나 이상시 이메일 발송기능은 제외 되었음.
이이콘은 5분도 안들여 직접 만들었기에..보기 싫음..
(따로 만들어서 원하시는 분 있으면 넣어 드릴수도..)

프리웨어로 누구나 사용가능합니다.



by Tomoya 2011.06.07 09:06
| 1 2 3 4 5 ··· 9 |