블로그 이미지
redkite

카테고리

분류 전체보기 (291)
00.SI프로젝트 산출물 (0)
00.센터 운영 문서 (0)
01.DBMS ============.. (0)
01.오라클 (117)
01.MS-SQL (15)
01.MySQL (30)
01.PostgreSql (0)
01.DB튜닝 (28)
====================.. (0)
02.SERVER ==========.. (0)
02.서버-공통 (11)
02.서버-Linux (58)
02.서버-Unix (12)
02.서버-Windows (2)
====================.. (0)
03.APPLICATION =====.. (11)
====================.. (0)
04.ETC =============.. (0)
04.보안 (5)
====================.. (0)
05.개인자료 (1)
06.캠핑관련 (0)
07.OA관련 (1)
Total
Today
Yesterday

달력

« » 2024.5
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

공지사항

최근에 올라온 글

### INDEX 생성 시

1) 조회 빈도

2) 데이터 입력이 빈번한가


3) 범위형 쿼리(CI 가 좋음)

4) 포인트 쿼리(CI/NCI 관게 없음)

5) 사이즈


### INDEX  활용

 1)업무분석


 - 조회컬럼

 - 정렬컬럼

 - 컬럼에 대한 프로세스 


 2) 인덱스가 걸리는 컬럼의 사이즈


 - 컬럼의 사이즈 -> 데이터페이지 -> CI의 인덱스 페이지 (CI의 키값)

-> NCI 의 인덱스 페이지


 3) 한 테이블의 컬럼의 숫자를 고민해보세요 


 - Lock, Dead Lock


 4) 복합인덱스 => 검색 데이터 사용량 빈도 ?


 - '풍물'동아리에 있는 학생의 수 => 동아리 코드 + 학생번호

 - '홍길동'학생이 가입한 동아리의 수 => 학생번호 + 동아리코드


 5) 커버드 쿼리의 이용을 고민해보자


 - 커버드 쿼리 : 조회의 조건과 대상 컬럼이 인덱스에 있고,

그 인덱스로 질의를 하는 것


 - Size와 페이지분할

<- 복합인덱스(4)

<- 커버드쿼리(2+2)


 6) 파일그룹을 이용하자


 - 파일그룹을 이용해서 분한테이블/분할인덱스를 만듦으로써


   한개의 테이블에 걸리는 인덱스의 높이/깊이를 


   감소시키면서 성능을 향상시킨다


 7) 인덱스 활용쿼리 디자인


 - 인덱스가 정의된 열을 가공하지 말아야 한다

 - Like 키워드의 검색문자열 앞에 와일드 카드 사용을 피한다



### Index 생성 고려사항


 1. 조회가 빈번하게 일어나지 않는 테이블에 Index 생성하지말것


 2. Where 절 뒤에 오는 컬럼을 대상으로 Index를 고려해야 함


 3. 밀도가 높은 컬럼은 Index를 걸지 말것 예)성별[남,녀]


 4. Index를 재구성, 재작성을 통해서 재정렬을 할수 있음


- 재구성 (Re-Organization) : 리모델링

- 재작성 (Re-Build)   : 재건축


 5. Index 를 설정한다고 해도 반드시 Unique 한것은 아니다


 6. PK는 Clustered Index를, UQ는 Non-Clustered Index가 기본적으로


설정된다


 7. Index가 필요하다면,


포인트 쿼리, 범위쿼리, 추가(순차적/비순차적), 크기


 8. Clustered Index 

- 범위쿼리와 순차적 Data입력/수정/삭제에 바람직

- Table당 한개만 생성 가능


 9. Non-Clustered Index

- 비순차적 Data입력/수정/삭제와 포인트쿼리에 바람직

- Table당 249개 생성 가능


10. Index Key 설정 시, 같은 조건이면 크기(Size) 작은 것으로 할것


11. Scan/Seek


- Table Scan : Heap의 상태에서 전체 페이지 조회

- Clustered index Scan : CI로 설정된 상태에서 전체

페이지 조회


- Clustered index Seek : CI로 설정된 상태에서 

Index를 통한 조회


- Index Seek : NCI로 설정된 상태에서 Index를 통한 조회


