'Transact-SQL'에 해당되는 글 32건

  1. ORIGINAL_LOGIN() 와 SUSER_SNAME() 차이
  2. 쥑이는 SCRIPT
  3. sp_configure 마지막 변경일
  4. SQLServer365 A Script A Day
  5. 최신 진단쿼리
  6. SQL 로그인 계정 비밀번호 변경 일시 알아내기
  7. Clustered Index Rebuild시 UNIQUIFIER Key 값이 변할까요 안 변할까요??
  8. 인덱스를 리빌드 + 통계 업데이트를 한꺼번에^^
  9. Top 10 Dev Mistakes That Don’t Scale
  10. process kill 시켜주는 명령어

※. 원본 글

http://blog.sqlauthority.com/2012/07/28/sql-server-difference-between-original_login-and-suser_sname/

 

 

ORIGINAL_LOGIN() 와 SUSER_SNAME() 함수의 차이가 무엇일까요?

 

ORIGINAL_LOGIN() : SQL Server의 인스턴스에 연결된 로그인의 이름을 반환합니다. 이 함수를 사용하여 명시적 또는 암시적 컨텍스트 전환이 많은 세션의 원래 로그인 ID를 반환

 

SUSER_SNAME() : 사용자의 로그인 ID 이름을 반환합니다.

 

결론, 함수 차이는 로그인 정보를 변경했을 원래 로그인 ID 반환하느냐의 차이입니다.


잼있네요!!  



'Transact-SQL' 카테고리의 다른 글

group by 빨리 처리하기  (0) 2012.09.11
How to Recycle SQL Server error logs – 5 Types of logs  (1) 2012.09.03
쥑이는 SCRIPT  (0) 2012.06.28
sp_configure 마지막 변경일  (0) 2012.05.15
SQLServer365 A Script A Day  (0) 2012.05.12

쥑이는 SCRIPT

DBA에게 필수!! 설치 이후 설정 및 기능 확인하는 경우가 많은데 이런 Script를 Amit Banerjee라는 분이 공유하셨네요. 이것을 응용해서 이런 저런거 만들어 놔야징.ㅋㅋ


■ SQL Feature Discovery Script

http://troubleshootingsql.com/2012/06/27/sql-feature-discovery-script/


■ Initial Data Collection Script

http://troubleshootingsql.com/2010/01/21/initial-data-collection-script/



'Transact-SQL' 카테고리의 다른 글

How to Recycle SQL Server error logs – 5 Types of logs  (1) 2012.09.03
ORIGINAL_LOGIN() 와 SUSER_SNAME() 차이  (0) 2012.07.30
sp_configure 마지막 변경일  (0) 2012.05.15
SQLServer365 A Script A Day  (0) 2012.05.12
최신 진단쿼리  (0) 2012.05.08

안녕하세요. 주디아줌마입니다.

파울아저씨는 정말 대단합니다. sp_configure의 마지막 변경일 정보를 확인하는 쿼리를 만드셨네요. 이 분의 열정은 정말 대단하네요. 


sp_cofigure 정보 확인하러 가기....

http://www.sqlskills.com/BLOGS/PAUL/post/When-were-the-sp_configure-options-last-changed.aspx


'Transact-SQL' 카테고리의 다른 글

ORIGINAL_LOGIN() 와 SUSER_SNAME() 차이  (0) 2012.07.30
쥑이는 SCRIPT  (0) 2012.06.28
SQLServer365 A Script A Day  (0) 2012.05.12
최신 진단쿼리  (0) 2012.05.08
SQL 로그인 계정 비밀번호 변경 일시 알아내기  (0) 2012.04.10

SQLServer365 A Script A Day

http://sqlserver365.blogspot.com/ 사이트 주인 아저씨 "Chris McGowan"가 연재식으로해서 Script 정보를 공유해주셨네요^^

괜찮은 스크립트들이 많이 보이는데. 예, DB 복구 할때 남은 시간 보기 등등....


SQLServer365 - AScriptADay.pdf

Table of Contents

A Script a Day Series ......................................................................................................... 3

Script 1 - Server volume to database file mapping ............................................................. 5

