오라클에서는 TRUNC함수로 소수점 이하 자리 절삭을 하는데, SQLServer에서는 TRUNC함수가 없다.
그러면 어떻게 해야하는가? 이렇게 하면 된다.
SELECT ROUND(150.75665, 2, 1) > 150.75000
SELECT ROUND(150.75665, 2, 0) > 150.76000
정리하면...
ROUND ( numeric_expression, length [ , function ] )
numeric_expression 정확한 숫자 데이터 형식 또는 근사 숫자 데이터 형식이나 암시적으로 float로 변환할 수 있는 형식의 식입니다.
length numeric_expression을 반올림할 전체 자릿수입니다. length가 양수이면 numeric_expression은 length에 지정한 소수 자릿수로 반올림됩니다. length가 음수이면 numeric_expression은 length에서 지정한 대로 소수점 왼쪽이 반올림됩니다.
함수 수행할 연산 유형입니다. function를 생략하거나 그 값이 0(기본값)이면 numeric_expression이 반올림됩니다. 0 이외의 값을 지정하면 numeric_expression이 잘립니다.
소개. Visual Basic, ASP, VB.NET에서 ADO, ADO.NET을 이용한 Database 프로그램을 개발하는 경우 프로그램내에 SQL 구문을 문자열로 연결한 후, 실행하도록 구성한 코드를 많이 보게 된다.
이러한 코드 구성을 일반적으로 '동적 쿼리', '하드 코딩된 쿼리'라고 부른다.
ex. vb의 경우 Dim strSQL As String
strSQL="select orderid, orderdate, employeeid from orders" strSQL=strSQL+" where orderid=" & txtOrderID
cnn.Execute strSQL
그러나, 이러한 동적 쿼리의 사용은 가능한 배제하는 것이 권장 사항이다. 대신 SQL Server의 저장 프로시저를 이용해서, 처리 용량과 응답 속도의 향상 및 유지 보수 등, 저장 프로시저의 특징을 활용하는 것이다.
그러나, 설계상의 문제나 또는 고객의 다양한 요구 구현 방법상의 이질적 문제로 인해서 동적 쿼리를 써야된 되는 상황이 자주 발생한다. Q/A를 보면 질문의 유형 중에 이러 동적 쿼리 작성법에 대한 내용이 상당 부분을 차지하고 있다는 사실을 통해서도 알 수가 있다.
저장 프로시저를 통해서 코드를 구성하더라도, 저장 프로시저 내에서 다시 동적 쿼리를 사용하게 되는 경우도 발생한다. -온라인 설명서에는 이를 '런타임 시 명령문 작성'이라고 주제를 붙여놨다- 이 경우, SQL Server에서는 두 가지 명령을 사용할 수 있다. 바로 sp_executesql, exec() 두 가지이다.
클라이언트나 서버 사이드에서 동적 쿼리를 사용해야 하는 상황이 되었을 때, 즉, 저장 프로시저를 직접 사용할 수 없는 상황에서는 또 다른 해결 방법을 이용할 수 있다.
다음 두 가지 상황에서의 해결 방법이다.
- 클라인트 사이드에서 동적 쿼리가 필요한 경우 ADO, ADO.NET에서는 파라미터를 가진 동적 쿼리를 지정할 수 있으며, 일반적으로 아래와 코드 구성을 가진다.
1. ADO, ODBC, Command 오브젝트 연동 Dim strSQL As String
strSQL="select orderid, orderdate, employeeid from orders" strSQL=strSQL+" where orderid = ?"
2. ADO.NET, SqlClient 네임스페이스, SqlCommand 오브젝트와 연동 Dim strSQL As String
strSQL="select orderid, orderdate, employeeid from orders" strSQL=strSQL+" where orderid = @orderid"
위에 코드를 실행하면 실제 SQL Server에서는 sp_executesql 시스템 프로시저를 통해서 실행이 된다. 특히 ADO.NET의 경우는 디자인 타임에 'SqlDataAdapter Configuration Wizard'를 사용하게 되면 위와 같은 코드를 작성해 준다.
- SQL Server, 저장 프로시저에서 동적 쿼리가 필요한 경우 exec() 아니라 sp_executesql 시스템 프로시저를 이용한다.
결국, 클라이언트 사이드건 서버 사이드건 sp_executesql 이 사용되는 것을 알 수 있다. exec()를 쓴 경우와 sp_executesql를 사용한 경우의 성능과 SQL Server의 Cache 매니저의 상황 비교에 대한 내용을 마지막에 추가해 두었다.
일반적으로 sp_executesql은 exec() 비해 몇 가지 추가 장점을 제공한다.
- 쿼리문안에 매개변수(입력/출력)를 정의할 수 있다. - 매개변수 사용으로 인해 쿼리 최적화 프로그램이 컴파일된 실행 플랜을 재 사용할 확률이 높아진다.
실제로, exec()와 sp_executesql은 Cache 매니저의 처리 방법 및 활동 상태가 다르다는 것을 마지막에 추가한 성능 모니터링을 통해서 알 수가 있을 것이다.
이번 기회의 sp_executesql 시스템 프로시저 다양한 사용법과 관련 지식을 얻는데 미력하나마 도움이 되었으면 한다. 그럼, 구문부터 살펴보자.
인수설명. @stmt: T-SQL문 또는 배치 명령. ntext 형으로 변환될 수 있는 변수 또는 유니코드 상수 문자열. 내부에 @name 형식의 파라미터를 포함할 수 있다.
@params: @stmt에 포함된 모든 파라미터의 이름과 데이터 타입을 정의한다. @param1: @params 파라미터에서 첫번째 파라미터에 할당할 값 n : 각 파라미터에 대한 값을 할당한다.
참고. - UNICODE 문자열 상수를 지정할 때는 N'...'형식을 사용한다. sp_executesql 프로시저에 선언되어 있는 파라미터가 ntext형이기 때문에 문자열을 직접 지정하실 때는 위와 같은 형태를 사용하시면 됩니다.
- sp_executesql은 sql로 구성된 시스템 프로시저가 아니라, 확장 프로시저이다. */
/* 기본 예제. TOP 절의 값을 동적으로 지정하고자 하는 경우 (아래 구문은 set rowcount n 세션 옵션으로 대치할 수도 있다.) */ declare @cnt as nvarchar(5) declare @stmt as nvarchar(100) set @cnt = '5' set @stmt = 'select top ' + @cnt + ' * from northwind.dbo.orders'
exec sp_executesql @stmt
/* 기본 예제. 단순히 SQL을 동적으로 작성하고자 하는 경우로, @db의 값이 실행 시마다 다른 데이터베이스명이 올 수 있다고 가정한다. 테이블명은 동일한다. */ declare @db as nvarchar(20) declare @stmt as nvarchar(100) set @db = 'northwind' set @stmt = 'select * from '+ @db +'.dbo.orders'
exec sp_executesql @stmt
/* 기본 예제. 하나 이상의 명령을, 배치로 실행 */ declare @stmt as nvarchar(500) set @stmt = 'use northwind; ' set @stmt = @stmt + 'select top 5 * from dbo.orders where orderid=10248; ' set @stmt = @stmt + 'select top 5 * from dbo.[order details] where orderid=10248'
exec sp_executesql @stmt
/* 입력 파라미터를 적용한 예제.
@orderid 입력 파라미터를 이용해서 해당 주문 번호를 가진 [order details] 테이블의 주문 제품 정보를 출력 */ use northwind
declare @stmt as nvarchar(100) declare @params as nvarchar(100) set @stmt = 'select productid, quantity, unitprice from ' set @stmt = @stmt + 'dbo.[order details] where orderid=@orderid' set @params = '@orderid int'
exec sp_executesql @stmt, @params, @orderid=10248
/* 입력 파라미터를 적용한 예제.
위 예제를 실제로 저장 프로시저 안에서 연동한 경우. */ use northwind
create proc upOrderDetailsSel @porderid int as declare @stmt as nvarchar(100) declare @params as nvarchar(100) set @stmt = 'select productid, quantity, unitprice from ' set @stmt = @stmt + 'dbo.[order details] where orderid=@orderid' set @params = '@orderid int'
2. 로컬 변수를 액세스 할 수 없다. declare @chr char(3) set @chr = 'abc'
sp_executesql N'PRINT @CharVariable' GO
3. 현재 데이터베이스가 변경되지 않는다. use pubs go sp_executesql N'use northwind' select * from shippers -- shippers 테이블은 northwind에 있다. go
*/
/* 전문 개발자및 관리자를 위한 추가 정보
성능 비교. 만일, 여러분이 Windows NT/2000의 성능 모니터의 사용법을 알고 있다면, 아래 3가지 사용 예에 대한 모니터를 수행하고 각각 Cache Manager상의 활동이 어떻게 다른지를 비교 해 보면 많은 도움이 될 것이다.
아래에 성능 모니터에 모니터링할 관련 오브젝트 및 카운트을 적어 두었다. 성능 개체 SQL Server:Cache Manager - 모든 카운터 - 다음 목록에서 인스턴스 선택 _Total Adhoc Sql Plans Execution Context Procedure Plans 기타... (관심이 있다면)
참고. 3개의 방법을 개별적으로 테스트할 때, Procedure Cache상에 동일한 플랜이 재 사용되는 것을 방지하기 위해
DBCC FREEPROCCACHE
명령을 사용할 수 있다. 이 명령은 프로시저 캐시에서 모든 요소를 제거한다. 이 작업을 해 주어야, Cache Object Counter가 늘어나는 것을 볼 수 있다.
그리고, 현재 Cache된 Object에 대한 정보를 보고자 하는 경우 아래 의 쿼리를 이용하면 된다.
select * from master..syscacheobjects where dbid = db_id('northwind')
1. 저장 프로시저 테스트용 -- DROP PROC dbo.upOrderDetailsQuery CREATE PROC dbo.upOrderDetailsQuery @orderid int AS select productid, quantity, unitprice from dbo.[order details] where orderid = @orderid go
EXEC dbo.upOrderDetailsQuery @orderid = 10248
2. sp_executesql
USE Northwind
declare @stmt as nvarchar(100) declare @params as nvarchar(100) set @stmt = 'select productid, quantity, unitprice from ' set @stmt = @stmt + 'dbo.[order details] where orderid=@orderid' set @params = '@orderid int'
exec sp_executesql @stmt, @params, @orderid=10248 go
3. EXEC() 사용
USE Northwind
declare @stmt as nvarchar(100) declare @orderid varchar(10) set @orderid = '10248' set @stmt = 'select productid, quantity, unitprice from ' set @stmt = @stmt + 'dbo.[order details] where orderid = '+ @orderid
2. 서비스 창에 - SQL Server(ADMIN1) - SQL Server Agent(ADMIN1) - SQL Server Analysis Services(ADMIN1) - SQL Server FullText Search(ADMIN1) 등 의 서비스가 "시작됨"으로 되어있으면 정상적으로 설치된것이다. "ADMIN1"은 명명된 인스턴스로 설치했을 경우 입력한 이름입니다.
--현재 달의 첫 째날 구하기 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) --현재주의 월요일 구하기 SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) --현 재해의 첫 째날 구하기 SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) --현재분기의 첫 째날 구하기 SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0) --현재 날의 자정주의 구하기 SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)
select dateadd(ms,-3,DATEADD(mm,DATEDIFF(mm,0,getdate() ), 0)) --지난달의 마지막 날 구하기
select dateadd(ms,-3,DATEADD(yy,DATEDIFF(yy,0,getdate() ), 0)) --지난해의 마지막 날 구하기
select dateadd(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate() )+1, 0)) --현재 달의 마지막 날 구하기
select dateadd(ms,-3,DATEADD(yy,DATEDIFF(yy,0,getdate() )+1, 0)) --현재 해의 마지막 날 구하기
그럼 마지막으로 한번 더 응용해서 해당 달의 첫째 주 월요일을 구해보자 select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,6-datepart(day,getdate()),getdate())), 0) --현재 달의 첫째 주 월요일 구하기
- 지정한 데이터베이스에서 모든 개체의 할당과 구조적 무결성을 검사 - 데이터베이스안에 있는 모든 내용의 무결성을 검사 - 가장 안정한 복구문 - DBCC CHECKDB 문을 최근에 실행했다면 CHECKALLOC, CHECKTABLE 을 실행할 필요가 없다. - 병렬로 검사 수행 ( 추적 플래그 2528 을 쓰면 병렬검사를 해제할수 있다 )
- 검사내용 - 인덱스와 데이터 페이지가 제대로 연결되어있는가? - 인덱스 정렬순서가 제대로 인가? - 포인터가 일치하는가? - 각 페이지의 데이터가 적절한가? - 페이지 오프셋이 적절한가? ============================================================================
DBCC CHECKDB ( '데이터베이스명' [ , NOINDEX -- 시스템 테이블이 아닌 테이블의 클러스터되지 않은 인덱스를 검사하지 않도록 지정합니다. | { REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD } ] ) [ WITH { [ ALL_ERRORMSGS ] -- 개체당 오류수를 무제한으로 표시 [ , [ NO_INFOMSGS ] ] -- 모든 정보 메시지와 사용한 공간보고서를 표시안함 [ , [ TABLOCK ] ] -- 공유테이블 잠금 [ , [ ESTIMATEONLY ] ] -- DBCC CHECKDB 실행에 필요한 tempdb 공간의 예상크기와 지정된 다른 옵션을 모두 표시 [ , [ PHYSICAL_ONLY ] ] -- 검사를 제한 (페이지와 레코드헤더의 실제구조의 무결성, 페이지의 개체ID 와 인덱스 ID 간의 일관성 및 할당구조로 검사를 제한 } ]
- 지정한 테이블이나 인덱스된 뷰에 대해 데이터, 인덱스, text, ntext, image 페이지의 무결성을 검사합니다. - 검사내용 - 인덱스와 데이터 페이지가 제대로 연결되어 있는가? - 인덱스 정렬순서가 제대로 되어 있는가? - 포인터가 일치하는가? - 각 페이지의 데이터가 적절한가? - 페이지 오프셋이 적절한가?
- 테이블 잠금을 얻지 못하여 데이터 변경은 허용되지만 메타데이터의 변경을 방지하는 스키마 잠금을 허용 ============================================================================
DBCC CHECKTABLE ( '테이블이름' | '뷰명'
[ , NOINDEX | index_id -- 인덱스 ID 번호 | { REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD } ]
- 프로시저 캐시에서 모든 요소를 제거 - 프로시저 캐시를 해제하면 임의 SQL 문이 캐시에서 다시 사용되지 않고 다시 컴파일됩니다. ============================================================================
- 지정한 테이블이나 뷰의 클러스터된 인덱스와 보조 인덱스의 조각을 모음 - 인덱스 스캔성능을 향상시키기 위해 페이지의 물리적 순서가 왼쪽에서 오른쪽으로 잎 노드의 논리적 순서와 일치하다고 인덱스 잎 수준의 조각을 모음 ============================================================================
- 클라이언트에서 MSSQL 로 보낸 최종 명령문을 표시 - SP_WHO2 를 이용해서 spid 를 얻은후에 해당 spid 쿼리를 볼 수 있다. - EventType, Parameters, EventInfo ============================================================================
- 테이블을 메모리에 고정 (플러시 하지 않음) - 정말 자주 쓰이는 테이블의 경우 - 주의 : PINTABLE 은 성능을 향상시킬 수 있지만 주의해서 사용해야 합니다. 커다란 테이블을 고정할 경우 많은 용량의 버퍼캐시를 사용하므로 다른 테이블에서 사용할 캐시가 부족하게 되어 성능저하가 발생 할 수 있음.
- UNPINTABLE 로 해제 ============================================================================
- 프로시저 캐시에 대한 정보를 테이블 형식으로 반환 - SQL Server 성능 모니터는 프로시저 캐시에 대한 정보를 얻기위해 DBCC PROCCACHE 를 사용함 - 결과 집합
num proc buffs 프로시저 캐시에 저장할 수 있는 저장 프로시저의 개수 num proc buffs used 저장 프로시저를 보관하는 캐시 슬롯의 개수 num proc buffs active 현재 실행 중인 저장 프로시저를 보관하는 캐시 슬롯의 개수 proc cache size 프로시저 캐시의 전체 크기 proc cache used 저장 프로시저를 보관하는 프로시저 캐시의 용량 proc cache active 현재 실행 중인 저장 프로시저를 보관하는 프로시저 캐시의 용량
Updated 통계가 마지막으로 업데이트된 날짜와 시간 Rows 테이블의 행 수 Rows Sampled 통계 정보를 위해 샘플링된 행 수 Steps 배포 단계 수 Density 첫 번째 인덱스 열 접두사의 선택도(자주 사용하지 않음) Average key length 첫 번째 인덱스 열 접두사의 평균 길이 All density 인덱스 열 접두사 집합의 선택도(자주 사용함) Average length 인덱스 열 접두사 집합의 평균 길이 Columns 전체 밀도 및 평균 길이가 표시되는 인덱스 열 접두사의 이름 RANGE_HI_KEY 히스토그램 단계의 상위 바운드 값 RANGE_ROWS 상위 바운드를 제외한 히스토그램 단계에 해당하는 예제의 행 수 EQ_ROWS 히스토그램 단계의 상위 바운드 값과 동일한 예제의 행 수 DISTINCT_RANGE_ROWS 상위 바운드를 제외한 히스토그램 단계에 있는 고유한 값 수 AVG_RANGE_ROWS 상위 바운드(DISTINCT_RANGE_ROWS에 대해 RANGE_ROWS / DISTINCT_RANGE_ROWS > 0)를 제외한, 히스토그램 단계에 있는 중복 값의 평균 수
- 지정한 테이블의 데이터와 인덱스에 대한 조각화 정보를 표시 - 인덱스가 심하게 조각난 경우에 조각난 정보를 감소시키는 방법 - 클러스터된 인덱스를 삭제한 후 다시 만듬 - DBCC INDEXDEFRAG | DBCC DBREINDEX 로 인덱스 다시 구성 - 결과집합
Pages Scanned 테이블이나 인덱스의 페이지 수입니다.
Extents Scanned 테이블이나 인덱스의 익스텐트 수입니다.
Extent Switches DBCC 문이 테이블이나 인덱스 페이지를 스캔하는 동안의 익스텐트 전환 횟수입니다.
Avg. Pages per Extent 페이지 체인에서 익스텐트 당 페이지 수입니다.
Scan Density [Best Count: Actual Count] Best count는 모든 데이터가 인접하여 있는 경우 이상적인 익스텐트 변경 횟수이고 Actual count는 실제 익스텐트 변경 횟수입니다. 스캔 밀도가 100이면 모든 데이터가 인접해 있고 100보다 작으면 일부 데이터가 조각화된 것입니다. 스캔 밀도는 % 단위입니다.
Logical Scan Fragmentation 인덱스의 잎 페이지 스캔에서 반환된 순서가 바뀐 페이지의 비율입니다. 이 값은 힙이나 텍스트 인덱스와는 관계가 없습니다. (순서가 바뀐 페이지란 IAM에 지정된 다음 페이지가 잎 페이지의 다음 페이지 포인터에서 가리키는 페이지와 다른 경우입니다.)
Extent Scan Fragmentation 인덱스의 잎 페이지 스캔에서 순서가 바뀐 익스텐트의 비율입니다. 이 값은 힙과는 관계가 없습니다. (순서가 바뀐 익스텐트란 인덱스의 현재 페이지가 포함된 익스텐트가 물리적으로 이전 페이지가 포함된 익스텐트의 다음 익스텐트가 아닌 경우입니다. )
Avg. Bytes free per page 스캔된 페이지에서 사용 가능한 평균 바이트 수입니다. 이 값이 클수록 페이지의 채우기 비율이 낮으므로 값이 작을수록 좋습니다. 이 값은 행 크기에 따라 달라지며 행 크기가 크면 값이 커집니다.
Avg. Page density (full) 평균 페이지 밀도입니다(단위: %). 이것은 행 크기를 고려한 값이므로 페이지의 채우기 비율을 더욱 정확하게 알 수 있습니다. 값이 클수록 좋습니다.
- 지정한 데이터베이스에서 데이터 파일의 크기를 축소시킴 - 파일 단위로 데이터 파일을 축소 - 데이터 파일과 로그파일의 대상 크기는 파일의 최소크기보다 작을수 없음 - NOTRUNCATE / TRUNCATEOLNY 는 데이터파일에는 적용되나 로그파일에는 적용되지 않는다. ============================================================================
- 관련 데이터베이스에 대해 지정한 데이터 파일이나 로그파일의 크기를 축소 시킴 ============================================================================
DBCC SHRINKFILE ( { 파일이름 | 파일아이디 } { [ , 변경할크기 ] | [ , { EMPTYFILE -- 지정한 파일의 모든 데이터를 동일한 파일 그룹의 다른파일로 마이그레이션, 더 이상 데이터를 저장할 수 없음. | NOTRUNCATE -- 해제된 파일 공간을 파일에 보유 | TRUNCATEONLY -- 해제된 파일 공간을 운영체제에 반환 } ] } )
Database Name 로그 통계가 표시될 데이터베이스의 이름입니다. Log Size(MB) 로그에 사용 가능한 실제 공간의 크기입니다. Microsoft?? SQL Server™는 내부 헤더 정보를 위해 적은 양의 디스크 공간을 예약하므로 이것은 로그 공간에 원래 할당된 크기보다 작습니다. Log Space Used (%) 로그 파일에서 현재 트랜잭션 로그 정보가 차지하는 비율입니다. Status 로그 파일의 상태입니다(항상 0임).
- DBCC SQLPERF(UMSSTATS) : This Option returns data about SQL Server thread management.
결과 집합
Statistic Value -------------------------------- ------------------------ Scheduler ID 0.0 num users 18.0 -- This is the number of SQL Server threads currently in the scheduler. num runnable 0.0 -- This is the number of actual SQL Server threads that are runnable. num workers 13.0 -- This is the actual number of worker there are to process threads. (This is the size of the thread pool.) idle workers 11.0 -- The number of workers that are currently idle. work queued 0.0 cntxt switches 2.2994396E+7 -- The number of context switches between runnable threads. cntxt switches(idle) 1.7793976E+7 -- The number of context switches to the idle thread. Scheduler ID 1.0 num users 15.0 num runnable 0.0 num workers 13.0 idle workers 10.0 work queued 0.0 cntxt switches 2.4836728E+7 cntxt switches(idle) 1.6275707E+7 Scheduler ID 2.0 num users 17.0 num runnable 0.0 num workers 12.0 idle workers 11.0 work queued 0.0 cntxt switches 1.1331447E+7 cntxt switches(idle) 1.6273097E+7 Scheduler ID 3.0 num users 16.0 num runnable 0.0 num workers 12.0 idle workers 11.0 work queued 0.0 cntxt switches 1.1110251E+7 cntxt switches(idle) 1.624729E+7 Scheduler Switches 0.0 Total Work 3.1632352E+7
- DBCC SQLPERF(WAITSTATS) : This Option returns data about wait types for SQL Server resources.
- DBCC SQLPERF(IOSTATS) : This Option returns data about outstanding SQL Server reads and writers.
- DBCC SQLPERF(RASTATS) : SQL Server read-ahead activity
- DBCC SQLPERF(THREADS) : I/O, CPU, and memory usage per SQL Server Thread.
- sp_spaceused 시스템 저장프로시저에서 잘못된 공간 사용정보가 보고되도록 하는 sysindexes 테이블의 부정확성을 보고하고 수정 - 테이블과 클러스터된 인덱스에 대해 sysindexes 테이블의 rows, used, reserved, dpages 열을 수정함 ============================================================================
DBCC UPDATEUSAGE ( { 'database_name' | 0 } [ , { 'table_name' | 'view_name' } [ , { index_id | 'index_name' } ] ] ) [ WITH [ COUNT_ROWS ] -- sysindexes 의 rows 열이 테이블이나 뷰의 현재 행 개수로 업데이트되도록 지정함. 단 indid 가 0 또는 1 인 sysindexes 행에만 작용 (커다란테이블과 인덱스된 뷰의 성능에만 영향을 줌) [ , NO_INFOMSGS ] -- 모든 정보 메시지를 표시하지 않음 ]
- 현재 버퍼캐시안에 있는 오프젝트에 대한 정보를 보여줌 - hit rates - compiled objects and plans
- 결과집합 - Hit Ratio : Displays the percentage of time that this particular object was found in SQL Server's cache. The bigger this number, the better
- Object Count : Displays the total number of objects of the specified type that are cached.
- Avg. Cost : A value used by SQL Server that measures how long it takes to compile a plan, along with the amount of memory needed by the plan. This value is used by SQL Server to determine if the plan should be cached or not.
- Avg. Pages : Measures the total number of 8K pages used, on average, for cached objects.
- LW Object Count, LW Avg Cost, WL Avg Stay, LW Ave Use : All these columns indicate how many of the specified objects have been removed from the cache by the Lazy Writer. The lower the figure, the better.
- 버퍼 캐시안에 있는 메모리 상태를 보여줌 - Buffer Distribution Buffer Counts Procedure Cache Dynamic Memory Manager Global Memory Objects Query Memory Objects Optimization Queue
DBCC PAGE ( {dbid|dbname} , pagenum - 페이지넘버 [, print option ] - 페이지 헤더 정보를 출력하는 옵션 0 : This option causes DBCC PAGE to print out only the page header information. (default) 1 : page header information, each row of information from the page, and then page's offset table. 2 : the same as option 1, except a single block of information (rather then separating the individual rows)
[, cache ] - 0 : 디스크로부터 페이지 번호를 반환 1 : 캐시로 부터 페이지 번호를 반환 (default)
[, logical ] - 0 : virtual page number 1 : logical page number )
- ad-hoc , prepared Transact-SQL 구문이 어떻게 캐싱이 되는 지를 알수 있도록 함 - 결과집합 Memory Used (8k Pages) - 메모리 페이지의 사용량 Number CSql Objects - 캐시된 전체 수 Number False Hits - Hit 실패수 (적을수록 좋다) ============================================================================
- This Command can be used to display buffer headers and pages from the buffer cache.
- ex ) DBCC TRACEON (3604) DBCC BUFFER(master, 'sysobjects') ============================================================================
DBCC BUFFER ( [dbid | dbname] [, objid | objname ] [, nbufs] -- number of buffers to examine [, printopt ] -- 0 : print out only the buffer header and page header (default) -- 1 : print out each row separately and the offset table -- 2 : print out each row as a whole and the offset table )
- This command is used to view the transaction log for the specified database.
- ex ) DBCC TRACEON (3604) DBCC LOG (master) ============================================================================
DBCC LOG ( [ dbid | dbname ] [, type ] -- 0 : minimum infomation (operation, context, transaction id) -- 1 : more information ( plus flags, tags, row length, description ) -- 2 : very detailed infomation (plus object name, index name, page id, slot id) -- 3 : full information about each operation -- 4 : full information about each operation plus hexadecimal dump of then current transaction log's row -- -1 : full information about each operaion plus hexadecimal dump of then current transaction log's row, plus Checkpoint Begin, DB version, Max XDESID )
- This command shows the server's level RESOURCE, PERFMON, and DS_CONFIG information. RESOURCE - shows addresses of various data structures used by the server. PERFMON - structure contains master..spt_monitor field info. DS_CONFIG - structure contains master..syscurconfigs field information.
- ex ) DBCC TRACEON (3604) DBCC RESOURCE ============================================================================
- view the data pages structure (in comparison with DBCC PAGE, this command will return information about all data pages for viewed table, not only for particular number)
- ex ) DBCC TRACEON (3604)
DECLARE @dbid int , @objectid int select @dbid = DB_ID('master') select @objectid = OBJECT_ID('sysdatabases')
tempdb는 단어 그대로 임시로 사용하는 DB이다. 즉 MASTER DB처럼 항상 사용하는 것이 아니라 임시테이블을 만든다거나, 대형쿼리, 다단계쿼리 또는 SELECT시 order by, group by, sorting을 할 때 주로 사용된다. 임시로 사용된다는 것은 이곳에 있는 데이터베이스 객체도 영구적이 아니라는 말도 된다. 즉, SQL Service가 시작될 때마다 자동적으로 지워지고 다시만들어진다. 그래서 당연히 여기에다가 테이블등의 객체를 만들면 안된다.
-- 각각의 데이터와 로그파일을 한 번에 하나씩 새로운 위치로 이동한다.
USE master GO
ALTER DATABASE tempdb MODIFY FILE ( NAME= logical_name, FILENAME="new_path/file_name") GO
ALTER DATABASE tempdb MODIFY FILE ( NAME= logical_name, FILENAME="new_path/file_name") GO
예) USE master GO
-- tempdb 데이터베이스의 논리 파일 이름을 확인. exec tempdb..sp_helpfile
-- 위치변경 ALTER DATABASE tempdb MODIFY FILE ( NAME= tempdev, FILENAME="D:\tempdb.mdf") GO
ALTER DATABASE tempdb MODIFY FILE ( NAME= templog, FILENAME="D:\templog.ldf") GO
Leave your greetings.