달력

1

« 2025/1 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31


제목 : SQL Server 2000/2005 튜닝 (전문가로 가는 지름길 3)
저자 : 정원혁, 손광수

1장 왜? - 튜닝의 목적
 Monitor를 하고, Baseline을 확보해라
 APP tune > Database tune > SQL Server tune > Windows Server tune > H/W tune
 성능목표를 구체적으로 수치적으로 설정한다.

2장 튜닝을 위한 도구
 1. 프로필러 : 기본. read80trace로 report
 2. 기타 모니터 및 튜닝 도구  : ?
 3. 이벤트 뷰어 :
 4. 성능 모니터 : perfmon
 5. 쿼리 분석기 : Explain plan, Set Statistics IO
 6. 엔터프라이즈 관리자
 7. T-SQL  :
  sp_who, sp_who2, sp_lock, sp_block, sp_monitor, sp_spaceused, sp_statistics, sp_help
  @@spid, @@cpu_busy, @@connections, @@error, @@procid
  set statistics io, set statistics time, set showplan_text, set showplan_all, set statistics profile
  DBCC - help, traceon/traceoff/tracestatus, sqlperf(logspace/iostats/lrustats/netstats)
   , opentran, checkdb, inputbuffer/outputbuffer, proccashe, showcontig, show_statistics
   , useroptions, dllname(free), indexdefrag, pintable/unpintable, dropcleanbuffers, freeproccache
  추적플래그 - 3604/3605, 1204, 2528, 3205
  SQLDIAG
 8. 스트레스 테스트 도구
  로드 시뮬레이터, sql과 batch 명령, OSTRESS

3장 물리적 데이터베이스 아키텍처
 1. SQL Server 아키텍처
 2. 데이터베이스 옵션과 성능
  보통 1/5 정도 변경될 즈음에 자동 통계 갱신이 발생한다. -> 정말??
  정말 auto create statistics, auto update statistics 를 과연 활성화 해야 하는가?  
 3. 가상 로그 파일 최소화
  VLF(virtual log file) 개수를 작게, 크기를 크게 생성.
 4. 익스텐트 할당 및 빈 공간관리
  8K(8192 Byte) = 1 Page, 8 page = 1 extent
  GAM(gloval allocation map) : 어떤 익스텐트가 할당된었는지 관리
  SGAM(shared gloval allocation map) : 어떤 익스텐트가 현재 혼합 익스텐트로 사용되고 있는지와 빈페이지를 가지는지 관리
  DB의 파일 개수를 늘려주면 SGAM에 대한 요구가 분산되어 보다 좋은 성능을 기대할 수 있다.(tempdb)
  PFS (page free sapce), BCM(Bulked Change Map), DCM(Differential Change Map)
  IAM(Index Allocation Map) 파일의 익스텐트를 매핑.
 5. 페이지 구조
 6. 행 구조
 7. 행의 관리
  클러스터 인덱스에 삽입할 경우 페이지 분할 가능성 존재.
  인덱스에서 행 삭제 : ghost record
  행의 이동 : Forword record->클러스터 인덱스 생성해라...
  Inplace update / non inplace update
 8. 자료형과 성능

4장 인덱스 기초
 1. 인덱스 개요
  0.64% 이하의 경우에는 Index seek.
   -> 과연 신뢰할 수 있는가??
 2. 인덱스 조각 모음/재구성
 3. 데이터베이스 유지 관리 계획 마법사
 4. 통계

5장 인덱스 활용
 1. 인덱스 만들기 옵션
 2. 복합 인덱스
 3. 커버된 인덱스
  조합 인덱스와 비교시 장점이 있는가?
 4. 인덱스 교집합
  둘 이상의 인덱스를 동시에 사용해서 인덱스 교집합을 만드는 기능
 5. 인덱스 튜닝 마법사
 6. 인덱스 업데이트 성능
 7. 인덱스 힌트
 8. 인덱스 설정 지침
 9. 사례 연구

6장 최적화기
 1. 최적화기 소개
  가장 좋은 실행계획은 만드는 것이 아니라 그 정도면 충분한 실행계획을 생성.
  Parsing->standardization->Optimization->Compilation->Execute
 2. 쿼리 플랜 살펴보기
 3. 조인의 이해
 4. 기타 실행 계획
 5. 쿼리 플랜 - 실제 동작 분석
 6. 최적화기 힌트
  조인 힌트, 쿼리 힌트, 테이블 힌트
 7. 최적화 관련 점검