Script 2 – Database Mail Troubleshooting ......................................................................... 7

Script 3 - Live Change Data Edit Script Template ................................................................ 9

Script 4 – Estimated Time to Complete............................................................................ 11

Script 5 – Database Owner Permissions .......................................................................... 12

Script 6 – Drop And Create Database Snapshots .............................................................. 13

Script 7 – Memory Queries ............................................................................................. 19

Script 8 – Non Clustered Index Information ..................................................................... 24

Script 9 - Index Compression Estimations ........................................................................ 26

Script 10 – Hosts on vCentre ........................................................................................... 29

Script 11 – User Permissions By Database ....................................................................... 31

Script 12 – Granting Role Membership to All Principals ................................................... 33

Script 13 – Chris' Top Tip - Batches .................................................................................. 37

Script 14 – Upgrading to SQL 2012 .................................................................................. 38

Script 15 – Untrusted Check Constraints ......................................................................... 42

Script 16 – Restore Database .......................................................................................... 44

Script 17 – Possible Poor Indexes .................................................................................... 46

Script 18 – Viewing System Configuration ....................................................................... 47

Script 19 – Remove Virtual Subscriptions ........................................................................ 48

Script 20 – User Database VLF Count ............................................................................... 51

Script 21 – HAVING Clause .............................................................................................. 53

Script 22 – Backup Database ........................................................................................... 55

Script 23 – Find an Object in Job Steps ............................................................................ 56

Script 24 – Object Qualification ....................................................................................... 57

Script 25 – Performance Counters ................................................................................... 61

Script 26 – RESTART a Database Restore ......................................................................... 63

Script 27 – Missing Database Backups ............................................................................. 65

Script 28 – String Manipulation ....................................................................................... 67

Script 29 – The Importance of Being Idle ......................................................................... 68


다운로드는 아래에서 할 수 있어요.

http://www.fileswap.com/dl/FCg84QounN/SQLServer365_-_AScriptADay.pdf.html


최신 진단쿼리

최근 보안 관련 자료 수집 중 패스워드 변경일시를 알아내는 함수가 있는 것을 확인했다. 패스워드가 변경되거나 로그인 정보가 변경되면 modify_date의 날짜도 변경되는데, 패스워드에 대한 마지막 변경일시를 확인할 때 유용할 것 같다.

select
        name,
	modify_date, 
	LOGINPROPERTY(name, 'PasswordLastSetTime'),
	DATEDIFF(DD,  CONVERT(SMALLDATETIME, LOGINPROPERTY(name, 'PasswordLastSetTime')), GETDATE())
from sys.server_principals
where type ='S'
	and is_disabled = 0



안녕하세요. 주디아줌마입니다^^

CLUSTERED INDEX KEY값이 유니크하지 않을때 UNIQUIFIER컬럼 정보가 생성됩니다.
클러스터드 인덱스 값을 변경할때 UNIQUIFIER값도 변할까요 안 변할까요? (이거 올려두고 혼나는거 아냐? ㅠㅠ) 당연한 것을? 
인덱스 재작성시 해당 UNIQUIFIER Key(KeyHashValue) 값도 변할까요?
 

-- ===================================================================

-- CLUSTERED INDEX의 값이 변경될때~ NONCLUSTERED INDEX의 UNIQUIER 값이 변경 되느냐?

-- Update : 주디아줌마

-- Update Date : 2011.08.02

-- Desc : 

--

--

-- ===================================================================



use master

go


SET NOCOUNT ON;

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

GO


drop database indextest

go


-- TSQL Script

create database indextest

go

 

 

use indextest

go

 

 

-- create the index after loading the data

drop table t_ci

go

 

create table t_ci (c1 int, c2 char (100), c3 int, c4 varchar(1000))

go

 

 

-- load the data

declare @i int

select @i = 0

while (@i < 1000)

begin

insert into t_ci values (@i, 'hello', @i+10000, replicate ('a', 100))

set @i = @i + 1

end


-- create the clustered index

create clustered index ci on t_ci(c1)

go


-- nonclustered index

create index ni on t_ci(c3)

go


DBCC SHOW_STATISTICS ('t_ci', ci);

GO