12. 외래키(Foreign Key)에 Index를 설정할 때, 성능이 좋아질 

확률이 많다


13. alter index 지원은 SQL Server 2005 부터 가능


14. 단일컬럼 Index 


- 복합 컬럼 index : 설정된 컬럼 모두 Key값


create nonclustered index idx_cust_N

on cust_N (customerid,추가컬럼)



- 포괄열 index    : 포괄열은 Key값은 아님

 : NCI 에서만 가능함


create nonclustered index idx_cust_N

on cust_N (customerid) include (추가컬럼)


15. 채우기비율 설정


   -채우기비율(FillFactor) : Index Leaf Page에만 영향

   -인덱스패딩(PAD_INDEX)  : ON 하면 Leaf외에도 채우기비율 적용



### Cover Index

-- Index Lookup --


if OBJECT_ID('Orders') is not null

drop table Orders

go


select * into Orders from Northwind.dbo.Orders

go


select * from Orders


Exec sp_helpindex Orders

create nonclustered index idx_ord_01 

on Orders(CustomerID) -- nchar(5)

go


set statistics profile on

set statistics io on

set statistics time on


select * from Orders

go


-- Index를 타고 있는가? --

select * 

from Orders

where CustomerID = 'ERNSH'

and ShipVia = 3

go


-- Index 강제 적용 --

select ShipVia 

from Orders with(index(idx_ord_01))

where CustomerID = 'ERNSH'

and ShipVia = 3

go


exec sp_helpindex orders


-- NC Index 재생성 -- (인덱스 포괄열 포함)

drop index Orders.idx_ord_01

create nonclustered index idx_ord_01 

on Orders(CustomerID) include (ShipVia)

go


-- NC Index 추가 생성 --

drop index Orders.idx_ord_02

create nonclustered index idx_ord_02 

on Orders(EmployeeID,ShippedDate)

go

Exec sp_helpindex Orders

go

-- 검색 --

Select * from Orders

where EmployeeID = 4

and ShippedDate >= CONVERT(datetime,'19960101',112)

and ShippedDate < CONVERT(datetime,'19980101',112)

go

-- Hint 사용 --

Select * from Orders with(index(idx_ord_02))

where EmployeeID = 4

and ShippedDate >= CONVERT(datetime,'19960101',112)

and ShippedDate < CONVERT(datetime,'19980101',112)

go


-- NC Index 제거 및 CI 추가 생성 --

drop index Orders.idx_ord_02

create clustered index idx_ord_03 

on Orders(EmployeeID,ShippedDate)

go

Exec sp_helpindex Orders

go

-- CI를 통한 검색 --

Select * from Orders

where EmployeeID = 4

and ShippedDate >= CONVERT(datetime,'19960101',112)

and ShippedDate < CONVERT(datetime,'19980101',112)

go


--별도] NC Index 강제 적용: Key Lookup을 하고 있는가? --

select * 

from Orders with(index(idx_ord_01))

where CustomerID = 'ERNSH'

and ShipVia = 3

go

-- 페이지 I/O 2개 <-- 논리적 읽기 수 2로 알수 있음

Select COUNT(*)

from Orders 

where CustomerID like 'Bo%'

go


-- Key Lookup의 횟수는 총 34회

-- 페이지 I/O가 2개 이므로, (81-2)

-- Key Lookup이 읽었던 페이지 수는 79페이지

Select CustomerID,ShippedDate,Freight

from Orders with(index(idx_ord_01))

where CustomerID like 'Bo%'

go


--> Heap의 상태에서 RID Lookup을 통한

--> 페이지 읽기의 수보다는 늘어난 상태

-- NCI 제거 후, 커버된 Index 생성 --

drop index Orders.idx_ord_01

go

create index idx_ord_04 on Orders (CustomerID)

include (ShipVia,Freight)

go


-- NCI 검색 : 읽기 페이지수 2개 --

Select CustomerID,ShippedDate,Freight

from Orders with(index(idx_ord_04))

where CustomerID like 'Bo%'

go

--> NCI Leaf레벨의 Index 페이지에 

--> ShippedDate,Freight 가 포함되어

--> Key Lookup 이 일어나지 않음




### INDEX Tuning

-- create database inDB


