Maystyle :
Admin : New post
Guestbook
Local
media
Catergories
Recent Articles
Recent Comments
Recent Trackbacks
Calendar
Tag
Archive
Link
Search
 
해당되는 게시물 520건
  MS SQL Server 쿼리 최적화기 (Optimization) 
작성일시 : 2008. 3. 31. 21:32 | 분류 : SQL Server/Administration

MS SQL 튜닝 하기
1. MS SQL Server 쿼리 최적화 하기

쿼리 처리 과정
Parsing > Standardization > Optimization > Compilation > Execute

Optimization
통계 및 조각 정보를 바탕으로 실행 계획 작성, 통계를 바탕으로 처리된다.
쿼리 분석 > 인덱스 선택 > 조인 처리

Plan Caching (Compilation 시 발생됨)
Ad-hoc 쿼리의 경우 모두 쿼리 처리의 5단계를 수행하여 처리된다. Ad-hoc 쿼리가 캐시에 저장되는 경우는 컴파일 단계까지의 비용이 캐시에 저장하는 것보다 클때 뿐이다. (7.0 까지는 캐싱 자체를 않했다.)
또한 매게 변수까지 정확하게 같아야만 캐싱된 쿼리를 수행할 수 있다.
하지만 저장 프로시저의 경우 항상 플랜을 사용하도록 강제화 된다. 단 실행 시 해당 저장 프로시저의 소유자 및 스키마 명을 명시하여 실행시키는 것이 혹시 발생 할 지 모르는 스키마 락을 예방시켜준다.

use master
go
select bucketid, cacheobjtype,refcounts, usecounts, setopts, sql
        from syscacheobjects order by sql

refcounts : 참조된 횟수
usecounts : 사용된 횟수
동일 쿼리에 setopts 가 다르게 나타난 경우 : 옵션이 다르게 설정된 채 쿼리가 호출됨
다음 구문은 저장 프로시저 생성 시 지정해 주는 것이 좋다.
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON

자동 재 컴파일
- 실행 계획이 캐쉬에 없을 경우
- 인덱스가 변경된 경우
- 데이터가 변경된 경우
* 매개 변수의 경우 auto-parameterization 을 통해 캐싱이 된다. 단 매개 변수 값이 급격하게 변하는 경우 최초 재공된 매개 변수의 플랜이 의미가 없을 경우가 있다. 이경우에는 "with recompile" 옵션을 통해 재 컴파일을 실행 한다. (단 일회성으로 캐싱된다.)
* DBCC FREEPROCCACHE 를 통해 모든 프로시저 캐쉬를 제거 할 수 있다.

동적 쿼리가 저주인 이유
저장 프로시저를 동적 쿼리를 통해 작성 하는 경우 매개 변수에 대한 auto-parameterization이 이루어 지지 않고, 일반 Ad-hoc 쿼리와 같이 파라메터의 약간의 변화에도 재 컴파일이 되게 된다. 이 경우에는 굳이 파라메터를 넘겨야 하는 경우 sp_executesql를 사용하도록 하자.

참고 :
SQL Server 2000/2005 튜닝 (정원혁, 손광수 공저)
동적 SQL의 축복과 저주 (Erland Sommarskog)

|
  GUID SID 값 확인 하기 
작성일시 : 2008. 3. 28. 13:15 | 분류 : Windows Server/Active Directory

GUID 와 SID 는 특정 Object에 대한 구분을 위해 Windows  내부에서 사용하는 ID 입니다.
GUID의 경우 객체에 할당이 되면 절대 변하지 않지만 SID의 경우 포레스트 에서 도메인간 이동이 있을때 변경이 있을 수 있습니다.
Windows 에서 SID를 사용하는 이유는 NT4와의 호환성 때문입니다.

[Name Format]

Constant

Value

Description

ADS_NAME_TYPE_1779

1

Name format as specified in RFC 1779. For example, "CN=Jeff Smith,CN=users,DC=Fabrikam,DC=com".

ADS_NAME_TYPE_CANONICAL

2

Canonical name format. For example, Fabrikam.com/Users/Jeff Smith".

ADS_NAME_TYPE_NT4

3

Account name format used in Windows NT 4.0. For example, "Fabrikam\JeffSmith".

ADS_NAME_TYPE_DISPLAY

4

Display name format. For example, "Jeff Smith".

ADS_NAME_TYPE_DOMAIN_SIMPLE

5

Simple domain name format. For example, "JeffSmith@Fabrikam.com".

ADS_NAME_TYPE_ENTERPRISE_SIMPLE

6

Simple enterprise name format. For example, "JeffSmith@Fabrikam.com".

ADS_NAME_TYPE_GUID

7

Global Unique Identifier format. For example, "{95ee9fff-3436-11d1-b2b0-d15ae3ac8436}".

