/* <sp_stat.sql>
정원혁 2003.8.12
설명   :  주어진 테이블의 주어진 컬럼에 대한 통계를 보여준다.
만약 해당 컬럼의 통계가 없다면 새로 생성하고 보여준 후 삭제한다
수정: 2006.6.정원혁
특수 테이블 이름, 컬럼 처리 가능하도록 수정
like 사용하여 발생하던 오류 수정
*/
USE master
GO
IF object_id('dbo.sp_stat') IS NOT NULL 
DROP PROC dbo.sp_stat
GO

CREATE PROC sp_stat
@objname sysname = null
, @colname sysname = null
, @fullscan bit = 0
, @debug bit = 0 --동적 쿼리 문장을 보여주기 위한 디버깅 용도
AS
SET NOCOUNT ON
SET LOCK_TIMEOUT 30000
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

IF @objname IS NULL OR @colname IS NULL
BEGIN 
PRINT '테이블 이름과 컬럼이름이 없습니다.'
RETURN -1
END 

IF LEFT (@objname , 1) <> '['
SET @objname = '['+ @objname + ']'
IF LEFT (@colname , 1) <> '['
SET @colname = '['+ @colname + ']'
IF @debug = 1
select @objname, @colname

--이미 통계가 존재하는지 검사한다
DECLARE @statName sysname 
SET @statName = NULL 
SELECT @statName = i.NAME
FROM sysindexes i
JOIN sysobjects o ON i.id = o.id
WHERE o.NAME = @objname
AND i.NAME = @colname

if @debug = 1
select @statName as statName

IF @statName IS NULL
BEGIN 
DECLARE @sql varchar(2000)
SET @sql='Create Statistics ' + REPLACE(@colname, '[', '[tmp_') + ' on '+@objname+'('+@colname+') '
IF @fullscan = '1' 
SET @sql = @sql + ' WITH FULLSCAN'
IF @debug = 1
PRINT @sql
ELSE
EXECUTE(@sql)

SET @sql='DBCC SHOW_STATISTICS('+@objname+' , '+ REPLACE(@colname, '[', '[tmp_') +')'
IF @debug = 1
PRINT @sql
ELSE
EXECUTE(@sql)

SET @sql='DROP STATISTICS '+@objname+'.'+REPLACE(@colname, '[', '[tmp_') 
IF @debug = 1
PRINT @sql
ELSE
EXECUTE(@sql)
END 
ELSE BEGIN  
SET @sql='DBCC SHOW_STATISTICS('+@objname+', '+@statName+')'
IF @debug = 1
PRINT @sql
ELSE
EXECUTE(@sql)
END
GO


/* 테스트
USE Credit
EXEC sp_stat charge, charge_amt, 1, 1
EXEC sp_stat charge, charge_amt
use northwind
exec sp_stat [order details], ProductID, 0, 1
*/

'연구개발 > SQL2005' 카테고리의 다른 글

join & subquery 연습  (0) 2010.06.18
그룹함수  (0) 2010.06.18
ANSI_NULLS NULL값과 비교  (0) 2010.06.08
QUOTED_IDENTIFIER  (0) 2010.06.08
[SQL 2005 GUIDE] 재컴파일 발생 원인 추적하기  (0) 2009.07.25

+ Recent posts