use inDB


select ProductID, Name, Color, Size, Weight

 into pTbl from Adventureworks.Production.Product


select SalesOrderDetailID as OrderID, ProductID, OrderQty,

unitPrice, LineTotal as Total

 into oTbl from Adventureworks.Sales.SalesOrderDetail


-- Create Constraint


Alter Table pTbl

 add constraint pk_pTbl Primary key (ProductID)


Alter Table oTbl

 add constraint pk_oTbl Primary key (OrderID)


Alter Table oTbl

 add constraint fk_pTbl 

foreign key (ProductID) references pTbl(ProductID)


--

select count(*) from pTbl

select count(*) from oTbl


-- 

Select Top(5)* from pTbl 

Select Top(5)* from oTbl


Select * from pTbl --> 7 페이지

Select * from oTbl --> 664 페이지


set statistics IO on

-- Tunning Advisor --

select p.ProductID, p.name, 

sum(o.orderqty) as [oTotal],sum(o.Total) as [Total]

from pTbl P inner join oTbl O on p.ProductID = o.ProductID

group by p.ProductID, p.name

having p.ProductID = '717';


select * from pTbl where color='Silver' order by name;


select ProductID, Total from oTbl order by Total Desc;


## 데이터 베이스 엔진 튜닝 관리자 실행 후 사용될 쿼리문 수행



### Nested Loop Join
set statistics profile on
-- [Nested Loop JOIN ]
select name,addr,mobile1,mobile2
from userTbl u, buyTbl b
where u.userID = b.userid
and prodName = '모니터'

select prodName,price,amount
from userTbl u, buyTbl b
where u.userID = b.userid
and name = '박주영'

-- [LOOP JOIN : 중첩루프조인]

SELECT * 
FROM Sales.Customer AS c
INNER JOIN Sales.CustomerAddress AS ca
ON c.CustomerID = ca.CustomerID
OPTION (LOOP join);
go

-- [Merge Join: 병합조인]

SELECT * 
FROM Sales.Customer AS c
INNER JOIN Sales.CustomerAddress AS ca
ON c.CustomerID = ca.CustomerID
OPTION (MERGE join, FORCE ORDER);
GO

SELECT * 
FROM Sales.Customer AS c
INNER JOIN Sales.CustomerAddress AS ca
ON c.CustomerID = ca.CustomerID
OPTION (MERGE join);
GO  

SELECT * 
FROM Sales.CustomerAddress AS ca
INNER JOIN Sales.Customer AS c
ON c.CustomerID = ca.CustomerID
OPTION (MERGE join);
GO

-- [Hash Join] --

SELECT * 
FROM Sales.Customer AS c
INNER JOIN Sales.CustomerAddress AS ca
ON c.CustomerID = ca.CustomerID
OPTION (hash join, FORCE ORDER);
GO

SELECT * 
FROM Sales.Customer AS c
INNER JOIN Sales.CustomerAddress AS ca
ON c.CustomerID = ca.CustomerID
OPTION (hash join);
GO



### Hash Match Join
-- Hash Match(Aggregate)
-- Stream Aggregate 

USE indb
GO

IF OBJECT_ID('TEST','U') IS NOT NULL
       DROP TABLE TEST
GO

CREATE TABLE TEST( A INT NOT NULL, B INT NOT NULL)
GO
-- NCI 생성

CREATE INDEX NC_TEST_A ON TEST(A)
GO

SET NOCOUNT ON
GO

DECLARE @I INT = 1
WHILE(@I <= 10000)
BEGIN
       INSERT INTO TEST SELECT @I, CONVERT(INT,RAND()* 1000) +1
       SET @I = @I + 1
END

SET NOCOUNT OFF
GO

SELECT  B
FROM TEST
GROUP BY B

SELECT A
FROM TEST
GROUP BY A

-- 기존 Index 삭제 후, Unique & NCI 생성

DROP INDEX TEST.NC_TEST_A
GO

CREATE UNIQUE INDEX NC_TEST_A ON TEST(A)
GO

SELECT A
FROM TEST
GROUP BY A

---------------------------------------------
-- Table 삭제 후, 재생성

IF OBJECT_ID('TEST','U') IS NOT NULL
     DROP TABLE TEST