ADS_NAME_TYPE_USER_PRINCIPAL_NAME

9

User principal name format. For example, "JeffSmith@Fabrikam.com".

ADS_NAME_TYPE_CANONICAL_EX

10

Extended canonical name format. For example, "Fabrikam.com/Users Jeff Smith".

ADS_NAME_TYPE_SERVICE_PRINCIPAL_NAME

11

Service principal name format. For example, "www/www.fabrikam.com@fabrikam.com".

[GUID 값 확인 하기]
위의 Name Format 을 알고 있으면 쉽게 사용자의 GUID를 알 수 있습니다.

Const ADS_NAME_INITTYPE_GC = 3
Const ADS_NAME_TYPE_NT4 = 3
Const ADS_NAME_TYPE_GUID = 7

strUserName = "mskim\administrator"

Set objTranslator = CreateObject("NameTranslate")

objTranslator.Init ADS_NAME_INITTYPE_GC, ""
objTranslator.Set ADS_NAME_TYPE_NT4, strUserName

strUserGUID = objTranslator.Get(ADS_NAME_TYPE_GUID)

Wscript.Echo strUserGUID

[SID 값 확인 하기]

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set objAccount = objWMIService.Get _
    ("Win32_UserAccount.Name='administrator',Domain='mskim'")
Wscript.Echo objAccount.SID

[참고]

http://www.microsoft.com/technet/scriptcenter/resources/qanda/dec04/hey1203.mspx
http://www.microsoft.com/technet/scriptcenter/resources/qanda/aug07/hey0822.mspx
http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/distrib/dsce_ctl_yicc.mspx?mfr=true

|
  게시자의 트렌젝션 로그가 삭제 되지 않을때 
작성일시 : 2008. 3. 26. 17:17 | 분류 : SQL Server/Administration

이 경우 게시자의 트렌젝션을 구독자가 받지 않았기 때문에 모든 트렌젝션은 활성이 됩니다.
물론 앞의 아티클과 같이 게시를 제거하는 방법도 있겠지만, 모든 트렌젝션을 게시한것처럼 업데이트 할 수 있습니다.
이때 사용되는 구문이 sp_repldone 입니다.
자 모든 트랜젝션이 모두 배포자에게 배포 되었다라고 하기 위해서는 아래의 구문을 사용합니다.

EXEC sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0, @time = 0, @reset = 1
자 모든 트렌젝션을 배포됐다고 선언 했습니다.
이후에 트렌젝션을 백업 받고 잘라내면 됩니다...^^

[기타]

활성화된 트렌젝션은 dbcc opentran( ) 를 통해 확인 할 수 있습니다.

[sp_repldone 옵션 설명]

[ @xactid=] xactid
서버에서 마지막으로 배포된 트랜잭션에 대한 첫 번째 레코드의 LSN(로그 시퀀스 번호)입니다. xactidbinary(10)이며 기본값은 없습니다.
[ @xact_seqno=] xact_seqno
서버에서 마지막으로 배포된 트랜잭션에 대한 마지막 레코드의 LSN입니다. xact_seqnobinary(10)이며 기본값은 없습니다.
[ @numtrans=] numtrans
배포된 트랜잭션 수입니다. numtransint이며 기본값은 없습니다.
[ @time=] time
트랜잭션의 마지막 일괄 처리를 배포하는 데 필요한 시간(밀리초)입니다. timeint이며 기본값은 없습니다.
[ @reset=] reset
다시 설정 상태입니다. resetint이며 기본값은 없습니다. 1인 경우 로그 내의 복제된 모든 트랜잭션이 배포됨으로 표시됩니다. 0인 경우 트랜잭션 로그가 첫 번째 복제된 트랜잭션으로 다시 설정되고 복제된 트랜잭션이 배포됨으로 표시되지 않습니다. resetxactidxact_seqno가 모두 NULL인 경우에만 유효합니다.

[참고]
http://technet.microsoft.com/ko-kr/library/ms173775.aspx

|
  SQL 2000 / 2005 Replication 수동 삭제 방법 
작성일시 : 2008. 3. 26. 16:26 | 분류 : SQL Server/Administration

Replication 의 수동 삭제는 다음의 순서에 따라 이루어 져야 한다.
구독자 > 게시자 > 배포자

[게시자 삭제 방법]

스냅샷 게시자 삭제 (sp_droppublication)
You can use the sp_droppublication system stored procedure to drop a publication and the articles that are associated with the publication. You must run the stored procedure at Publisher on the publication database.
- 예
USE <Publication database name>
GO
EXEC sp_droppublication @publication = N'<Publication name>'
USE master
GO
exec sp_replicationdboption @dbname = N'<Publication database name>', @optname = N'publish', @value = N'false'