DBCC SHOW_STATISTICS ('t_ci', ni);

GO


-- c1, c3 column 정보들의 데이타 값은 유니크 합니다


------------------------------------------------------------------------------------------------------------------

-- ##. 조각 데이타 확인


--dbcc ind option indid

--0 : 힙상의 데이터

--1 : 클러스터된 인덱스

--2 ~ 251 : 클러스터되지 않은 인덱스 또는 통계

--255 : text, ntext, image형의 데이터 


--DBCC PAGE (DB Name, File Number, Page Number, Option) - 페이지 내용 보기

--Option

-- 0 : Header

-- 1 : Row 단위

-- 2 : page 그래도

-- 3 : 행 그리고 컬럼 값


--DBCC TRACEON(3604) -- 한 화면에 출력

------------------------------------------------------------------------------------------------------------------


-- 루트 페이지

DBCC ind ( indextest, t_ci, 2)

GO   


--PageFID PagePID IAMFID IAMPID ObjectID IndexID PartitionNumber PartitionID iam_chain_type PageType IndexLevel NextPageFID NextPagePID PrevPageFID PrevPagePID

--1 119 NULL NULL 2121058592 2 1 72057594038976512 In-row data 10 NULL 0 0 0 0

--1 118 1 119 2121058592 2 1 72057594038976512 In-row data 2 0 1 120 0 0

--1 120 1 119 2121058592 2 1 72057594038976512 In-row data 2 0 0 0 1 118

--1 121 1 119 2121058592 2 1 72057594038976512 In-row data 2 1 0 0 0 0


-- 루트 페이지 정보 검색

DBCC TRACEON(3604)

DBCC page(indextest, 1, 121, 3)

go


--FileId PageId Row Level ChildFileId ChildPageId c3 (key) c1 (key) UNIQUIFIER (key) KeyHashValue

--1 121 0 1 1 118 NULL NULL NULL NULL

--1 121 1 1 1 120 10578 578 0 NULL


-- 논 리프 페이지 

DBCC page(indextest, 1, 120, 3)

go



--FileId PageId Row Level c3 (key) c1 (key) UNIQUIFIER (key) KeyHashValue

--1 120 0 0 10578 578 0 (386f53916731)

--1 120 1 0 10579 579 0 (e5686b95e8c9)

--1 120 2 0 10580 580 0 (f47fc3894522)

--1 120 3 0 10581 581 0 (2978fb8dcada)

--1 120 4 0 10582 582 0 (4f70b3815bd3)

--1 120 5 0 10583 583 0 (92778b85d42b)

--1 120 6 0 10584 584 0 (6c5ee3b80104)

--1 120 7 0 10585 585 0 (b159dbbc8efc)

--1 120 8 0 10586 586 0 (d75193b01ff5)

--1 120 9 0 10587 587 0 (0a56abb4900d)

--1 120 10 0 10588 588 0 (1b4103a83de6)

--1 120 11 0 10589 589 0 (c6463bacb21e)

--1 120 12 0 10590 590 0 (a04e73a02317)

--1 120 13 0 10591 591 0 (7d494ba4acef)

--1 120 14 0 10592 592 0 (eee518b8dc9a)

--1 120 15 0 10593 593 0 (33e220bc5362)

------------------------------------------


-- c1값이 모두 유니크 함으로 UNIQUIFIER(Key) 값은 모두 0입니다. 

-- KeyHashValue Value 



UPDATE t_ci

SET

c1 = 9000

WHERE c1 IN ( 578, 579)

GO


-- 논 리프 페이지 

DBCC page(indextest, 1, 120, 3)

go


--FileId PageId Row Level c3 (key) c1 (key) UNIQUIFIER (key) KeyHashValue

--1 120 1 0 10578 9000 0 (15af3e99462f)

--1 120 3 0 10579 9000 1 (dfcb6fa8dd0b)

--1 120 4 0 10580 580 0 (f47fc3894522)


-- UNIQUIFIER, KeyHashValue 값이 변경되었죠? 동일한 값을 구분하기 위해 구분자가 있는 것 같습니다.

GO


-- 조각 구성을 다시 해보았습니다.