7장 트랜잭션 잠금 - 기초
 1. 개요
 2. 잠금 정보 얻기
  동적잠금과 잠금 승격 : MS에서는 전체 메모리의 40% 수준에서 잠금 승격이 발생한다고 말한다.
 3. 잠금의 크기
 4. 잠금의 호환성
 5. 격리 수준
  Lost update, Dirty read, non-repeatable read, phantom read

8장 트랜잭션과 잠금 - 활용
 1. 낙관적/비관적 동시성
 2. 잠금의 세기
 3. 특수 잠금
 4. 잠금 정보 얻기
 5. 차단
 6. 교착 상태
 7. 기타

9장 함수와 프로시저
 1. 함수
 2. 저장 프로시저 개요
 3. 매개 변수 스니핑
 4. 자동 매개 변수화
 5. 프로시저 재 컴파일
 6. 다목적 프로시저
 7. 권장 지침
 8. 프로시저 템플릿 예제
 9. 시스템 프로시저 만들기
 10. 디버깅
 11. 뷰와 파티션된 뷰
 12. 기타

10장 커서
 1. 개요
 2. 성능 관련
 3. 커서 예제
 4. 커서 제거
 5. 정규화와 커서
 6. 참고 자료

:
Posted by Elick
2010. 9. 8. 22:04

Oracle 병렬처리 Work/ORACLE2010. 9. 8. 22:04

/*
병렬 처리란 SQL문이 수행해야 할 작업 범위를 여러개의 작은 단위로 나누어 여러 프로세스(또는 스레드)가 동시에 처리하는 것을 말한다.
*/
explain plan set statement_id = 'SQL1' for SELECT /*+ PARALLEL(TLOG07TT 4)*/ COUNT(*) FROM TLOG07TT;
explain plan set statement_id = 'SQL1' for SELECT COUNT(*) FROM TLOG07TT;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'SQL1', 'BASIC'));
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'SQL1', 'TYPICAL'));
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'SQL1', 'SERIAL'));
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'SQL1', 'ALL'));
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'SQL1', 'OUTLINE')); -- 10g
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'SQL1', 'ADVANCED')); -- 10g

-- @?/rdbms/admin/utlxpls

-- Partition Table의 경우.
SELECT COUNT(*) FROM TLOG07TT;
SELECT /*+ PARALLEL(TLOG07TT 4)*/ COUNT(*) FROM TLOG07TT;
SELECT /*+ PARALLEL_INDEX(TLOG07TT TLOG07S1 5)*/ COUNT(*) FROM TLOG07TT WHERE EXITDT > (SYSDATE - 2);
SELECT /*+ PARALLEL_INDEX(TLOG07TT TLOG07S1 5) INDEX_FFS(TLOG07TT TLOG07S1)*/ COUNT(*) FROM TLOG07TT  WHERE EXITDT > (SYSDATE - 2);

-- Heap Table의 경우.
SELECT * FROM TAB1;
SELECT /*+ PARALLEL(TAB1 4)*/ * FROM TAB1;
SELECT /*+ PARALLEL_INDEX(TAB1 TAB1_S3) */ COUNT(*) FROM TAB1 WHERE JUMIN > '9001011'; -- partition table 아니기 때문에 안됨.
SELECT /*+ PARALLEL_INDEX(TAB1 TAB1_S3) INDEX_FFS(TAB1 TAB1_S3) */ COUNT(*) FROM TAB1; -- partition table 아니어도 되는 경우 : INDEX FAST FULL SCAN 을 해야 한다.

/*
Oracle 9i에서 사용가능한 병렬처리 관련 힌트를 찾아보았지만, DESC 관련 힌트는 찾지 못했음.
*/

:
Posted by Elick
2010. 8. 27. 17:39

DB를 바라보던 순서. Work/BI2010. 8. 27. 17:39

처음 DB를 사용해서 분석 정보를 보여주던 때 부터 Database에 대한 주된 관심의 순서가 존재하는 것 같다.

아래는 내 경우... 이렇다.. 라는 것..

처음에는 Server parameter 혹은 물리구성, Memory 설정 등 H/W에 대한 관심을 전제로 성능 이슈를 바라본다.
어느 정도 전체적인 성능 향상을 이루게 되지만, 한계를 느낀다.

다음은 쿼리를 본다. 쿼리의 접근 경로가 최적인가? 인덱스를 효율적으로 사용하는가?...
생각보다 효과적인 성능 향샹을 이루게 된다. 하지만, 해당 쿼리든, 해당 인덱스를 사용하던 쿼리든, 효과의 폭이 좁고, 한계를 느낀다.