트렌젝션 로그 게시자 삭제 (sp_dropmergepublication)
You can use the sp_dropmergepublication system stored procedure to drop a merge publication and the Snapshot Agent that is associated with the merge publication. The articles that are associated with the publication are also dropped. You must run the stored procedure at Publisher on the publication database.
- 예
USE <Publication database name>
GO
EXEC sp_droppublication @publication = N'<Publication name>'
USE master
GO
EXEC sp_replicationdboption @dbname = N'<Publication database name>', @optname = N'publish', @value = N'false'

머지 게시자 삭제 (sp_replicationdboption)
You can use the sp_replicationdboption system stored procedure to set a replication database option for the current database. You must run the stored procedure at the Publisher server.
- 예
USE <Publication database name>
GO
EXEC sp_dropmergepublication @publication = N'<Publication name>'
USE master
GO
EXEC sp_replicationdboption @dbname = N'<Publication database name>', @optname = N'merge publish', @value = N'false'

구독자 / 배포자 삭제 는 다음 문서를 참고한다.
http://support.microsoft.com/kb/324401

|
  PK가 설정된 테이블 두개를 한테이블로 데이터 이전 
작성일시 : 2008. 3. 25. 22:36 | 분류 : SQL Server/Administration

[Action Plan]

DB01.test 테이블의 데이터와 DB02.test 테이블의 데이터를 DB03.test 테이블로 Migration 쿼리 작성
단 이때 seq (Primary Key)를 변환 하여 중복을 피해준다.
본 예제 에서는 DB02.test.seq 칼럼에 1000을 더하여 Primary Key 중복을 피하도록 하겠다.

[DB 및 Table 구조]

[입력 데이터]

seq 가 PK로 겹치기 때문에 단순 입력은 불가능하다.

[실행 쿼리]

일단 db01.dbo.test01의 데이터는 그대로 입력해 주고, db02.dbo.test01의 데이터는 pk 제약 조건을 해결 하기 위해여 커서를 사용했다.
해당 쿼리에서는 커서를 통해 해당 seq에 1000을 더하여 데이터의 중복의 회피 하였다.

begin tran 

    insert db03.dbo.test01 -- 먼저 db01의 데이터를 db03에 넣는다.
        select seq, inputText from db01.dbo.test01

    declare @seqNum int, @inputTextV nvarchar(1000) -- db02의 데이터를 입력할 때 사용할 변수를 선언

    declare seqCursor scroll cursor -- 커서를 선언
    for
        select * from db02.dbo.test01
    for read only

    open seqCursor

    while @@fetch_status = 0
    begin
        fetch from seqCursor into @seqNum, @inputTextV -- 한라인씩 읽어서 변수에 할당
        select @seqNum = @seqNum + 1000

        if @seqNum > 2000 -- 마지막 라인의 경우 항상 2번 출력됨므로 해당 출력을 막기 위해 설정한 구문
            break

        insert db03.dbo.test01
            values (@seqNum, @inputTextV)
    end

    close seqCursor
    deallocate seqCursor

commit tran

[기타...]
그리고 쉽게 하는 방법도 있습니다.
역시 전 쿼리에 약하나 봅니다...
하긴 첨 짜보는 쿼리니깐...;;;
최석준님 감사합니다...^^

begin tran

       insert db03.dbo.test01

       select seq, inputText from db01.dbo.test01

       union all

       select seq+1000,inputText from db02.dbo.test01

commit tran

|
  MS SQL Express 버전에서 Standard / Enterprise 로 업그레이드 하기 
작성일시 : 2008. 3. 25. 00:41 | 분류 : SQL Server/Administration

MS SQL 의 Express 버젼은 무료라는 장점이 있긴 하지만 4G의 DB 파일 한계가 있죠... 그래서 보통 데이터가 증가하면 SQL Server를 구입하게 되는데... 이때 버전 업을 해야하는 경우가 있습니다.
가장 간단한 방법은 해당 SQL 설치 파일이 있는 폴더로 이동하여 "setup.exe skuupgrade=1"을 타이핑하여 setup을 실행시키는 것 입니다.

다만 이때 클라이언트 구성 요소는 직접 설치하는 것이 여러 모로 효율 적인거 같습니다.
왜냐구요? Express에서는 SSIS 같은 도구는 설치가 되지 않았기 때문이죠...^^

그리고 중요한 한 가지!
"SELECT @@version" 을 통한 버전 확인이 중요합니다...^^

참고 : http://www.toddklindt.com/blog/Lists/Posts/Post.aspx?ID=55

|
  2007년 7월 26일 내 생각 
작성일시 : 2008. 3. 25. 00:18 | 분류 : Life Note/엔지니어 이야기

우연히 옛날 포스트를 뒤지다가 그리 오래지 않은 2007년 7월에 제가 쓴 글을 보게 됐습니다.
2007년의 제 모습을 보면 현재의 제가 너무 창피해 집니다.