create clustered index ci on dbo.t_ci( c1) 

with drop_existing

go


-- 논 리프 페이지 

DBCC page(indextest, 1, 120, 3)

go


--FileId PageId Row Level c3 (key) c1 (key) UNIQUIFIER (key) KeyHashValue

--1 120 0 0 10578 9000 0 (15af3e99462f)

--1 120 1 0 10579 9000 1 (dfcb6fa8dd0b)

--1 120 2 0 10580 580 0 (f47fc3894522)

--1 120 3 0 10581 581 0 (2978fb8dcada)

--1 120 4 0 10582 582 0 (4f70b3815bd3)


변화가 없습니다.^^
결론은 데이타가 변하지 않은 이상 WITH DROP_EXISTING으로 재작성시 변화는 없다는 결론입니다.^^ 



 

DBA의 통상점검 작업 중 하나인 인덱스 리빌드와 통계 업데이트를 한번에 처리할 수 있는 프로시져입니다.

1. 기능 
가. Fragmentation >=30 AND PAGES>1000 일때 rebuild
나. Fragmentation between 15 to 29 AND PAGES>1000 일때 reorganize&updatestatistics
다. 가와 나의 조건에 들어가지 있는 다면, update the statistics
  

2. 원본 소스
   http://www.sqlservercentral.com/scripts/automated+index+defragmentation+script/68802/

3. Version
   SQL2005, SQL2008

4. Source
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROC [dbo].[sp_indexdefragmentation]
	@p_dbname SYSNAME = 'NL'
	, @p_Fillfactor	TINYINT = 80