다음은 테이블 구성에 대해서 고민하는 순간이 온다.
정규화는 되었나? 반정규화가 필요한가? 수평분할을 해야 하나?
성능 및 관리의 편의성을 어느 정도 얻게 되지만, 무엇인가 부족하다.

다음은 표준화 및 정책, 개발/관리 가이드에 대한 생각을 한다.
데이터베이스 객체(테이블, 컬럼, 프로시져 등등)에 대한 명명법(naming rule), 도메인 설정 및 관리, 엔티티에 대한 정의와 이력관리에 대한 정책, 데이터 수명에 대한 정책, 개발 및 관리, 재난 복구에 대한 가이드 및 시나리오 등등...

하지만, 이런 것들(표준화, 재난 대비 등)을 추진하려면 돈이 든다. 돈이 필요해...
그렇지만, DB팀은 돈을 버는 부서가 아니다. DB팀, 혹은 DBA나 DA가 회사에 돈을 벌어다 줄 수 있는 가장 가까운 길은 무엇일까...
효과적인 고객 관리 및 서비스 관리를 통해서 회사에 돈을 주는 사용자에 대한 흐름과 요구를 파악해 내서 의사결정권자에게 알려주는 것... 을 생각할 수 있다.

물론 그렇게 해서 버는 돈의 사용처는 내가 결정하지 않지만... 결국 비용면에서 자유롭다면... 회사도 표준화, 고가용성, 재난대비에 대해서도 비용을 기꺼이 지불할 수 있는 때가 올 것으로 기대한다.

그래서 결국 BI에 대한 관심을 가지게 되었다.

:
Posted by Elick
2010. 8. 27. 12:30

MyNote_안철수 강연 21세기형 전문가 Work/Etc2010. 8. 27. 12:30


아이폰의 교훈
2010-06-21
카이스트
안철수

http://news.kbs.co.kr/special/digital/vod/newspuri/2010/06/18/2114742.html#//


전문직은 전체에서 항상 수적으로 마이너이다.
과거 안철수의 쓴소리
 벤처 기업 95%망한다.
 한국에서 빌게이츠도 성공하기 힘들다
 한국은 IT강국이 아니라 IT소비강국이다.
20세 전문가 실력 = 전문지식
21세 전문가 실력 = 전문지식 * 커뮤니케이션 능력
 자신의 분야에 대해서도 잘 알아야 하지만, 일반인에게 잘 아려야 한다.

한국의 전문가 인재상이 있다.
A : 한분야의 깊이있는 지식 + 다른분야에 대한 상식과 포용력 + 커뮤니케이션 능력

카이스트 학생들의 고민 : 전망, 안정
 전망의 부질없음. 리먼브라더스 파산. 동기들 실직.
  -> 항상 많은 사람이 가는 곳이 안정적이지 않다. 너무 많은 사람이 몰려가는 것은 항상 안정적이 않다.
  누구도 확실하게 이야기할 수 없는 전망.
 안정의 덧없음. : 세포는 불안정을 유지하기 때문에 살아있다. 세포의 안정은 죽음이 찾아와야 온다.
  인생의 본질은 불안정이다. 안정적인 직업은 없다.
  이 사실을 받아들이는 것이 인생의 주인으로 사는 법이다.
 직업만족도는 시간에서 자유로운 직업 : 상위 1위 사진작가. 하위에서 1위는 모델, 2위는 의사.
  "의사는 똑똑한 사람은 필요없다. 성실하고 마음이 따뜻한 사람이 의사가 되어야 한다."
  의사는 처음보는 어딘가 비정상인 100명의 사람과 매일 이야기해야 하는 사람이다.
  -> 내성적인 사람에게는 지옥.
 직업의 본질
  의미를 느낄 수 있는가?
  재미있는가?
  잘 할 수 있는가?
4개의 직업을 가진 자신(의사를 그만두기 전까지의 6개월의 고민)
 자신을 알 수 있는 순간 : 고민과 선택의 시간.
 말과 행동은 그 사람이 아니다. 선택과 행동이 그 사람이다.

일을 하지 않으면 쉽게 잊혀지는 전문지식. 시간이 지나도 그대로 남아있는 깨닮음.

급한 일보다 중요한 일을 먼저해라.

커뮤니케이션 능력은 듣기 능력.
 그 사람 입장에 서서 그 사람의 말을 정확히 이해해야 한다.
 그 사람이 하는 말이 정확한지 확인.
 말 잘하고 잘 안듣는 사람보다 잘 들어주는 사람이 더 나은 사람이다. ->> 결국은 이해력인가.