GO

CREATE TABLE TEST( A INT NOT NULL, B INT NOT NULL)
GO

SET NOCOUNTON
GO

DECLARE @I INT = 1
WHILE(@I <= 2519)
BEGIN
       INSERT INTO TEST SELECT @I, @i
       SET @I = @I + 1
END

SET NOCOUNTOFF
GO

SELECT B
FROM TEST
GROUP BY B


### SQL Profiler 테스트

select * from Cust_A
select * from Cust_c
select * from Cust_n
go

select * from Cust_A
go
select * from Cust_c
go
select * from Cust_n
go

select * from Cust_A;
select * from Cust_c;
select * from Cust_n;
go



Posted by redkite
, |


 ### 트리거 (Trigger)


 1) 목적 : 데이터 무결성과 일관성 유지

 

 2) 종류:

- DML 트리거 : insert, update, delete

- DDL 트리거 : create, alter, drop


 3) 옵션:

- After : 실행 후(트랜잭션 로그가 계속 남음)

- Instead of : 실행 전(트랜잭션 로그가 안남음)


 4) 참고: 가상 테이블 (inserted, deleted)



use sqldb

create Table TA

 ( id int identity Primary key,

name char(8))


create Table TB

 ( id int identity Primary key,

name char(8))


insert into TA values ('jhAn')

insert into TB values ('jhAn')


select * from TA

select * from TB


create Trigger Trg_A on TA

 instead of insert

 as

rollback

go


create Trigger Trg_B on TB

 after insert

 as

rollback

go


drop Trigger Trg_A

drop Trigger Trg_B


Instead Vs. After 차이점




## Procedure Compile

drop Table spTable


select * into spTable 

from AdventureWorks.Sales.Customer

order by rowguid


select * from spTable


create index idx_spTbl on spTable (customerid)

Exec sp_helpindex spTable


--set statistics time off

set statistics IO on


select * from spTable where customerID < 10

select * from spTable where customerID < 1000


create Proc usp_1

@id int

as

select * from spTable where customerID < @id



Exec usp_1 10 --with recompile


Exec usp_1 1000 --with recompile


DBCC Freeproccache


alter Proc usp_1

@id int

with recompile

as

select * from spTable where customerID < @id



## 데이터 형식 우선순위 ##


1.     사용자 정의 데이터 형식(가장 높음)

2.     sql_variant

3.     xml

4.     datetimeoffset

5.     datetime2

6.     datetime

7.     smalldatetime

8.     date

9.     time

10.   float

11. real

12.   decimal

13.   money

14.   smallmoney

15.   bigint

16.   int

17.   smallint

18.   tinyint

19.   bit

20.   ntext

21.   text

22.   image

23.   timestamp

24.   uniqueidentifier

25.   nvarchar(nvarchar(max) 포함)

26.   nchar

27.   varchar(varchar(max) 포함)

28.   char

29.   varbinary(varbinary(max) 포함)

30.   binary(가장 낮음)


### 인덱스 생성 테스트 ###
use AdventureWorks
select * from AdventureWorks.sales.customer

create database indb

use indb
select * into Cust_A from AdventureWorks.sales.customer
select * into Cust_c from AdventureWorks.sales.customer
select * into Cust_n from AdventureWorks.sales.customer

select Top(5)* from Cust_A
select Top(5)* from Cust_C
select Top(5)* from Cust_N

Exec sp_helpindex cust_A
Exec sp_helpindex cust_C
Exec sp_helpindex cust_N

create Clustered index idx_cust_C
on cust_C (customerid)

create nonclustered index idx_cust_N
on cust_N (customerid)

set statistics io on
set statistics time on

select * from Cust_A where customerID < 1000
select * from Cust_C where customerID < 1000
select * from Cust_N where customerID < 1000


select * from Cust_A where customerID < 1000
select * from Cust_C where customerID < 1000
select * from Cust_N with(index(idx_Cust_N)) 
where customerID < 1000



### 형 변환 ##

use indb
go

select * from master.dbo.syscolumns
select * from tempdb.dbo.syscolumns
select * from model.dbo.syscolumns
select * from msdb.dbo.syscolumns

