MS-SQL Server 118

SQL Server 2008의 새로운 물리적 행 위치 함수

해외블로그에 SQL Server 2008 관련하여 재미있는 기능이 있어 소개합니다. SQL Server 2008 CTP6에서 제공하는 비문서화된 함수를 사용하여 데이터 조회시 각각의 행에 대해서 위치하고 있는 RID정보를 확인 할 수 있으며, 변경, 삭제시에도 행의 물리적 위치를 기반으로 데이터를 수정 할 수 있습니다. 하지만 RID기반으로 데이터를 조회시 RID 주소를 이용하여 데이터를 접근하는 것이 아닌 테이블을 SCAN 후 필터조건으로 빠지고 있습니다. 이렇게 되면, 그다지 의미가 있지 않을 것 같은데~ ㅡㅡ; 자세한 내용은 아래 테스트를 참조하세요. SQL Server 2008: New (undocumented) physical row locator function --버전 select @@VER..

MS-SQL Server 2008.03.20

프로시저 내 동적쿼리와 권한...

어제 밤, 프로시저와 동적쿼리에 관련하여 깊은 고찰을 하게 만든 일이 발생하였습니다. 상황을 시뮬레이션 하자면 다음과 같습니다. 계정 doddaria_reader 데이터베이스 DB_01 에 대한 권한은 db_datareader 입니다. (정적 쿼리에 한하여 오브젝트의 select 권한만 할당되어 있다는 얘기) EXEC sp_addlogin 'doddaria_reader', 'bangga810720' EXEC sp_adduser 'doddaria_reader','doddaria_reader','db_datareader' 해당 계정에 대해 별도로 SP 실행 권한을 부여했습니다. GRANT execute ON testSP_Update TO doddaria_reader 프로시저 testSP_Update 내부에는..

MS-SQL Server 2008.03.13

SQL Server 2008 새로운 기능 – INSERT 의 최소 로깅

SQL은 반듯이 데이터 변경에 따른 기록을 우선 로그 파일에 기록을 하게 됩니다.(Write Ahead Logging) 그리고 이러한 로그는 트랜잭션 롤백 또는 롤 포워드시에 사용하게 됩니다. 이러한 로깅으로 인해서 많은 데이터 변경 작업시 로그파일에 많은 IO가 발생하여, 전체적인 성능에 영향을 줄 수 있습니다. 그렇다면 굳이 로깅을 하지 않아도 되는 새로운 테이블에 데이터 추가 등에 대해서 최소로깅으로 처리한다면 보다 좋은 성능을 가질 수 있을것입니다. 최소 로깅이란 굳이 모든 데이터에 대해서 로깅할 필요가 없는 작업에 대해서 모든 데이터에 대해서 로깅을 하는 것이 아닌 할당 정보등에 대해서만 로깅을 하는 것입니다. 최소 로깅은 SIMPLE, BULK LOGGED 복구 모델에서만 할 수 있습니다. 보..

MS-SQL Server 2008.03.09

SQL2008 새로운 기능 - SSMS의 오류 목록 창

SQL Server 2005의 SQLWB는 이전 2000에서 사용하는 기능이 없어져 많이 불편하였습니다. 하지만 2008에서는 2000의 QA기능을 많은 기능을 가져온 듯하며, 기존의 좋은 기능뿐만 아니라 IntelliSense기능을 지원하여 보다 간편하게 T-SQL을 작성할 수 있습니다. (아직까지 좋은지는 잘 모르겠지만.) 그리고 오류 목록 창이라는 것이 추가 되었습니다. 작성 중인 T-SQL의 구문 오류에 대해서 보여주는 창입니다. 긴 T-SQL 구문에서 오류가 발생할 경우 유용하게 사용할 수 있을 것 같습니다. 아래는 BOL에 있는 내용~ 오류 목록의 기능 오류 목록은 다음 기능을 제공합니다. 스크립트를 편집할 때 오류 목록은 Transact-SQL 쿼리 편집기의 IntelliSense에 의해 생..

MS-SQL Server 2008.03.07

SQL Server 2008의 새로운 기능 - TABLE REBUILD

