본문 바로가기
일하면서 쌓는 지식/DB

[MsSQL] 신입 1년동안 SSMS를 쓰면서 저질렀던 실수

1년동안 MsSQL로 개발,LIVE서버 운영을 했었다.

처음엔 LIVE DB 테이블을 보고 실 데이터를 건드는것이 너무 무서워서 함부로 서버 연결하지 않았다..

그러나..몇개월 동안 안정적으로 운영을 하시는 것을 보고 나태해진 탓에-

운 영 디 비 를 내 맘 대 로 업 데 이 트 쳤 었 다

 

지금에야 업데이트를 쳤다 라고 말을 할 수 있었지만,

당시는 내가 무슨 일을 저질렀는지 몰랐다 ㅜ_ㅜ 

몇개월동안 너무 트라우마가 생겨서...그거에 대해 언급도 못하다가~

이제 웃으면서 회상할 수 있는 시기가 되어서~한번 정리해보려고 한다.

 

 

 

1.서버 연결을 끊었더라도 무조건 '새 쿼리 창' 에서 쿼리 작업하기

SSMS창 1개당 서버1개를 연결해서 쓰면 좋겠지만, 회사 노트북이 램 8G였을 시절 SSMS키는데 5분 걸렸던 적도 있었다. 그래서 급한 마음에 LIVE/개발서버 2개를 한 SSMS창에 연결해서 사용했다.

운영 DB에서 혹여나 작업할까, 연결 끊기를 하고 쿼리를 작성했으나-

기존에 열려있던 쿼리창에서는 여전히 연결끊기한LIVE서버 로 연결이 되어있었다.

INSERT 하고 있었는데;; 소오름;;  대리님이 이거 확인해주셔서 너무 감사..

2. SELECT 를 날릴땐 with(nolock)조건 걸기

MSSQL에서 SELECT을 날리면 공유잠금에 걸린다. 쿼리를 실행하는 동안 ROW혹은 TABLE에 INSERT/UPDATE하는 작업은 블락되는 것!

반대로 생각하면 INSERT,UPDATE 작업이 있다면 SELECT문은 BLOCK된다. 그러면 DB성능이 저하된다....

SELECT할때 WITH(NOLOCK)조건을 걸면, 선행 작업과 상관없이 SELECT문이 수행되어서 결과를 반영하게 된다.

내가 일할때 SELECT에 이 조건을 거는 이유는 SELECT쿼리의 성능이 좋아지는것~을위해서가 아니라 그 반대의 경우가 많다.

LIVE로 돌아가는 서비스에 영향을 주면 안되기 때문에..락걸리면 디비뻗고 서버뻗고..아!!!!!!!!!!! 

그리고 JOIN을 걸 경우 테이블마다 이 WITH(NOLOCK)조건을 걸어줘야 한다는 것 명심!

 

3. BEGIN TRAN, COMMIT, ROLLBACK 명심

이거는 최근에 UPDATE칠일이 많아지면서 배운건데ㅋㅋ

이거 몰랐으면 UPDATE/INSERT/DELETE 아무렇게나 치고 수기로 데이터 넣고있었을것 같다. 아찔하다.

 

USE [DB명]
GO

BEGIN TRAN 

INSERT INTO [TABLE명]
VALUES(COLUMN1, COLUMN2...)

--여기까지 실행 하구 SELECT을 '그 창' 에서 날려보거나, 영향받은 행 갯수 보고 확인, 맞으면

COMMIT 

--틀리면

ROLLBACK 


 

 

너무나 초보스러운 거지만 누군가에겐 도움이 되리라 생각하고 적어본다.

DBMS는 잘하고싶은데 잘하기도 어렵고, 일단 사원으로 있는 동안은

SELECT이나 JOIN해서 제대로 가져오면 다행인거 같다. 

장애만 내지말자! 장애만! :) 

 

 

 

 

'일하면서 쌓는 지식 > DB' 카테고리의 다른 글

Delete시 SubQuery 사용  (0) 2021.02.18
[MsSQL] Openquery 로 MariaDB에 Insert 해보기  (2) 2021.01.14