if OBJECT_ID('t_columns') is not null
drop table t_columns
go

select t.*
into t_columns
from 
(select CAST(1 as smallint)as dbid,* from master.dbo.syscolumns
union all
select CAST(2 as smallint)as dbid,* from tempdb.dbo.syscolumns
union all
select CAST(3 as smallint)as dbid,* from model.dbo.syscolumns
union all
select CAST(4 as smallint)as dbid,* from msdb.dbo.syscolumns
) t
go

select * from t_columns
go
select COUNT(*) as cnt from t_columns
go

create index idx_t_01 on t_columns (dbid,name)
go

Exec sp_helpindex t_columns

-----------------------------------------------
set statistics profile on
set statistics io on
set statistics time on
go

select * 
from t_columns 
-- Index Scan --
select * 
from t_columns 
where name = 'addr'

-- Index Seek --
select * 
from t_columns 
where name = 'addr'
and dbid in (1,2,3,4)
-- Index 제거 --

sp_helpindex t_columns

drop index t_columns.idx_t_01
go
-- index 추가 --
create index idx_t_02 on t_columns(name)
go

-- column 추가
select * from t_columns
go

alter table t_columns -- 자동증가값
add no_tmp int identity not null
go

alter table t_columns -- null 값
add no varchar(10)
go

-- 값 변경 null --> 자동증가값
update t_columns
set no = no_tmp
go

-- Index 추가
create index idx_t_03 on t_columns (no)
go

select * from t_columns
where name = 'rowsetid'

---------------------------------------
-- Explicit 형 변환 --
select * from t_columns
where SUBSTRING(name,1,8) = 'rowsetid'
go

select * from t_columns
where name like 'rowsetid'
go

-- Implicit 형변환 --
select * from t_columns
where no=1 --varchar(10)
go       
--> 데이터 우선순위 (Int > varchar) 
--> 변환 (varchar --> Int)
select * from t_columns
where no = CONVERT(varchar(10),1)
go
--> 암시적 변환 예
--> 날짜 char(8)
--> where 계약일자 = 20130311
--> 데이터 우선순위 (Int > char(8)) 
--> 변환 (char(8) --> Int)



### 인덱스 기본키 생성
use xDB
go

create table T1 (
a int,
b int,
c int)
go

Exec sp_help T1
Exec sp_helpindex T1
go

create table T2 (
a int Primary key,
b int,
c int)
go

Exec sp_help T2
Exec sp_helpindex T2
go

create table T3 (
a int Primary key,
b int Unique,
c int Unique)
go

Exec sp_helpindex T3
go

create table T4(
a int Primary key nonclustered,
b int Unique clustered,
c int Unique)
go

Exec sp_helpindex T4
go

create table T5(
a int Primary key nonclustered,
b int Unique clustered,
c int Unique clustered) --< 불가능
go

Exec sp_helpindex T5
go

create table T6(
a int Primary key nonclustered,
b int Unique nonclustered,
c int Unique nonclustered)
go

Exec sp_helpindex T6
go

## 인덱스 생성

exec sp_helpdb indb
go

if OBJECT_ID('empTbl') is not null
drop table empTbl
go

use inDB
create table empTbl(
empID int not null,
LastName nvarchar(20) null,
FirstName nvarchar(10) null,
HireDate datetime null
)

insert into empTbl
select EmployeeID, LastName, FirstName, HireDate
from Northwind.dbo.Employees
order by EmployeeID
go

select * from empTbl
go

-- Table에 Index 확인 --
Exec sp_helpindex empTbl
go

-- Index 생성 --> LastName
create index idx_empTbl_LastName on empTbl(LastName)
with (fillfactor = 1, pad_index = on)
go

-- index 아이디 확인 --
select index_id, name
from sys.indexes 
where object_id = object_id('empTbl')
go

-- ind ('Database 명','Table 명','Index 아이디')
--> Page Type : DataPage(1),IndexPage(2),IAM(10)
--> Index Level : 루트(2),브랜치(1),리프(0)
dbcc ind('inDB','empTbl',2)
go