/*
	Summary: Remove the Index Fragmentation to improve the query performance
	Contact: Muthukkumaran Kaliyamoorhty SQL DBA
	Description: This Sproc will take the fragmentation details and do four kinds of work.
	 1. Check the fragmentation greater than 30% and pages greater than 1000 then rebuild
	 2. Check the fragmentation between 15% to 29% and pages greater than 1000 then reorganize
	 3. Check the fragmentation between 15% to 29% and pages greater than 1000 and page level lock disabled then rebuild
	 4. Update the statistics if the three conditions is false
	ChangeLog:
	Date Coder Description
	2011-11-23 Muthukkumaran Kaliyamoorhty created	
	*************************All the SQL keywords should be written in upper case*************************
	
	참고 URL : http://www.sqlservercentral.com/scripts/automated+index+defragmentation+script/68802/
	최종 수정일 : 2011-04-28
	최종 수정자 : 주디아줌마
*/
AS
BEGIN
	SET NOCOUNT ON;

	IF @p_dbname = 'NL'
		SET @p_dbname = DB_NAME();

	DECLARE @a_Fillfactor VARCHAR(30)
	SET @a_Fillfactor = CONVERT(VARCHAR(30), @p_Fillfactor);


	DECLARE
	@db_name SYSNAME,
	@tab_name SYSNAME,
	@ind_name VARCHAR(500),
	@schema_name SYSNAME,
	@frag FLOAT,
	@pages INT,
	@min_id INT,
	@max_id INT

	SET @db_name=@p_dbname

	--------------------------------------------------------------------------------------------------------------------------------------
	--inserting the Fragmentation details
	--------------------------------------------------------------------------------------------------------------------------------------
	CREATE TABLE #tempfrag
	(
		id INT IDENTITY,
		table_name SYSNAME,
		index_name VARCHAR(500),
		frag FLOAT,
		pages INT,
		schema_name SYSNAME
	)

	EXEC ('USE ['+@db_name+'];
		INSERT INTO #tempfrag (table_name,index_name,frag,pages,schema_name)
		SELECT OBJECT_NAME(F.OBJECT_ID) obj,i.name ind,
		f.avg_fragmentation_in_percent,
		f.page_count,table_schema
		FROM SYS.DM_DB_INDEX_PHYSICAL_STATS (DB_ID(),NULL,NULL,NULL,NULL) F
		JOIN SYS.INDEXES I
		ON(F.OBJECT_ID=I.OBJECT_ID)AND i.index_id=f.index_id
		JOIN INFORMATION_SCHEMA.TABLES S
		ON (s.table_name=OBJECT_NAME(F.OBJECT_ID))
		AND f.database_id=DB_ID()
		AND OBJECTPROPERTY(I.OBJECT_ID,''ISSYSTEMTABLE'')=0
		WHERE F.index_id > 0 AND F.index_id <= 10000	'	
	)

	SELECT @min_id=MIN(ID)FROM #tempfrag
	SELECT @max_id=MAX(ID)FROM #tempfrag

	-- TRUNCATE TABLE msdb.dbo.dba_defrag_maintenance_history

	WHILE (@min_id<=@max_id)
	BEGIN

		SELECT
			@tab_name=table_name,
			@schema_name=schema_name,
			@ind_name=index_name ,
			@frag=frag ,
			@pages=pages
		FROM #tempfrag WHERE id = @min_id

		--------------------------------------------------------------------------------------------------------------------------------------
		--Check the fragmentation greater than 30% and pages greater than 1000 then rebuild
		--------------------------------------------------------------------------------------------------------------------------------------

		IF (@ind_name IS NOT NULL)
		BEGIN
			IF (@frag>=30 AND @pages>1000)
			BEGIN
				EXEC ('USE ['+@db_name+'];ALTER INDEX ['+@ind_name+'] ON ['+@schema_name+'].['+@tab_name +'] REBUILD WITH ( FILLFACTOR = ' + @a_Fillfactor + ' ) ')
				--INSERT INTO msdb.dbo.dba_defrag_maintenance_history
				--VALUES (@db_name,@tab_name,@ind_name,@frag,@pages,'REBUILD',GETDATE())
				
				PRINT 'USE ['+@db_name+'];ALTER INDEX ['+@ind_name+'] ON ['+@schema_name+'].['+@tab_name +'] REBUILD WITH ( FILLFACTOR = ' + @a_Fillfactor + ' ) '
			END
		--------------------------------------------------------------------------------------------------------------------------------------
		--Check the fragmentation between 15% to 29% and pages greater than 1000 then reorganize
		--------------------------------------------------------------------------------------------------------------------------------------
		ELSE IF((@frag BETWEEN 15 AND 29) AND @pages>1000 )
		BEGIN
			BEGIN TRY
				EXEC ('USE ['+@db_name+'];ALTER INDEX ['+@ind_name+'] ON ['+@schema_name+'].['+@tab_name +'] REORGANIZE '  )
				EXEC ('USE ['+@db_name+'];UPDATE STATISTICS ['+@schema_name+'].['+@tab_name+'] (['+@ind_name+']) ' )
			
				--INSERT INTO msdb.dbo.dba_defrag_maintenance_history
				--VALUES (@db_name,@tab_name,@ind_name,@frag,@pages,'REORGANIZE & UPDATESTATS',GETDATE())

				PRINT 'USE ['+@db_name+'];ALTER INDEX ['+@ind_name+'] ON ['+@schema_name+'].['+@tab_name +'] REORGANIZE '
				PRINT 'USE ['+@db_name+'];UPDATE STATISTICS ['+@schema_name+'].['+@tab_name+'] (['+@ind_name+']) '
			END TRY			
			BEGIN CATCH
			--------------------------------------------------------------------------------------------------------------------------------------
			--Check the fragmentation between 15% to 29% and pages greater than 1000 and page level 
			--lock disabled then rebuild
			--------------------------------------------------------------------------------------------------------------------------------------

				IF ERROR_NUMBER()=2552
				BEGIN
					EXEC ('USE ['+@db_name+'];ALTER INDEX ['+@ind_name+'] ON ['+@schema_name+'].['+@tab_name +'] REBUILD WITH ( FILLFACTOR = ' + @a_Fillfactor + ' ) ')
					--INSERT INTO msdb.dbo.dba_defrag_maintenance_history
					--VALUES (@db_name,@tab_name,@ind_name,@frag,@pages,'PLLD_REBUILD',GETDATE())
					PRINT 'USE ['+@db_name+'];ALTER INDEX ['+@ind_name+'] ON ['+@schema_name+'].['+@tab_name +'] REBUILD WITH ( FILLFACTOR = ' + @a_Fillfactor + ' ) '
				END
			END CATCH
		END

	--------------------------------------------------------------------------------------------------------------------------------------
	--Update the statistics for all indexes if the first three conditions is false
	--------------------------------------------------------------------------------------------------------------------------------------
	ELSE 
	BEGIN 
		EXEC ('USE ['+@db_name+'];UPDATE STATISTICS ['+@schema_name+'].['+@tab_name+'] (['+@ind_name+']) ' ) 
		--INSERT INTO msdb.dbo.dba_defrag_maintenance_history
		--VALUES (@db_name,@tab_name,@ind_name,@frag,@pages,'UPDATESTATS',GETDATE()) 		
		PRINT 'USE ['+@db_name+'];UPDATE STATISTICS ['+@schema_name+'].['+@tab_name+'] (['+@ind_name+']) ' 
	END 
	END 
	ELSE
	BEGIN

		--------------------------------------------------------------------------------------------------------------------------------------
		--Update the statistics for all tables if the first three conditions is false
		--------------------------------------------------------------------------------------------------------------------------------------
		EXEC ('USE ['+@db_name+'];UPDATE STATISTICS ['+@schema_name+'].['+@tab_name+']') 
		--INSERT INTO msdb.dbo.dba_defrag_maintenance_history 
		--VALUES (@db_name,@tab_name,'HEAP',@frag,@pages,'UPDATESTATS',GETDATE()) 
		PRINT 'USE ['+@db_name+'];UPDATE STATISTICS ['+@schema_name+'].['+@tab_name+']';
	END

		SET @min_id=@min_id+1
	END
	
	
	DROP TABLE #tempfrag
	--INSERT INTO master.dbo.dba_defrag_maintenance_history
	--SELECT * FROM msdb.dbo.dba_defrag_maintenance_history
	END


