728x90

 

MSSQL Linked Server

Link  - http://blog.naver.com/lovzip/20056016860

728x90
728x90
 

New-NetFirewallRule -DisplayName "MSSQL BROWSER UDP" -Direction Inbound -LocalPort 1434 -Protocol UDP -Action Allow

New-NetFirewallRule -DisplayName "MSSQL ENGINE TCP" -Direction Inbound -LocalPort 1433-1434 -Protocol TCP -Action Allow

New-NetFirewallRule -DisplayName "MSSQL AOAG EP TCP" -Direction Inbound -LocalPort 5022 -Protocol TCP -Action Allow

netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes

 

728x90
728x90

DB에서 컬럼 이름 찾기

배경

어떤 데이터를 DB에서 직접 고치게 되면, 늘 걱정하는 것 중 하나가 완벽하게 모든 영향받는 테이블들까지

잘 고쳤는가 하고 스스로에게 물어보는 것일게다.

그럴 때면, 해당 컬럼 이름이 포함된 모든 테이블을 뒤지는 게 상책이다.

 

소스

select b.name, a.name 
from sys.all_columns a, sys.all_objects b
where a.object_id = b.object_id and b.type_desc = 'USER_TABLE'
and a.name = 'AccountID' --// 해당 컬럼 이름을 여기에 넣어서 찾으면 된다.


 

잡담

sys.all_objects 는 참 유용한 녀석이다. 테이블 뿐만 다음과 같은 타입을 모두 취급하니,

시간되면 천천히 찾아 볼 일이다. ㅎㅎ

 

 

CLR_STORED_PROCEDURE
SYSTEM_TABLE
VIEW
SQL_TABLE_VALUED_FUNCTION
DEFAULT_CONSTRAINT
SQL_STORED_PROCEDURE
EXTENDED_STORED_PROCEDURE
AGGREGATE_FUNCTION
USER_TABLE
SERVICE_QUEUE
SQL_INLINE_TABLE_VALUED_FUNCTION
INTERNAL_TABLE
CLR_SCALAR_FUNCTION
SQL_SCALAR_FUNCTION
PRIMARY_KEY_CONSTRAINT

 

출처 : http://blog.daum.net/nextkey/122

728x90
728x90

쿼리 처리 과정 / SELECT 실행순서

쿼리가 처리되는 과정은 다음과 같다.

 

1. 구문 분석(Parsing)

해당 쿼리가 문법적으로 틀리지 않은지 확인. 해당 구문을 SQL 서버가 이해할 수 있는 단위들로 분해하는 과정.

만약 구문이 부정확하다면 여기서 처리를 중단. 이 문장이 일괄 처리(batch) 내에 있다면 일괄 처리 전체를 중단.(Batch abort : Batch 중 하나라도 systax error가 있다면 전체 batch가 실행되지 않는다.)

2. 표준화(Standardization)

실제로 필요없는 부분들이 제거. 표준화된 쿼리 트리(Standard Query Tree)가 만들어 진다.

3. 최적화(Optimization)

통계나 조각 정보 등을 바탕으로 실행 계획을 만들어 낸다. 쿼리처리에서 매우 중요한 단계

① 쿼리 분석 : 검색 제한자(SARG)인지 조인 조건인지 판단.

② 인덱스 선택 : 분포 통계 정보를 이용하여 인덱스검색이나 테이블 스캔 중의 하나를 선택. 여러 인덱스 중 가장 효율적인 인덱스를 선택

③ 조인 처리 : JOIN, UNION, GROUP BY, ORDER BY 절을 가지고 있는지 확인하여 적절한 작업 순서를 선택

이 단계의 출력은 실행 계획(Execution Plan) 이다.

4. 컴파일(Compilation)

컴파일을 하면 이진 코드가 생성된다. 일반적인 경우에는 컴파일하고 나면 .exe, .dll 등의 이진 파일이 만들어 지는데, SQL Server에서는 그냥 메모리(프로시저 캐시)에만 올린다. 그래서 컴파일 속도가 매우 빠르다.