-- dbcc page 앞에 실행해야 함
--> dbcc 명령들은 기본적으로 출력을 로그에만 남김
dbcc traceon(3604)
go
-- page('Database 명','파일번호','페이지번호','출력옵션[0~3]')
dbcc page('indb',1,118,3)
go

------- Index 생성 기초 ------------------
-----------------------------------------
-- Clustered Index 생성 --

Exec sp_helpindex empTbl
SP_SPACEUSED [empTbl] 
GO

alter table empTbl 
add constraint idx_emp_pk
primary key clustered (empID)
go

alter table empTbl
drop constraint idx_emp_pk
go


### 인덱스 정보 확인 ###
USE ADVENTUREWORKS
GO
SP_HELP [PERSON.ADDRESS] 
GO
SP_HELPINDEX [PERSON.ADDRESS] 
GO
USE ADVENTUREWORKS
GO
SELECT * FROM SYS.INDEXES 
WHERE OBJECT_ID = OBJECT_ID('PERSON.ADDRESS')
GO
SELECT * FROM SYS.INDEX_COLUMNS 
WHERE OBJECT_ID = OBJECT_ID('PERSON.ADDRESS')
GO
USE ADVENTUREWORKS
GO
SELECT * FROM SYS.DM_DB_INDEX_PHYSICAL_STATS 
(DB_ID(N'ADVENTUREWORKS'), OBJECT_ID(N'PERSON.ADDRESS'),
NULL, NULL , 'DETAILED')
GO
SELECT * FROM SYS.DM_DB_INDEX_OPERATIONAL_STATS 
(DB_ID(N'ADVENTUREWORKS'), OBJECT_ID(N'PERSON.ADDRESS'), NULL,
NULL)
GO
SELECT * FROM SYS.DM_DB_INDEX_USAGE_STATS 
WHERE OBJECT_ID = OBJECT_ID(N'PERSON.ADDRESS')
GO
SELECT INDEXPROPERTY(OBJECT_ID('PERSON.ADDRESS'), 
'PK_Address_AddressID','IsClustered')AS [Is Clustered],
INDEXPROPERTY(OBJECT_ID('PERSON.ADDRESS'),
'PK_Address_AddressID','IndexDepth') AS [Index Depth],
INDEXPROPERTY(OBJECT_ID('PERSON.ADDRESS'),
'PK_Address_AddressID','IndexFillFactor') AS [Fill Factor];
GO



### 인덱스 활용
USE ADVENTUREWORKS
GO

Exec sp_helpindex [SALES.SALESORDERDETAIL]
select * from SALES.SALESORDERDETAIL

drop index SALES_QTY_IDX on SALES.SALESORDERDETAIL
GO

set statistics io on

SELECT * FROM SALES.SALESORDERDETAIL 
WHERE ORDERQTY >= 35
GO

Exec sp_helpindex [SALES.SALESORDERDETAIL]

CREATE INDEX SALES_QTY_IDX ON SALES.SALESORDERDETAIL(ORDERQTY) 
GO

SELECT * FROM SALES.SALESORDERDETAIL 
WHERE ORDERQTY >= 35
GO
SELECT * FROM SALES.SALESORDERDETAIL
WHERE ORDERQTY - 5 >= 30
GO
USE ADVENTUREWORKS
GO
SP_HELPINDEX [PRODUCTION.PRODUCT] 
GO
SELECT NAME FROM PRODUCTION.PRODUCT 
WHERE NAME LIKE '%Blade%'
GO
SELECT NAME FROM PRODUCTION.PRODUCT
WHERE NAME LIKE 'Blade%'
GO



### 인덱스 비활성화
USE ADVENTUREWORKS
GO

select * from Person.Address

SP_HELPINDEX [PERSON.ADDRESS] 
GO
SP_SPACEUSED [PERSON.ADDRESS] 
GO

set statistics io on

select * from Person.Address
where StateProvinceID < 3

