ex) SELECT * INTO NEWTABLENAME FROM OLDTABLE
'Windows/MSSQL'에 해당되는 글 19건
- 2008.09.09 MSSQL 테이블 복사
- 2008.09.02 필드 추가
- 2008.07.22 MS-SQL 인덱스 생성
- 2008.06.30 테이블 정렬 변경
- 2008.04.29 view 권한 부여
- 2008.04.29 백업 , 복구, 로그자르기 MS_SQL
- 2008.04.29 조건문(WHILE, IF - ELSE 와 CASE)
- 2008.04.29 View 테이블 만들기
- 2008.04.29 View 테이블 Mssql
ex) SELECT * INTO NEWTABLENAME FROM OLDTABLE
데이터가 적을 경우는 기본적인 인덱스로 결과를 출력할 수 있도록 하고, 데이터가 많아질 수록 쿼리에 맞는 인덱스를 걸어주면 효율적입니다.
인덱스는 일반적으로 한 테이블당 5개전후로 많이 잡습니다. 그 이상을 걸면 데이터의 양에 오히려 좋지 않은 영향을 줄 수 있기 때문입니다.
인덱스는 기본적으로 전체 테이블의 10%정도를 가져오는데 효과적입니다.
하지만 1000만건중에 100만건을 가져오는데는 인덱스가 효과적이라고 보기는 힘들지만 기본적은 인덱스는 필수입니다.
현재 느리다고 생각되는 쿼리가 있다면 다음의 과정으로 인덱스를 만들어보세요.
1. 쿼리 분석
현재 이 서버에 돌아가고 있는 쿼리를 알기 위해 다음을 실행합니다.
select * from master..syscacheobjects
sql이란 부분에 현재 캐시되어있는 쿼리가 보입니다.
이 쿼리들을 돌려가며 느리다고 느껴지는 쿼리를 찾습니다.
2. 기본 인덱스, 부하가 걸리는 인덱스를 체크
sp_helpindex A
이 명령으로 A테이블의 인덱스를 찾을 수 있습니다.
3. 인덱스 생성
create index A_ix01 on A(aa)
처음엔 고유증가 번호등의 잘 변하지 않는 필드를 Clustered Primary Key로 잡아야 합니다. 최종적으로 데이터를 찾아가는 길을 만들기 위함입니다. 이게 없으면 전체를 메모리에 띄워야 하기 때문에 많은 리소스를 잡아먹습니다.
Join문과 Where에서 찾는 필드명은 index로 걸어주는 것이 좋습니다. text등의 900바이트가 넘는 데이터는 index가 생성이 되지 않으니 주의 하세요.
index를 걸어줄 때 필드를 여러개를 한번에 지정하는 방법이 있고 한개씩 여러번 지정하는 방법이 있습니다.
한번에 여러개를 지정하는 방법의 예:
create index A_ix01 on A(aa, bb)
한개씩 여러번 지정하는 방법의 예:
create index A_ix01 on A(aa)
create index A_ix02 on A(bb)
위의 방법은 aa순으로 정렬된 뒤에 bb순으로 정렬하는 것입니다. 때문에 where절등에서 bb를 먼저찾거나 bb만 찾게 되는 경우 위의 인덱스는 타지 않습니다.
대신 아래처럼 한개씩 여러번 지정하는 것에 비해 aa,bb순으로 찾는 경우 가장 빠른 효율을 줍니다. 따라서 위방법과 아래방법은 전혀 다른 인덱스가 됩니다. 참고하면서 만드세요.
4. 테스트
인덱스를 만들어가면서 대량의 데이터의 쿼리를 돌려봅니다.
인덱스를 바꿔가면서 가장 맞는 인덱스를 생성합니다.
최초로 돌릴 경우는 메모리에 올리는 시간 때문에 느릴 수 있습니다. 때문에 쿼리를 여러번 돌린후 마지막 시간을 재는게 좋습니다.
5. 불필요한 인덱스 삭제
drop index AA.AA_ix01
반드시 테이블명.인덱스명 의 형식으로 지워야 지워집니다.
* syscacheobjects에 비슷한 쿼리가 많다면 그 쿼리는 Static SQL을 이용하는 것이 좋습니다. Static SQL을 이용하면 같은 쿼리의 변수만 바뀌는 식의 쿼리를 하나의 쿼리로 인식하여 처리하므로 비슷한 캐시를 줄여 캐시를 활용할 공간이 넓어집니다.
ALTER TABLE tabFlights
ALTER COLUMN LeavingFrom VARCHAR(50) COLLATE Korean_Wansung_CI_AI
GO
ALTER TABLE tabFlights
ALTER COLUMN LeavingFrom VARCHAR(50) COLLATE Korean_Wansung_CI_AS
GO
AS
SELECT ORDERID, CUSTID
FROM DBO.ORDERS
-- 테스트로 함 불러보고
EXEC SP_ADDLOGIN 'TEST_USER', '1234', PERFORMANCE
-- 로그인 생성(아이디,패스워드,데이터베이스)
EXEC PERFORMANCE.DBO.sp_grantdbaccess TEST_USER
-- 엑세스 가능하게 만들고
GRANT SELECT ON VORDERS TO TEST_USER
-- 딱 뷰 하나만 SELECT 하는 권한 주고
GO
SETUSER 'TEST_USER'
-- TEST_USER 로 가장해서 들어간 뒤 테스트
GO
SELECT * FROM VORDERS
-- 성공
SELECT * FROM ORDERS
-- 실패
SETUSER
-- 원래 권한 유저로 돌아오기
MSSQL] 백업 , 복구, 로그자르기 MS_SQL
2006/12/10 19:55
http://blog.naver.com/ronghuan/110011923855
-------------------------------------------------------------------------------------- --1.디바이스 설치 --BACKUP BACKUP DATABASE XERP TO XERP -- WITH INIT 1. RESTORE HEADERONLY FROM '디바이스명(장치명)' 을 하여 복원할 파일의 번호(POSITION)를 알아낸다. 2. RESTORE DATABASE 'DB명' FROM '디바이스(장치)명' WITH FILE = 복원할 파일의 번호(POSITION) , RECOVERY --NORECOVERY(복원해야 할 것이 더 있을때) WITH INIT 을 한 파일을 복원 할때 = RESTORE DATABASE 'DB명' FROM '디바이스(장치)명' --EM을 사용하여 복원하는걸 권장 (IDC에서도 정기적으로 백업을 함) --로그잘라내기 1. BACKUP LOG 'DB명' TO '디바이스명(장치명)' --로그백업 /* 위의 두가지 방법 모두 사용할 수 있으나 로그백업을 권장함(단순복구모델일때는 로그 잘라내기를 함) */ DBCC LOGINFO */ --파일명 알아내기 EXEC SP_HELPFILE [출처] MSSQL] 백업 , 복구, 로그자르기 MS_SQL |작성자 여유
-- 경로를 지정하여 백업하기
BACKUP DATABASE DB이름 TO disk = '파일경로및이름'
-- 백업정보보기
restore headeronly from disk = '파일경로및이름'
-- 백업한 DB 복구하기
RESTORE DATABASE DB이름
FROM disk = '파일경로및이름' WITH REPLACE,
MOVE '논리적장치이름(Data)' TO 'Data파일경로및이름',
MOVE '논리적장치이름(Log)' TO 'Log파일경로및이름'
-- 논리적 장치이름
RESTORE FILELISTONLY from disk = '파일경로및이름'
--attach
EXEC sp_attach_db @dbname = N'디비 이름',
@filename1 = 'Data파일경로및이름',
@filename2 = 'Log파일경로및이름'
--디바이스(장치)
sp_addumpdevice 'disk', '장치명', '경로 및 파일'
----sp_addumpdevice 'disk', 'XERP', 'd:databackup\dbbackup\xerp'
--2.디바이스 삭제
sp_dropdevice '장치명'
--sp_dropdevice 'XERP'
--3.디바이스 정보
sp_helpdevice '장치명'
--sp_helpdevice XERP
1. 전체 BACKUP
BACKUP DATABASE 'DB명' TO '디바이스명'
BACKUP DATABASE 'DB명' TO '디바이스명' WITH INIT--(장치내역 HISTORY 삭제)
2. 차등 BACKUP
BACKUP DATABASE 'DB명' TO '디바이스명' WITH DIFFERENTIAL
3. 로그 BACKUP
BACKUP LOG 'DB명' TO '디바이스명'
RESTORE HEADERONLY FROM XERP
BACKUP DATABASE XERP TO XERP WITH DIFFERENTIAL
BACKUP LOG XERP TO XERP
--RESTORE
RESTORE LOG 'DB명' FROM '디바이스(장치)명' WITH FILE = 복원할 파일의 번호(POSITION) , RECOVERY --NORECOVERY(복원해야 할 것이 더 있을때)
BACKUP LOG 'DB명' WITH TRUNCATE_ONLY --로그 잘라내기
ex)BACKUP LOG XERP TO XERP
BACKUP LOG XERP WITH TRUNCATE_ONLY
2. DBCC SHRINKFILE('로그파일명', 파일크기) --파일크기를 정해주어 파일을 축소하는 방법
DBCC SHRINKFILE('로그파일명', TRUNCATEONLY) --불필요한 로그 파일을 잘라 파일을 축소하는 방법
/*
ex)DBCC SHRINKFILE ('XERP_LOG',500)
DBCC SHRINKFILE ('XERP_LOG',TRUNCATEONLY)
위의 두가지 방법 모두 사용할 수 있으니 TRUNCATEONLY를 더 권장 함
SELECT * FROM SYSFILES
http://blog.naver.com/taekani/130015877476
자 이번에 소개해 드릴 녀석들이 바로 T-SQL 프로그래밍의 꽃이라고 할 수 있는
그런 녀석들 입니다. 마치 소면과 채소 사이에 숨어있는 진짜 쫄깃한 골뱅이라고도
표현이 가능하겠지요. 갑자기 맥주 한잔이 땡기는군요.
첫번째인 변수 선언 입니다.
변수의 선언법은 아시겠죠?
DECLARE @변수명 자료형
하시면 변수가 생성되는 것입니다.
여기에 값을 대입 하려면?
SET @변수명 = 값
이런 식이 되지요.
DECLARE @변수1 int
|
간단히 보시면 저런 식이 됩니다. 어렵지 않으시져?
이미 커서와 저장 프로시져 등에서 많이 봐 오셔서 어렵지는 않으실 거에요.
다음 IF - ELSE 입니다. 분기라는 것만 생각하세요.
IF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') < $15
|
또는 이를 중첩 하신후. ^_^
IF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') < $15 |
이렇게 구성이 됩니다. if의 끝에 End if가 없지요? ^_^
약간의 차이만 느끼시면 문제 없지요.
느끼시듯이 IF의 구문은
IF Boolean_expression
{ sql_statement | statement_block }
[ ELSE
{ sql_statement | statement_block } ]
이런 식입니다.
주의하실점으로 IF 후 처리한 루틴에서 여러 처리가 들어갈시 반드시
BEGIN - END로 블럭을 지정해 단위별로 수행을 하셔야만 합니다.
BEGIN - END로 묶지 않을시는? 에러가 나거나 첫 단위만 수행합니다.
다음은 WHILE구문 입니다.
USE pubs
|
일반적으로 이러한 식의 처리로 조건이 맞을때 까지 루프를 돌면서
처리하게 됩니다. 적절한 방식으로 비교 루틴을 두신후 돌리시면 되지요.
WHILE의 구문은
WHILE Boolean_expression
{ sql_statement | statement_block }
[ BREAK ]
{ sql_statement | statement_block }
[ CONTINUE ]
의 식입니다.
BREAK는 WHILE구문을 끝내며
CONTINUE는 WHILE 루프를 다시 시작하게 합니다.
다음 CASE입니다.
CASE구문 정보를 먼저 봐 보지요.
단순 CASE 함수 |
단순 처리시 입니다.
USE pubs |
역시나 CASE샘플로 비교값을 가지는 케이스 입니다.
USE pubs |
이러한 부분 입니다.
좀더 유연한 CASE 처리를 위해 문자열 처리 함수와 혼용하는 샘플 입니다.
USE pubs |
천천히 샘플을 수행해 보세요. 이게 어떤 종류구나가 중요한게 아니라..
CASE구문으로 IF ELSE의 중첩을 많이 막을 수 있으며 매우 유용합니다. ^_^
다음은 CASE함수와 비슷한 처리가 가능하지만 한큐로 수행이 가능한 유용한 함수 입니다.
NULLIF 입니다.
이는 NULLIF(expression1, expression2)
식이며 두 값이나 표현식이 같은 경우에 NULL을 반환합니다.
즉.. 조금더 생각해 보시면
계산된 평균값에 어떤 특정 값이 포함되지 않기를 원하는 경우에
사용될 수 있지요.
이하 두개의 질의를 비교해 보세요.
SELECT royaltyper
|
다음은 COALESCE 입니다.
역시나 간단합니다.
COALESCE(expression1, expression2, ….. , expressionN)
한 구문이 있을 경우...
NULL이 아닌 처음 값을 표현식부터 찾습니다. ^_^
아래의 INSERT 되는 데이터를 봐 보세요.
테이블을 아래와 같이 설계 하신후.. 앞의 컬럼의 값부터 NULL이 아닌
값을 찾으려 한다면?
SET NOCOUNT ON |
자 여기까지 입니다. ~~~ 수고하셨습니다.
이곳까지가 개발자 분이라면 꼬옥 봐 두어야할 SQL서버 개발에 필요한 부분의 정리라고
보시면 됩니다. - 이하 부분은 문제상황이 발생하거나 다른 처리를 원하실때 찬찬히
보시면 되구요. ^_^
이제 프로그래밍 부분도 마무리가 다행히 되었군요. ^_^
다음장부터는 조금 난해해 질 수 있습니다. - 여기까지 보셨으니 이제 초보자 분은
아니신 겁니다. ^_^
자 수고하셨구요. - 이제는 실제 자신의 업무에 적용하면서..
덕지덕지한 어플리케이션.. ASP나 VB의 코드를.. 앞의 많은 내용을 통해
한줄로 줄여 보시길 바랍니다. ^_^
[출처] View 테이블 Mssql |작성자 여유
1. VIEW 테이블의 정의
테이블에 대한 제한을 가지고 테이블의 일정한 부분만 보일 수 있는 가상의 테이블로서 VIEW TABLE은 실제 자료를 갖지는 않지만, VIEW을 통해 Table을 관리 할 수 있다.
하나의 테이블에 View의 개수는 제한이 없다.
2. VIEW 테이블의 목적
권한을 제한하여 만들수 있다.
*사용자에게 테이블에 대해 사용할 수 있는 모든 권한을 부여시는 다음과 같이 쓴다,
*권한부여시) GRANT SELECT/INSERT ON 테이블명 TO 사용자
*그러나, 일반적으로 사용자에게 테이블에 관한 모든 권한은 주지 않으며..따라서,, 제한적으로 권한부여를 해 주기 위해 View명령사용한다.
*실데이타는 가지고 있지않으며, 어떤 테이블을 제한적으로 다른 사용자가 볼수 있도록 해준다.
두개의 테이블을 join 할 경우 자료로 View 테이블로 만들어 작업의 효율성을 높일수 있다.
(복잡한 Query를 간단하게 해준다.) 여러 개의 테이블이 있을 때 view를 만든후, 쉽게 자료를 여러 개의 테이블로부터 볼 수 있다.
3. 형식
Create View view테이블명 AS Select …..Where …..
Drop View view테이블명 - :삭제
Alter View view테이블명 - :수정
4. 제한 조건
View을 통한 자료의 transation (DELETE./UPDATE/…)이 가능하게 하려면
1. Group By ,Distinct, Group 함수등을 이용한 View가 아니어야 한다.
2. 하나의 테이블에서 생성된 View이어야한다.
수식이 사용된 필드는 수정, 삭제 할 수 없다.
view을 통한 삽입이 가능하려면 NOT NULL 로 설정된 필드가 VIEW에 모두 포함되어야 한다.
view 생성시 Order By는 사용할 수 없으며, Group By, Having조건을 사용할 수 있다.
SQL> Create View v_sa5 as select saname,sajob,deptno from sawon where deptno=10;
SQL> update sawon set deptno=20 where saname='이상아'; - UPDATE 의 경우
1 개의 행이 갱신되었습니다.
SQL> Grant select on V_sa5 to scott;
권한 부여 성공입니다.
Connect Scott에서 View Table 보기
SQL> select * from Angle.V_sa5;
SQL> Create table v_sa6 as select saname,sapay,sapay*2 as bouns from sawon where deptno=20;
**** 필드명을 안 써주었을 경우 Error 가 발생
SQL> Create table v-sa6 (x,y,z) as select saname,sapay,sapay*2 from sawon where deptno=20;
****원하는 필드명으로 Change할 수 있다.
원하는 필드명으로 JOIN을 할 경우
SQL> Create view v_sa7(부서명,이름,직책,급여) as select dname,saname,sajob,sapay from sawon,dept
where dept.deptno=sawon.deptno;
원하는 필드명으로 join 과 group by 을 사용했을 때
SQL> Create View v_sa8(부서명,인원수,급여합계) as select dname,count(*),sum(sapay) from sawon,deptwhere sawon.deptno=dept.deptno group by dname;
[출처] View 테이블 Mssql |작성자 여유
http://blog.naver.com/sevenwind/130020436098
뷰란?
◈ 뷰는하나의 가상 테이블이라 생각 하시면 됩니다.
◈ 뷰는 실제 데이터가 저장 되는 것은 아니지만 뷰를 통해 데이터를 관리 할수 있습니다.
◈ 뷰는 복잡한query를 통해 얻을 수 있는 결과를 간단한 query를 써서 구할 수 있게 합니다.
◈ 한개의 뷰로 여러 테이블에 대한 데이터를 검색할 수 있습니다.
◈ 특정 평가기준에 따른 사용자 별로 다른 데이터를 액세스할 수 있도록 합니다.
뷰의 제한 조건.
◈ 테이블에 NOT NULL로만든 컬럼들이. 뷰에 다 포함이 되 있어야 됩니다.
◈ 그리고 ROWID, ROWNUM, NEXTVAL, CURRVAL등과 같은 가상컬럼에 대한 참조를
포함하고 있는 뷰에는 어떤 데이터도 Insert할 수 없습니다.
◈ WITH READ ONLY 옵션을 설정한 뷰도 데이터를 갱신할수 없습니다.
◈ WITH CHECK OPTION을 설정한 뷰는 뷰의 조건에 해당되는 데이터만 삽입, 삭제,
수정을 할수 있습니다.
CREATE [or REPLACE] [FORCE|NOFORCE] VIEW $view_name AS $subQuery
[WITH CHECK OPTION]
[WITH READ ONLY]
- FORCE : 기본 테이블 유무에 관계없이 VIEW를 생성
- WITH CHECK OPTION : VIEW에 의해 엑세스될 수 있는 행만이 입력되거나 변경될 수 있음을
지정 합니다.
- WITH READ ONLY : SELECT만 가능한 VIEW의 생성
- VIEW를 정의하는 질의어에는 ORDER BY절을 사용 할 수 없습니다.
- 함수를 사용한 컬럼은 반드시 ALIAS를 지정해야 합니다.
CREATE OR REPLACE VIEW Name_Query
AS
SELECT a.ename, b.dname
FROM emp a, dept b
WHERE a.deptno = b.deptno
AND b.deptno = 20
CREATE OR REPLACE VIEW Check_Option
AS
SELECT empno, ename, deptno
FROM emp
WHERE deptno = 10
WITH CHECK OPTION
WITH CHECK OPTION 사용시 INSERT할 경우 WHERE 조건에 맞을 경우만
INSERT, UPDATE 가능
VIEW에 대한 DML문 사용 규칙
★ VIEW가 다음 사항을 포함하는 경우 행의 삭제 불가
- JOIN조건, 그룹함수, GROUP BY절, DISTINCT명령
★ VIEW가 다음 사항을 포함하는 경우 데이터 수정 불가
- JOIN조건, 그룹함수, GROUP BY절, DISTINCT명령, 식으로 정의된 컬럼(EX SAL * 0.1)
★ VIEW가 다음 사항을 포함하는 경우 데이터 추가 불가
- JOIN조건, 그룹함수, GROUP BY절, DISTINCT명령, 식으로 정의된 컬럼,
VIEW에 선택되지 않는 NOT NULL컬럼
뷰의 정보 조회
USER_VIEWS 데이터 사전을 통해서 뷰에 대한 정보를 조회 할 수 있습니다.
SQL>SELECT view_name , text
FROM USER_VIEWS;
뷰의 삭제
SQL>DROP VIEW Read_Only;
[출처] View 테이블 Mssql |작성자 여유