5. Test Query
use master
go

exec dbo.[sp_indexdefragmentation]  AdventureWorks2008
go

use AdventureWorks2008
go

exec dbo.[sp_indexdefragmentation] 


 
안녕하세요. 주디아줌마입니다.
제가 소개할 세션은 "Top 10 Dev Mistakes That Don’t Scale" 입니다.
 
 
 

이 세션에서는  TOP 10 개발자 실수에 대한 세션입니다.
다양한 SQL 이슈에 대해서  다루고 있으며, 이슈에 대한 해결 할 수 있는 대안을 제공합니다.
 
Top 10

1. Triggers
   - SQL Agent Job
   - Applicatiion Server, Service Broker
 
2. SELECT *   
   - SELECT A, B, C 컬럼 명시할 것.

3. User Defined Functions
   - Persisted calculated fields
   - Persisted indexed views
   - ETL process,Optimize the bejeezus out of them  

4. Dynamic SQL 
   - Build stored procedures
   - Move it into the application      

5. Big Fields

6. Binaries in the Database
   - SQL 2008’s Filestream
   - Remote Blob Storage
   - Store pointers, not files
   - Content Distribution Networks (CDNs)

7. Heaps
  - Implement a primary key
  - Look for identity fields
 
8. Old Indexes
 
9. TempDB

10. V1 Features
 
전, 모든 개발자가 실수 하지 않도록 메뉴얼화 하여 강요할 것입니다. ㅜ.ㅜ

sp_who2

go

 

sp_lock 964

go

 

--spid  dbid    ObjId   IndId   Type    Resource       Mode    Status

--961   1       85575343       0       TAB                     IS      GRANT

--964   9       201767776      3       PAG     1:6789          IX      GRANT

--964   9       201767776      1       PAG     1:6786          IX      GRANT

--964   9       201767776      2       PAG     1:6787          IX      GRANT

--964   9       201767776      3       KEY     (e4005edd4dfd)         X       GRANT

--964   9       201767776      1       KEY     (d6000bcda4b6)         X       GRANT

--964   9       201767776      2       KEY     (3200c2e1bde2)         X       GRANT

--964   9       201767776      0       TAB                     IX      GRANT

 

select object_name(201767776)

go

 

-- process 확인

SELECT * FROM master..sysprocesses

where spid = 964

gp

 

-- process kill 시킨다.

kill 964