블로그 이미지
010-9967-0955 보미아빠

카테고리

보미아빠, 석이 (500)
밥벌이 (16)
싸이클 (1)
일상 (1)
Total
Today
Yesterday

달력

« » 2024.3
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

공지사항

최근에 올라온 글

delete trigger

카테고리 없음 / 2013. 8. 18. 20:04


alter  TRIGGER TRIGGER_MEMBER ON MEMBER
FOR DELETE
AS
IF (SELECT COUNT(*) FROM DELETED) > 0
BEGIN

 DECLARE @SPID INT = @@SPID
 DECLARE @SQL_HANDLE BINARY(20)
 DECLARE @TEXT VARCHAR(MAX)

 DECLARE @LOG_DELETE TABLE
 ( LOGINAME NCHAR(256)
 ,NT_USERNAME NCHAR(256)
 ,ACTION_DATE  DATETIME
 ,PROGRAM_NAME VARCHAR(2000)
 ,NET_ADDRESS NVARCHAR(48)
 ,NET_LIBRARY NCHAR(24)
 ,PROTOCOL_TYPE NVARCHAR(40)
 ,TEXT VARCHAR(MAX)
 )

 declare @sql_statement table (
 language_event NVARCHAR(100),
 parameters INT,
 event_info NVARCHAR(4000),
 event_time DATETIME DEFAULT CURRENT_TIMESTAMP);

 declare @dbcc_cmd nvarchar(2000)
 set @dbcc_cmd = 'DBCC INPUTBUFFER('+ cast(@SPID as varchar(200)) + ');'
 INSERT INTO @sql_statement (language_event, parameters, event_info)
 EXEC(@dbcc_cmd);

 SELECT @TEXT = event_info FROM @sql_statement

 INSERT INTO @LOG_DELETE
 SELECT
  LOGINAME
 ,NT_USERNAME
 ,GETDATE()
 ,PROGRAM_NAME
 ,CAST(CONNECTIONPROPERTY('LOCAL_NET_ADDRESS')  AS NVARCHAR(48))
 ,NET_LIBRARY
 ,CAST(CONNECTIONPROPERTY('PROTOCOL_TYPE') AS NVARCHAR(40))
 ,@TEXT
 FROM MASTER.DBO.SYSPROCESSES WHERE SPID = @SPID

 ROLLBACK TRANSACTION
 
 INSERT INTO JOYMDB.DBO.LOG_DELETE
 SELECT * FROM @LOG_DELETE

 exec joymdb.dbo.[핸드폰메세지_아이폰] 'delete from member', -1, 'lpoint1' , 'Y', 0

END
GO

Posted by 보미아빠
, |

인문학

카테고리 없음 / 2013. 8. 13. 09:43

요즘 어떤분 때문에 인문학에 좀 관심이 있다.

 

근대 인문학은 르네상스에서 기인했다고 알려져 있다. 흔히 ‘르네상스’ 하면 무슨 호텔 이름처럼 풍요롭고 화려한 이미지만을 떠올리지만, 사실 그 시대의 인문학자들이야말로 중세적 신의 질서, 억압적 권력, 무지의 관성에 맞서 목숨을 내놓고 싸웠던 지적 전사들이었다. 대중의 입맛에 맞도록 쉽게 요약해주거나, 자본가들 상대로 호텔에서 강의를 하거나, 대통령에게 괴테를 인용해 찬사나 보내는 따위의 행위는 ‘인간의 무늬’(人文)를 탐구하는 데 따르는 지난하고 복합적이며 때로는 답이 보이지도 않는 인문학적 작업과는 관계가 없으며, 그저 소비사회의 천박한 요청에 부응해 신속하게 상품화된 지식일 뿐이다. 외려 진정한 인문학은 이 시대의 가장 불편한 문제를 제기하는 일, 가장 인기 없는 학문을 묵묵히 계속하는 일, 가장 주변부의 사람들과 연대하는 일 속에 있다. 이 시대는 ‘인간’의 가치가 헐값으로 떨어진 총체적 야만의 시대이기에 그렇다. 이런 암울하고 절박한 시대를 쉽고 실용적이고 희망찬 말들로 포장하여 팔아치우는 오늘의 ‘인문학’, 그것이야말로 실은 가장 먼저 처리되어야 할 쓰레기다.

 

문강형준 문화평론가

Posted by 보미아빠
, |