5. 실행(Execute)

엑세스 루틴으로 가서 실제 처리를 하고 결과를 돌려준다.

 

이상의 다섯 단계는 단순화한 논리적 절차로 받아들여야 하며, 실제 쿼리 과정은 이보다 훨씬 더 복잡하다.

 

 


 

SELECT 실행 순서 

 

-문법 순서-

 

SELECT                            - 1

FROM                               - 2

WHERE                             - 3

GROUP BY                        - 4

HAVING                            - 5

ORDER BY                        - 6

 

-실행 순서-

 

FROM                               - 1

WHERE                             - 2

GROUP BY                        - 3

HAVING                             - 4

SELECT                            - 5

ORDER BY                         - 6

 

 

해당 데이터가 있는 곳을 찾아가서                   (FROM)

조건에 맞는 데이터만 가져와서                       (WHERE)

원하는 데이터로 가공                                    (GROUP BY)

가공한 데이터에서 조건에 맞는 것만                (HAVING)

뽑아내서                                                     (SELECT)

정렬                                                           (ORDER BY)

 

실행순서는 문법, 권한 검사 순서이기도 하고,

Alias 등록 순서 이기도 하다.

 

별칭(Alias)

FROM 절에서 테이블에 Alias를 사용했다면       (FROM Table1 AS T1)

SELECT, ORDER BY 절에서 사용할 수 있고      (SELECT T1.Col1, ORDER BY T1.Col1)

SELECT 절에서 컬럼에 Alias를 사용했다면       (SELECT T1.Col1 AS a)

ORDER BY 절에서 사용할 수 있다.                   (ORDER BY AS a)

 

ORDER BY절에 T1.a가 안되는 것으로 보아

aT1.col1을 대신하는 것 같다.

728x90
728x90

MS-SQL 서비스를 운영하다보면, 특정 쿼리의 Lock 문제로 리소스 낭비 뿐만 아니라 최악에는 서비스까지 영향을 미치는 문제가 발생하는 경우가 있다. 이런 문제가 발생하게 되면 보통 별도의 알람 시스템을 통해 알람을 전달 받고 해당  Lock을 발생하는 SPID를 확인해서 빠르게 Kill 해주는게 좋다.

쿼리창에서 아래 그림의 명령어를 입력해서 현재의 Lock 상태를 확인 합니다.
해당 정보를 이용해서 Lock의 종류를 분류하고 장애를 처리 할 수 있습니다.

 

  • S : 공유 잠금 Lock.
  • U : 업데이트 잠금 Lock.
  • X : 독점 잠금 Lock.
  • IS : 의도 공유 잠금 Lock.
  • IU : 의도 업데이트 잠금 Lock.
  • IX : 독점 의도 잠금 Lock.
  • BU : 대량 업데이트 잠금 Lock.
DBCC Inputbuffer (SPID 번호) 명령을 실행하여 Lock을 발생시킨 원인 쿼리를 확인 합니다.
Lock을 발생시킨 쿼리문이 확인 되었다면, Kill 명령을 통해 해당 작업을 중지 하면 됩니다.

  • Kill(SPID 번호)

 

동일한 문제가 발생할 가능성이 높기 때문에, 아래 명령어를 통해 SPID 확인 및 해당 SPID의 소유자를 먼저 확인 합니다.

  • EXEC SP_WHO
  • EXEC SP_WHO spid

다음으로 어떤 쿼리가 실행 되었는지를 확인 합니다. (아래 명령어 참고)

  • DBCC INPUTBUFFER(spid)

 

위와 같이 수동으로 작업하는 방법 이외에, 스케줄러를 통해 자동 처리하는 방법이 있지만, 혹시 모를 장애를 대비해서 관리자가 직접 해당 쿼리문등을 확인하고 작업하는 걸 추천 드립니다.

728x90

+ Recent posts