고민의 순간 극복 방법
 실패가 발목잡는다는 것. 한번 실패하면 과감한 결단을 내려야 하는 순간 주저한다.
 성공도 그 다음 결정시 그 성공을 포기하기 힘들다.
  성공이든 실패든 그것을 잊고 판단해라.
 주위사람들의 평가에 연연하지 마라.
  자기가 먼저 행복할 수 있는 선택을 하면 주위사람도 행복해 할 수 있다.
 결과만 놓고 생각하지 마라.
 
 -> 선택의 본질만 남겨 놓고 고민해라.

 

:
Posted by Elick
2010. 8. 27. 11:12

결과 셋을 Excel로 저장하기. Work/SQL Server2010. 8. 27. 11:12

예전에 찾은 자료인데... 가끔 써먹을 때도 있다.
경험상 결과셋을 굳이 Excel로 저장할 필요는 없다. BCP를 이용하여 CSV파일로 저장하면 되는데...
하여간 찾아놓은 고생이 아까워 기록은 해 두는 것이 좋을 듯...

사용할 수 있는 환경이 MSSQL의 보안 권고 사항과 충돌한다.
1. MSSQL 노출 영역 구성대상 / 기능에 대한 노출 영역 구성 / OLE 자동화 사용 : True
2. MSSQL 노출 영역 구성대상 / 기능에 대한 노출 영역 구성 / xp_cmdshell 사용 : True

/*
Version: SQL Server 7.0/2000
Created by: Alexander Chigrik
http://www.MSSQLCity.com/ - all about MS SQL
(SQL Server Articles, FAQ, Scripts, Tips and Test Exams).
This stored procedure can be used to insert the result set of the
particular select statement into Excel file (c:ImportToExcel.xls,
by default).
You can pass the server name, user name, user password, the select
statement to execute, and the file name to store the results set,
as in the example below:
EXEC ExportToExcel @server = '.',
                   @uname = 'sa',
                   @QueryText = 'SELECT au_fname FROM pubs..authors',
                   @filename = 'c:ImportToExcel.xls'
*/
IF OBJECT_ID('ExportToExcel') IS NOT NULL DROP PROC ExportToExcel
GO
CREATE PROCEDURE ExportToExcel (
  @server sysname = null,
  @uname sysname = null,
  @pwd sysname = null,
  @QueryText varchar(200) = null,
  @filename varchar(200) = 'c:ImportToExcel.xls'
)
AS
DECLARE @SQLServer int,
        @QueryResults int,
        @CurrentResultSet int,
        @object int,
        @WorkBooks int,
        @WorkBook int,
        @Range int,
        @hr int,
        @Columns int,
        @Rows int,
        @indColumn int,
        @indRow int,
        @off_Column int,
        @off_Row int,
        @code_str varchar(100),
        @result_str varchar(255)
IF @QueryText IS NULL
  BEGIN
    PRINT 'Set the query string'
    RETURN
  END
-- Sets the server to the local server
IF @server IS NULL SELECT @server = @@servername
-- Sets the username to the current user name
IF @uname IS NULL SELECT @uname = SYSTEM_USER
SET NOCOUNT ON
EXEC @hr = sp_OACreate 'SQLDMO.SQLServer', @SQLServer OUT
IF @hr <> 0
BEGIN
    PRINT 'error create SQLDMO.SQLServer'
    RETURN
END
--  Connect to the SQL Server
IF @pwd IS NULL
  BEGIN
    EXEC @hr = sp_OAMethod @SQLServer, 'Connect', null, @server, @uname
    IF @hr <> 0
       BEGIN
         PRINT 'error Connect'
         RETURN
       END
  END
ELSE
  BEGIN
    EXEC @hr = sp_OAMethod @SQLServer, 'Connect', null, @server, @uname, @pwd
    IF @hr <> 0
      BEGIN
        PRINT 'error Connect'
        RETURN
      END
  END
SELECT @result_str = 'ExecuteWithResults("' + @QueryText + '")'
EXEC @hr = sp_OAMethod @SQLServer, @result_str, @QueryResults OUT
IF @hr <> 0
BEGIN
    PRINT 'error with method ExecuteWithResults'
    RETURN
END
EXEC @hr = sp_OAMethod @QueryResults, 'CurrentResultSet', @CurrentResultSet OUT
IF @hr <> 0
BEGIN
    PRINT 'error get CurrentResultSet'
    RETURN