REMARK 2 START

 

SQL 2005 부터는 allocation contention 발생을 줄이기 위해 저장프로시저 내 임시테이블이 캐시된다. 이런 캐시 영향도가 전체 프로시저의 실행계획에 영향을 끼칠 수 있다. 이 경우 Ramesh Meyyappan 이 여러가지 솔루션을 제안했다. (이사람도 지금은 컨설턴트라서 좋은 솔루션은 절대 안가르쳐 준다. workshop 수업 들어야 알려줄것 같다. ) 좀 더 효율적인 솔루션이 없을까? 가 문제이다.

 

Ramesh Meyyappan 이 제안한 방법은 3가지 정도가 된다. (별로 영양가가 없으므로, 자세히 하지 않겠다. )

  1. option recompile 로는 임시테이블 통계가 바뀌지 않기 때문에 문제가 해결되지 않는다.
  2. 템프 테이블에 명명된 제약조건 생성(동시에 실행하면, 이름충돌 문제있음)
  3. 임시테이블에 인덱스를 만드는 방법

데이터 생성 스크립트
CREATE DATABASE EPLAN 
GO

USE EPlan
go

set nocount on
set statistics time off
set statistics io off

drop table tab7
go

create table tab7 (
	c1 int primary key clustered
,	c2 int
,	c3 char(200)
)
go

create index test on tab7(c2, c1, c3)
go

/*
-- 주의) 실행계획 표시 해제할 것
*/
begin tran
	declare @i int
	set @i = 1
	while @i <= 50000
	begin
	insert into tab7 values (@i, 1, 'a') -- *) c2는 모두 1
	set @i = @i + 1
	end
commit tran
go
insert into tab7 values (50001, 1, 'a')
go

checkpoint
go


/*
1) 원본
*/
DROP PROC test_slow
go

CREATE PROC test_slow 
	@i int
AS
BEGIN
	DECLARE @j int
	
	CREATE TABLE #temp1 (c1 int primary key)

	INSERT INTO #temp1 (c1) SELECT @i
	
	SELECT @j = t7.c1 
	FROM tab7 t7 
	INNER JOIN #temp1 t 
		ON (t7.c2 = t.c1)		
        
END
go
	

 

위 쿼리는 인자를 1로 주면 SCAN, 인자를 2로 줘도 SCAN 이다. 이것을 1이 인자로 들어오면 SCAN 2가 인자로 들어오면 SEEK 가 되도록 고쳐야 하고, 전체 프로시저를 리컴파일(플랜이 캐시되지 않는다.) 하지는 않아야 한다. 아래 스크립트를 실행하면, 캐시하여 둘 다 SCAN 한다.


SCAN

exec test_slow 1


인덱스 SEEK 를 하면 효율적이지만 캐싱된 임시테이블로 인한 SCAN
exec test_slow 2


Ramesh Meyyappan 의 워크샵에 참가하면 알려줄것 같은 답안 1
DROP PROC test_slow
go

CREATE PROC test_slow 
	@i int
AS
BEGIN
	DECLARE @j int
	
	CREATE TABLE #temp1 (c1 int primary key)

	INSERT INTO #temp1 (c1) SELECT @i
	 
	update statistics #temp1

	SELECT @j = t7.c1 
	FROM tab7 t7 
	INNER JOIN #temp1 t 
		ON (t7.c2 = t.c1)
	option (recompile)

END
go
	



위 방법은 전체 프로시저를 recompile 하지 않았고 필요한 부분만 정확하게 재컴파일 할 수 있는 방법이다. update statistics 와 option (recompile) 은 같이 쓰여져야 한다.

 

이 글은 두 사람보다 훨씬 심도깊은 테스트와 의견을 제시한 사람이 있다. 다음 두개의 글을 읽어보길 바란다.

 

http://sqlblog.com/blogs/paul_white/archive/2012/08/17/temporary-object-caching-explained.aspx

http://sqlblog.com/blogs/paul_white/archive/2012/08/15/temporary-tables-in-stored-procedures.aspx

위 두 글 뿐만 아니라 PAUL 의 글은 매우 수준이 높고 SQL을 이해하는데 도움이 많이 된다. 이글을 소개한 강사는 솔루션을 계속 찾고있다고 한다. 인터넷에 위 글을 참고하면 좋을듯 하다.

 

REMARK 2 END

 

Posted by 보미아빠
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함