ALTER INDEX IX_ADDRESS_STATEPROVINCEID ON PERSON.ADDRESS 
rebuild -- 활성화
DISABLE  -- 비활성화
GO
SP_HELPINDEX [PERSON.ADDRESS] 
GO
SP_SPACEUSED [PERSON.ADDRESS]
GO
ALTER INDEX PK_Address_AddressID ON PERSON.ADDRESS 
DISABLE
GO
SP_SPACEUSED [PERSON.ADDRESS]
GO
ALTER INDEX IX_ADDRESS_STATEPROVINCEID ON PERSON.ADDRESS 
REBUILD WITH (ONLINE=ON)
GO
ALTER INDEX ALL ON PERSON.ADDRESS REBUILD 
GO
SP_SPACEUSED [PERSON.ADDRESS]
GO
ALTER INDEX IX_ADDRESS_STATEPROVINCEID ON PERSON.ADDRESS 
DISABLE
GO
SELECT IS_DISABLED FROM SYS.INDEXES
WHERE OBJECT_ID = OBJECT_ID('PERSON.ADDRESS')
AND NAME = 'IX_ADDRESS_STATEPROVINCEID'
GO
ALTER INDEX IX_ADDRESS_STATEPROVINCEID ON PERSON.ADDRESS
REBUILD WITH (ONLINE=ON)
-- ONLINE=ON (온라인 상태, 즉 Table Lock을 안 걸고 실행)
GO

Posted by redkite
, |


Script.zip


오라클 데이터베이스를 생성할 때 보통은 DBCA를 이용한다.
그러나 DBCA만 사용해 DB를 생성하다보면, DBCA를 사용할 수 없는 상황에는 당황하게 된다.


다음은 DBCA를 이용할 수 없는 경우 오라클 데이터베이스를 생성하는 절차다.

  1. SID, ORACLE_HOME 설정

    export ORACLE_SID=testdbexport ORACLE_HOME=/path/to/oracle/home

  2. 초기화 파라미터 파일 생성 (minimal)
    $ORACLE_HOME/dbs에 init<SID>.ora 파일을 만든다.

    control_files = (/path/to/control1.ctl,/path/to/control2.ctl,/path/to/control3.ctl)
    undo_management = AUTO
    undo_tablespace = UNDOTBS1
    db_name = test
    db_block_size = 8192
    sga_max_size = 1073741824 # 1GBsga_target = 1073741824 # 1GB

  3. 패스워드 파일 생성

    $ORACLE_HOME/bin/orapwd file=$ORACLE_HOME/dbs/pwd{sid}.ora password=oracle entries=5

  4. 인스턴스 기동

    $ sqlplus '/as sysdba'

    SQL> startup nomount

  5. CREATE DATABASE 문 실행

    create database test
    dblogfile group 1 ('/path/to/redo1.log') size 100M,
    group 2 ('/path/to/redo2.log') size 100M,
    group 3 ('/path/to/redo3.log') size 100M
    character set ko16ksc5601
    national character set al16utf16
    datafile '/path/to/system.dbf' size 500M autoextend on next 10M maxsize unlimited extent management local
    sysaux datafile '/path/to/sysaux.dbf' size 100M autoextend on next 10M maxsize unlimited
    undo tablespace undotbs1 datafile '/path/to/undotbs1.dbf' size 100M
    default temporary tablespace temp tempfile '/path/to/temp01.dbf' size 100M;

    CREATE DATABASE 문 Syntax는 다음과 같다.
    CREATE DATABASE [database name]
    [CONTROLFILE REUSE]
    [LOGFILE [GROUP integer] file specification]
    [MAXLOGFILES integer]
    [MAXLOGMEMBERS integer]
    [MAXLOGHISTORY integer]
    [MAXDATAFILES integer]
    [MAXINSTANCES integer]
    [ARCHIVELOG|NOARCHIVELOG]
    [CHARACTER SET charset]
    [NATIONAL CHARACTER SET charset]
    [DATAFILE filespec [autoextend]]
    [DEFAULT TEMPORARY TABLESPACE tablespace filespec]
    [UNDO TABLESPACE tablespace DATAFILE filespec]
    [SET TIME_ZONE [time_zone_region]];

  6. Data Dictionary View 생성 스크립트 실행

    $ORACLE_HOME/rdbms/admin/CATALOG.sql$ORACLE_HOME/rdbms/admin/CATPROC.sql

  7. SPFILE 생성

    SQL> create spfile from pfile;

  8. 추가 테이블스페이스 생성
  9. sys, system 계정 암호 변경

Posted by redkite
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함