다시 마음 가다듬고, '작심삼일'이 될지라도... 새롭게 시작해 보렵니다...^^
"내 꿈이 시작되는 작은 공간"... 이곳에서요...^^ 

---- 이하는 2007년에 제가 쓴 글 ----

제 사무실을 공개해 봅니다...ㅋ
제가 하루 중 대부분(??)을 보내는 내 책상입니다...
그리고 경쟁 시장 국내 1위 IT 업체 사무실이 왜 그렇냐고 말하실 분이 있을지도... (R&D 및 상암쪽은 무지 좋아요... 저희팀은 본사에 위치하고 또 오래되다 보니... 같은 팀에두 좋은 책상이랑 서랍 쓰는분 많아요... 전 짬이 않되서리..ㅋ)
첨엔... 너무 서럽이나 그런것들이 오래되 보여 실망하긴 했지만... 내게 가장 소중한 공간입니다...
점 어지럽지만...ㅋ

사용자 삽입 이미지

사용자 삽입 이미지

첨엔 참 공허한 공간이였는데...
이젠 덕지 덕지 포스트 잇이 없이는 기억력 만으론 제 업무 지시내용을 기억하지도 못할 만큼 어지러운 공간이 되어 버렸습니다...^^
그래두 너무 좋아요...
추가로 제가 사용하는 서버를 공개합니다. DL380 G5 입니다...ㅋ CPU 듀얼코어 2개... 메모리 8Gㅋㅋㅋ 팀장님한테 한번 졸라봤더니... 쉽게 나온 한마디..."사라~~~" 본서버를 사기까지 고생해주신 조현정 대리님 감사합니다...^__________________^v

사용자 삽입 이미지

비싼 내 장난감...^__________^v 녀석 너무 귀여워

어제 유원형 대리님이랑 애기를 하는데...
물어보더군요... "넌 뭐하고 싶냐고..."
단기적으로는 우리 팀 엔지니어들에게는 시원하게 구멍 뽕뽕 난 의자 (목까지 받쳐짐) 을 주구요.
또 각자 서버 한대씩 제공 및 노트북 한대 모니터는 2개 제공
한달에 맘껏 쓸수 있는 30만원 한도의 카드 (책같은거 사보라구요...^^)
그리고 너무 즐거운 사무실을 추진하는 겁니다.
장기적으로는 우리같은 기술쟁이들이 멸시 받는 환경을 넘어서는 것이고
더 장기적으로는 사장님이 되보고 싶습니다.
지금은 대인관계가 어리숙 하지만 그때 더 좋아지겠죠...
그리고 마지막으론 돈 많이 많이 벌어서 영아원을 차리는 겁니다.
아프고 힘든 애들과 함께 마지막 여생을 보내고 싶어요... (초등학교때 제 꿈)...
그리고 그 꿈이 시작되는 작은 공간입니다...
어찌 아름답지 않을 수 있겠습니까....^^
자 내일도 화이팅!

|
  왜 10 byte씩 할당하니깐 메모리를 다 못쓰나요? 
작성일시 : 2008. 3. 20. 12:49 | 분류 : Windows Server/Kernel

질문

Windows2003 32bit 버전에서 메모리를 할당시 10byte씩 메모리를 채우면 600~700메가에서 더 이상 할당이 안됩니다.
1Kbyte 씩 채우면 2G까지 할당된다고 하네요~ 혹시 이유를 알고 계신가요?
현재 상기의 이유 때문에 게임서버를 64bit로 업그래이드 하려 한다는데, 업그래이드를 해도 이유를 알고 업그래이드를 하는게 맞는 순서인듯 하여 메일드립니다.~

작은 이유라도 혹시 알고 있다면 혹은 모르더라도 메일 부탁드려요.

답변

최대 PTE 크기는 660M = 660000KB = 660000000Byte 입니다.
10 byte 크기로 Memory Addressing을 한다면 이론적으로는 2G의 공간 표현을 위하여 200M * 4개의 PTE 객체가 필요합니다.  (1개의 PTE 객체는 32bit 즉 4byte의 공간을 사용함) 그러면 총 800M개가 되어 해당 최대 PTE 크기를 초과하게 됩니다.
(커널 이나 다른 객체가 사용하는 것 까지 생각하면 600M 수준으로 어드레싱이 되는게 맞는 것 같습니다.)
하지만 1K Byte로 잡게되면 해당 크기가 80M가 됨으로 PTE 크기를 넘지 않아 어드레싱이 가능합니다.

이 PTE의 사이즈는 부팅시 레지스트리의 데이터를 조사해서 설정합니다...^^

참조 : http://support.microsoft.com/kb/294418/ko

|
 Prev   1   ···   30   31   32   33   34   35   36   ···   65   Next