END
EXEC @hr = sp_OAMethod @QueryResults, 'Columns', @Columns OUT
IF @hr <> 0
BEGIN
    PRINT 'error get Columns'
    RETURN
END
EXEC @hr = sp_OAMethod @QueryResults, 'Rows', @Rows OUT
IF @hr <> 0
BEGIN
    PRINT 'error get Rows'
    RETURN
END
EXEC @hr = sp_OACreate 'Excel.Application', @object OUT
IF @hr <> 0
BEGIN
    PRINT 'error create Excel.Application'
    RETURN
END
EXEC @hr = sp_OAGetProperty @object, 'WorkBooks', @WorkBooks OUT
IF @hr <> 0
BEGIN
    PRINT 'error create WorkBooks'
    RETURN
END
EXEC @hr = sp_OAGetProperty @WorkBooks, 'Add', @WorkBook OUT
IF @hr <> 0
BEGIN
    PRINT 'error with method Add'
    RETURN
END
EXEC @hr = sp_OAGetProperty @object, 'Range("A1")', @Range OUT
IF @hr <> 0
BEGIN
    PRINT 'error create Range'
    RETURN
END
SELECT @indRow = 1
SELECT @off_Row = 0
SELECT @off_Column = 1
WHILE (@indRow <= @Rows)
BEGIN
SELECT @indColumn = 1
WHILE (@indColumn <= @Columns)
BEGIN
EXEC @hr = sp_OAMethod @QueryResults, 'GetColumnString', @result_str OUT, @indRow, @indColumn
IF @hr <> 0
BEGIN
    PRINT 'error get GetColumnString'
    RETURN
END
EXEC @hr = sp_OASetProperty @Range, 'Value', @result_str
IF @hr <> 0
BEGIN
    PRINT 'error set Value'
    RETURN
END
EXEC @hr = sp_OAGetProperty @Range, 'Offset', @Range OUT, @off_Row, @off_Column
IF @hr <> 0
BEGIN
    PRINT 'error get Offset'
    RETURN
END
SELECT @indColumn = @indColumn + 1
END
SELECT @indRow = @indRow + 1
SELECT @code_str = 'Range("A' + LTRIM(str(@indRow)) + '")'
EXEC @hr = sp_OAGetProperty @object, @code_str, @Range OUT
IF @hr <> 0
BEGIN
    PRINT 'error create Range'
    RETURN