Heap인 테이블의 가변형 데이터 타입에 보다 큰 데이터로 변경하게 되면 클러스터 인덱스와 같은 페이지 분할이 아닌, 다른 곳으로 저장 후 포인터를 가지고 있는 Forward Pointer가 생기게 됩니다. 이로 인해서 적은 데이터를 읽을경우에도 포인터로 추가 컬럼에 대한 데이터도 엑세스 하는경우에는 성능에 문제가 있었습니다. 현재 운영중인 환경에서 얼마나 많은 Forward Pointer를 사용하여 데이터를 엑세스를 하는지 확인 하는 방법은 성능모니터에서 "SQL Server:Access Methods // Forwarded Records/sec" 의 값을 추가하여 확인할 수 있습니다. 이러한 Forward Pointer를 제거 하기 위해서는 SQL Server 2008이전에는 클러스터 인덱스를 만들거..

MS-SQL Server 2008.02.28

Sorted Seeks 에 대한 생각…

아래의 김정선님이 번역한 글을 참조하여, 테스트 및 고민을 하였습니다. 번역본: http://blog.naver.com/visualdb/50028175660 원문 : http://blogs.msdn.com/queryoptteam/archive/2006/04/12/575241.aspx 위에서 설명하는 비슷한 시나리오를 생각해 보면, 어떤 회사의 주문 테이블이 있고, 주문 테이블은 생성일 순으로 일련되게 데이터가 저장되고 있습니다. 생성일에 넌 클러스터 인덱스가 있으며, 데이터는 = 로 비교하며, 선택도는 0.5% 정도 입니다. 이런경우에 그냥 쿼리를 수행하여 처리하면, 각각의 환경마다 틀리겠지만 테이블 SCAN을 하여 쿼리의 결과를 던져 주게 됩니다. 하지만, 위와 같은 테이블이라면, 생성일로 걸려있는 넌..

MS-SQL Server 2008.02.21

단순 MIN, MAX의 사용 테스트

-- 적당히테이블생성 select identity(int,1,1) as n into nums from sysindexes A, sysindexes B, sysindexes C create clustered index idx_nums on nums (n) MIN, MAX중 하나만 select 하는 경우 select min(n) from nums with(nolock) where n between 1 and 50 음.. Seek해서 알아서 1개를 잘 가져온 다음 Aggregate로 min 값을 가져왔다. 어쨌든 명령이 min 이기 때문에 Aggregate로 min을 가져오게 된다. Min, Max 모두를 select 하는 경우 select min(n), max(n) from nums with(nolock) ..

MS-SQL Server 2008.02.01

Backup, Restore 의 MAXTRANSFERSIZE로 인한 성능

SQL Server 기본적으로 제공하는 백업, 복구 조금 느린감이 없지 않습니다. 느린 이유중의 가장 큰 원인은 IOSubsystem에서의 병목이 대부분입니다. 보통 이러한 문제는 초당 전송되는 양 보다 IO 요청 수로 인해 성능적 문제가 발생하고 있습니다. 보다 많은 데이터를 빠르게 이동하기 위해서는 보다 큰 블록을 사용하여 전송한다면 보다 많은 데이터를 빠르게 옮길 수 있습니다. (일반적인 내용입니다. 모든 시스템에 이와 같은 문제가 발생하는 것은 아님) 이러한 문제로 인해 대용량의 데이터를 빠르게 복구 및 백업을 하기 위해서 하드웨어에서 제공하는 백업 및 snap등의 솔루션등을 사용하고 있습니다. 하지만, 이것도 돈이 많이 드는 솔루션이라 쉽게 도입하기는 쉽지 않습니다. 그럼, SQL Server ..

MS-SQL Server 2008.01.22

SQL2008의 새로운 기능 - Composable DML

SQL Server 2005부터 OUTPUT절이 추가 되어 UPDATE, INSERT, DELETE 작업에 대한 대상 행을 테이블 변수로 저장하여 활용할 수 있었습니다. 하지만 대상 데이터를 다른 테이블에 저장하기 위해서는 테이블 변수로 저장 후 다시 저장해야 하는 번거로움이 있었습니다. 이러한 문제에 대해서 몇 가지 제한 사항이 존재 하지만 SQL Server 2008은 OUTPUT절을 포함하는 UPDATE, INSERT, DELETE, MERGE의 OUTPUT결과를 하나의 구문으로 다른 테이블에 저장할 수 있는 기능을 제공하고 있습니다. 해당 기능은 CTP5부터 지원되며, 보다 자세한 내용은 SQL Server 2008 BOL에서 INSERT 부분을 참고하세요. use tempdb go --drop ..

MS-SQL Server 2008.01.22