END
END
SELECT @result_str = 'exec master..xp_cmdshell ''del ' + @filename + ''', no_output'
EXEC(@result_str)
SELECT @result_str = 'SaveAs("' + @filename + '")'
EXEC @hr = sp_OAMethod @WorkBook, @result_str
IF @hr <> 0
BEGIN
    PRINT 'error with method SaveAs'
    RETURN
END
EXEC @hr = sp_OAMethod @WorkBook, 'Close'
IF @hr <> 0
BEGIN
    PRINT 'error with method Close'
    RETURN
END
EXEC @hr = sp_OADestroy @object
IF @hr <> 0
BEGIN
    PRINT 'error destroy Excel.Application'
    RETURN
END
EXEC @hr = sp_OADestroy @SQLServer
IF @hr <> 0
BEGIN
    PRINT 'error destroy SQLDMO.SQLServer'
    RETURN
END
GO

--Version: SQL Server 7.0/2000
--Created by: Alexander Chigrik
--http://www.MSSQLCity.com/ - all about MS SQL
--(SQL Server Articles, FAQ, Scripts, Tips and Test Exams).
--
--This stored procedure can be used to insert the result set of the particular
--select statement into Excel file (c:ImportToExcel.xls, by default).
--You can pass the server name, user name, user password, the select statement
--to execute, and the file name to store the results set, as in the example below:

EXEC ExportToExcel @server = NULL,
                   @uname = 'xxxxxx',
                   @pwd = 'xxxxxxx',
                   @QueryText = 'SELECT * FROM dbXXX..tbXXX',
                   @filename = 'c:\xxxxx.xls'

:
Posted by Elick

Oracle 에서 사용했던 방법을 살짝 바꿨다.

나오는 결과에 비해서 쿼리가 길다. 어찌어찌하면 이쁘게 줄일 수도 있을 것 같은데... 너무 졸립다.
당연히 MSSQL 2005 이상부터 사용할 수 있을 듯..


WITH CTE (TNAME, CNAME, PRNUM, LEVEL) AS
(
SELECT convert(varchar(8000), TNAME) + '|', CNAME, PRNUM, 1 as LEVEL
FROM (
 SELECT object_name(object_id) TNAME
  , name CNAME
  , ROW_NUMBER () OVER (PARTITION BY name ORDER BY object_name(object_id)) PRNUM
 FROM sys.columns
 ) AA
WHERE PRNUM = 1
UNION ALL
SELECT CTE.TNAME + convert(varchar(8000), T.TNAME) + '|', T.CNAME, T.PRNUM, CTE.LEVEL + 1 LEVEL
FROM (
 SELECT object_name(object_id) TNAME
  , name CNAME
  , ROW_NUMBER () OVER (PARTITION BY name ORDER BY object_name(object_id)) PRNUM
 FROM sys.columns
 ) T INNER JOIN CTE ON CTE.PRNUM = (T.PRNUM - 1) AND T.CNAME = CTE.CNAME
WHERE T.PRNUM > 1
)
SELECT CTE.TNAME, CTE.CNAME, CTE.PRNUM
FROM CTE INNER JOIN (
SELECT CNAME, MAX(PRNUM) PRNUM
FROM (
 SELECT name CNAME
  , ROW_NUMBER () OVER (PARTITION BY name ORDER BY object_name(object_id)) PRNUM
 FROM sys.columns
 ) TA
GROUP BY CNAME) TABB ON CTE.CNAME = TABB.CNAME AND CTE.PRNUM = TABB.PRNUM;

Oracle의 SYS_CONNECT_BY_PATH  함수 같은거 쓸 수 있으면 좋을 거 같은데.. 찾아보기 너무 귀찮다.
:
Posted by Elick

얼마전 요청받았던 쿼리... 여기 저기 찾아보고 만들었는데... 잘된다.
단, Oracle 9i 이상에서만 되는듯... 8i 는 다른 방법을 써야 하나보다..

컬럼의 속성과 해당 컬럼을 사용하는 테이블 이름은 가로로 표현하고 싶다는 내용. 성능은 고려하지 않음.
pivot 사용은 어떨까 고민해 봤지만... 행의 수가 결정되어 있어야 하고 그렇게 작성이 가능하다 해도 쿼리문이 너무 길어질 듯 해서..
connect by 사용하기로 결정.


SELECT CNAME, COLTYPE, WIDTH, MAX(SYS_CONNECT_BY_PATH (TNAME, '|')) AS TABLE_NAME
FROM (
    SELECT CNAME, COLTYPE, WIDTH, TNAME
        ,(ROW_NUMBER () OVER (PARTITION BY CNAME, COLTYPE, WIDTH  ORDER BY TNAME  )) RNUM
    FROM COL
) START WITH RNUM = 1 CONNECT BY PRIOR RNUM = (RNUM - 1)
AND PRIOR CNAME = CNAME AND PRIOR COLTYPE = COLTYPE AND PRIOR WIDTH = WIDTH
GROUP BY CNAME, COLTYPE, WIDTH;


SYS_CONNECT_BY_PATH 에서 처리 가능한 문자열 길이가 정해져 있나 부다...
너무 길면 에러 발생. ㅠㅠ
:
Posted by Elick
2010. 8. 5. 00:01

정규화 Work/Database General2010. 8. 5. 00:01

생각보다 정규화를 위반한 테이블을 많이 보게 되고, 어느 정규화를 위반했는지도 파악이 안되는 테이블도 많이보게 된다.
그리고, 가장 두려운 것은 내가 정규화를 위반한 것인지 아닌지 판단이 안되는 경우이다.

제 1 정규화(1NF)
 모든 도메인이 원자값(atomic value)만으로 된 릴레이션
 여러 값을 가진 속성이 존재할 수 없다. 즉 반복되는 그룹이 존재해서는 안된다.
제 2 정규화(2NF)
 1NF이고, 식별자에 속하지 않는 속성들은 모두 식별자에 완전 함수 종속
 식별자가 아닌 속성은 식별자에 의존적이어야 한다. 식별자의 일부분에 의존적이어서는 안된다.
제 3 정규화(3NF)
 2NF이고, 식별자가 아닌 모든 속성들은 식별자에 이행적 함수 종속되지 않음
 식별자가 아닌 속성은 식별자 이외에 다른 속성에 의존적이어서는 안된다.
반정규화 종류
 이유:시스템 성능, 개발 과정 편의성, 운영의 단순화
 분할(수평분할, 수직분할), 중복테이블 생성(집계, 진행), 중복 컬럼 생성
:
Posted by Elick