블로그 이미지
SQL Server VS. 석이 minsouk@hotmail.com MSSQL 쿼리성능 관련해 궁금한 사항이 있다면 언제나 누구나 TeamViewer + Line (네이버 japan 메신저) 에 minsouk1 추가 후 연락주세요~ 010-9967-0955 보미아빠

카테고리

보미아빠, 석이 (283)
밥벌이 (16)
싸이클 (1)
일상 (1)
Total75,456
Today16
Yesterday65

달력

« » 2014.11
            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            

공지사항

wireshark

분류없음 / 2014/11/14 17:31


http://www.rcy.co.kr/xeb/?mid=tool&page=1&listStyle=list&document_srl=6934


안녕하세요 와이어샤크 사용법을 소개해 드릴까 합니다.

일단 와이서 샤크 다운받을 수 있는 사이트는 http://www.wireshark.org 입니다

바로 다운받을수 있는 곳을 링크 해 드리겠습니다.

windows 32 bit

http://wiresharkdownloads.riverbed.com/wireshark/win32/wireshark-win32-1.4.5.exe

windows 64 bit

http://wiresharkdownloads.riverbed.com/wireshark/win64/wireshark-win64-1.4.5.exe

이곳에서 받고 설치 하시면 됩니다~

설마 설치 못하시는 분은 없으시겠죠?ㅎ

자 이제 그럼 와이어 샤크에 대해 소개 해드리겠습니다.

 

Wireshark?

Wireshark는 세계에서 가장 널리 쓰이는 네트워크 분석 프로그램입니다. 매우 강력한 이 프로그램은 네트워크상에서 캡쳐한 데이터에 대한네트워크/상위 레이어 프로토콜의 정보를 제공해줍니다. 다른 네트워크 프로그램처럼, Wireshark는 패킷을 캡쳐하기위해pcap 네트워트 라이브러리를 사용합니다.

 

 

Wireshark의 강점

- 쉬운 설치.

- GUI 인터페이스를 이용한 간단한 사용법.

- 매우 다양한 기능들.

Wireshark는 원래 개발자가 근무하던 회사를 떠난 뒤, 저작권 문제로 인해 프로그램의 이름을 변경하기로 한 2006년까지 Ethereal로 불렸습니다.

 

Wireshark 실행화면

1.png

 

 

Capture -> Options

네트워크 인터페이스를 선택하고 Start을 클릭합니다.


2.png

 

Wireshark을 실행한 후의 모습.

 3.png
 

Start를 누르게 되면 위와 같이 패킷을 보실수가 있을 겁니다 만약에 패킷이 안보이고 하얀 화면만

나오신다면 인터넷 새창을 한번 켜보시면 패킷을 확인 할수 있을 겁니다

 

메뉴설명

4.png
 

File

5.png

Open : 저장된 파일을 열때 사용한다.

Open Recent : 최근에 열었던 파일을 열때 사용한다.

Merge…. : 저장되어 있는 캡쳐 파일을 하나로 합칠때 사용한다.

Close : 현재 캡쳐 하고 있는 화면을 닫는다.

Save : 현재 캡쳐된 파일을 저장한다.

Save as : 현재 캡쳐된 파일을 다른이름으로 저장한다.

File Set : 현재 보고 있는 캡쳐파일의 Filename/Created/Last Modified/Size/저장경로  볼수 있다.

Export : 현재 파일을 여러 파일로 저장합니다.(

Print.. : 출력할때 사용한다.

Quit : 나가기.

 

 

Edit

6.png
 

Find Packet.. : 특정 패킷을 찾을수 있다.

Find Next : 찾은 패킷의 다음으로 이동한다.

Find Previous : 찾은 패킷의 전으로 이동한다.

Mark packet(toggle) : 특정 패킷을 사용자 임의로 지정할수 있다여러  복수 선택 가능)

Find Next Mark : 임의로 지정된 패킷중 다음 패킷으로 이동한다.

Fine Previous Mark : 임의로 지정된 패킷중 이전 패킷으로 이동한다.

Mark All displayed packets : 현재 캡쳐된 모든 패킷을 마크로 지정한다.

Unmark All Packets : 지정된 모든 마크 패킷을 원상태로 되돌린다.

Ignore Packet(toggle) : 지정된 패킷은 무시되어 어떠한 정보도 화면에 표시되지 않는다.(지정된 패킷에는 Ignore 라고표시된다.)

Ignore All Displated Packets : 화면상에 표시된 모든 패킷을 Ignore한다.

Un-Ignore All packets : Ignore  패킷을 원상태로 되돌린다.

Set Time Reference(toggle) : 지정된 패킷을 기준으로 패킷 시간을 표시한다.

지정된 패킷에는 *ref*표시가 생기며 패킷을 0초로 하여 다음패킷의 Time 표시한다.

Find Next Reference : ref 지정된 패킷의 다음 패킷으로 이동한다.

Find Previous Reference : fef 지정된 패킷의 이전 패킷으로 이동한다.

Configuration Profiles…. : 여러 환경설정등을 여러 가지 분류로 각각 저장할  있다.

Preferences.. : 캡쳐 화면이나 윈도우 폰트 등을 상세하게 설정할  있다.

 

View

7.png
 

Main Toolbar : 바로가기 단축창을 on/off 할수 있다.

Filter Toolbar : Filter 창을 on/off할수 있다.

Wireless Toolbar : Wireless 창을 on/off할수 있다.

Statusbar : 창아래 보이는 패킷 파일의 대한 정보를 on/off할수 있다.

Packet List : Packet  보이는 List창을 on/off 할수 있다.

Packet Details : Packet  정보를 확인할수 있는 창을 on/off할수 있다.

Packet Bytes : Packet 16진수  데이터 창을 on/off할수 있다.

Time Display format : Packet 시간 정보 표시를 임의로 바꿀수 있다.

Name Resolution : Wireshark MAC, Network, Transport address  프로토콜의 이름풀이를 on/off할수 있다.

Colorize Packet List : 패킷별 지정해 놓은 색상을 on/off할수 있다.

Zoom In /Zoom Out : 글씨 크기를 조정할  있다.

Normal Size : 원래 상태의 사이즈로 돌아온다.

Resize All Columns : 현재 사이즈에 맞춰  배열한다.

Displated Columns : Packet List  표시할 항목을 선택 할수 있다.

Expand Subtrees : Packet Details창에 선택된 Packet 정보를 펼칠  있다.

Expand All : Packet Details창의 모든 Packet 정보를 펼친다.

Collaspse All : Packet Details창의 모든 Packet 정보를 접는다.

Colorize Conversation : 모든 패킷의 색상을 바꿀수 있다.

Reset Coloring 1-10 : 1-10 저장된 패킷 색상을 원상태로 되돌린다.

Coloring Rules .. : 패킷에 대한 색상을 임의의 색으로 바꿀수 있다.

Show Packet in New Window : 선택된 Packet Details창과 bytes창을 한번에 열수 있다.

Reload : 패킷의 최상단 패킷으로 이동한다.

 

Go

8.png

Back : 이전에 선택된 패킷으로 돌아간다.

Forward : 돌아오기전에 선택되었던 앞의 패킷으로 돌아간다.

Go to Packet… : Packet 앞부분에 써있는 Number Packet 찾을수 있다.

Previous Packet : 선택된 패킷을 가운데 화면으로 고정시키고 한칸 위로 이동한다.

Next Packet : 선택된 패킷을 가운데 화면으로 고정시키고 한칸 아래로 이동한다.

First Packet : 모든 패킷의 가장 상단 패킷으로 이동한다.

Last Packet : 모든 패킷의 가장 하단 패킷으로 이동한다.

 

Capture

9.png
 

Interfaces

18.png

캡쳐할 인터페이스를 선택할수 있다.

필자는 Vm-ware가상 프로그램을 써서 인터페이스가 여러개고 보통 1개가 보이실 겁니다
 

Options

19.png

캡쳐를 시작하기 전에 여러 기본적인 옵션들을 선택 할수 있다.

Start : 캡쳐를 시작한다.

Stop : 캡쳐를 중지한다.

Restart : 캡쳐를 다시 시작한다.

Capture Filters… : 캡쳐된 Packet 필터옵션을 설정하여 임의의 Packet 선택하여 볼수 있다.

 

Analyze

11.png

Display Filters…. : 미리 설정되어 있는 Filter Option 화면에 표시해준다사용자는 선택하여 적용하거나 새로운 옵션을 만들수 있다.

Display Filter Macros… : 여러  문장의 Filter 명령어를 매크로로 지정하여 편하게 쓸수 있다.

Enabled Protocols… : wireshark 지원하는 Protocol 확인하고 on/off할수 있다.

Decode As…. : 임의의 패킷을 원하는 패킷으로 변경할수 있다.

User Specified Decodes… : 사용자가 임의로 변경한 Packet 확인할  있다.

Follow TCP Stream : TCP Packet 데이터 부분만 모아서 보기 쉽게 화면에 표시해준다.

Follow UDP Stream : UDP Packet 데이터 부분만 모아서 보기 쉽게 화면에 표시해준다.

Follow SSL Stream : SSL Packet 데이터 부분만 모아서 보기 쉽게 화면에 표시해준다.

Expert Info : Packet Errors, Warnings, Notes, Chats  한번에 확인할  있다.

Expert Info Composite : Exper Info 부분의 Packet 더욱 상세하게 확인할  있다.

 

Statistics

12.png

Summary : Wireshark File, Time, Capture, display, Traffic..  요약을 보여준다.

Protocol Hierarchy : 현재 캡쳐된 Packet 종류와 전체 패킷중의 Packet 비율을 % 확인할  있다.

Conversations : 전체 Packet 흐름을 확인 할수 있다. (IPv4,IPv6,TCP,UDP등이 어디에서 어디로 향했는지 한눈에 볼수있다.)

Endpoints :  Packet Rx,Tx 신호의 흐름을 한눈에 확인할  있다.

Packet Lengths… : Filter옵션을 넣으면  Filter 대한 Packet 길이를 확인   있다.

IO Graphs : 전체 패킷에 대한 흐름도를 그래프로 확인 할수 있다. Filter옵션을 넣어 특정 Packet 확인할 수도 있다.

 

Conversation List : 특정 Packet 대한 흐름을 확인   있다.

Endpoint List : 특정 Packet Rx,Tx 신호의 흐름을 한눈에 확인할  있다.

Service Response Time : 보다 정밀한 검사가 가능한 16개의 프로토콜이 제공됩니다.

 

Flow Graph : 전체 Packet 대한 흐름을 그래프로 한눈에 확인 할수 있다.

HTTP : HTTP Protocol 관련된 Packet 손실률 성공Packet등을 확인   있다.

IP Addresses : 임의의 Packet 대한 IP주소의 개수속도퍼센트를 확인   있다.

IP Destinations : 임의의 packet 대한 도착지 IP주에 대한 개속도퍼센트를 확인   있다.

IP Protocol Types : 임의의 Packet 대한 IP Protocol 대한 개수속도퍼센트를 확인   있다.

TCP Stream Graph : TCP Packet 대한 다양한 그래프를 확인   있다.

UDP Multicast Streams : 멀티캐스트로 사용한 UDP 확인   있다.

 

Telphony

13.png

Wireshark에서 지원되는 다양한 Telephony  패킷들을 확인   있다.

 

단축키

14.png

자주 쓰이는 기능들을 손쉽게 쓰기 위해 모아논 bar. 마우스를 위에 올려 놓으면 자세한 정보를 확인   있다.

 

 

와이어 샤크 화면에 대해서 설명해 드리겠습니다.

PACKET DETAILS PANE

20.png

packet list 패널은 캡쳐된 모든 패킷을 보여줍니다. Source/destination MAC/IP 주소, TCP /UDP 포트 번호, 프로토콜, 패킷 내용 등의 정보를 얻을 수 있습니다.

 

 

PACKET DETAILS PANE

15.png
Packet Details 화면은 패킷을 와이어 샤크가 스스로 정리하여 모든 패킷의 상세 정보를 자세히 볼수 있습니다.

 

DISSECTOR PANE

16.png

packet bytes 패널이라고도 하는 dissector 패널은 packet details 패널과 내용은 같지만 데이터를 16진수로 나타내줍니다.

 

Wireshark 하단 정보 표시

21.png

프로그램 화면 하단에서는 다음과 같은 정보들을 확인 할 수 있습니다:

Expert Infos, Paket , Displayed , Marked, Dropped

 

필터

CAPTURE FILTERS

2-1.png

 
 

Protocol:

사용 가능한 값: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp.

프로토콜을 지정하지 않으면 모든 프로토콜을 사용합니다.

Direction:

사용 가능한 값: src, dst, src and dst, src or dst

출발지나 목적지를 지정하지 않으면 "src or dst" 키워드가 사용됩니다.

예를 들어, "host 10.2.2.2"은 "src or dst host 10.2.2.2"과 동일합니다.

Host(s):

사용 가능한 값: net, port, host, portrange.

호스트를 지정하지 않으면 "host" 키워드가 사용됩니다.

예를 들어, "src 10.1.1.1"은 "src host 10.1.1.1"과 같은 의미입니다.

Logical Operations:

사용 가능한 값: not, and, or.

부정 연산("not")이 가장 높은 우선순위를 갖습니다. 논리합("or")과 논리곱("and")는 같은 우선순위를 가지며 왼쪽에서 오른쪽으로 처리됩니다.

예를 들어,

"not tcp port 3128 and tcp port 23"은 "(not tcp port 3128) and tcp port 23"과 동일하게 작용합니다.

"not tcp port 3128 and tcp port 23" 은 "not (tcp port 3128 and tcp port 23)"과는 동일하지 않습니다.

 

사용 예:

tcp dst port 3000

목적지가 TCP 포트 3000인 패킷을 보여줍니다.

ip src host 1.1.1.1

출발지 IP 주소가 1.1.1.1인 패킷을 보여줍니다.

host 10.1.2.3

출발지와 목적지 IP 주소가 10.1.1.1인 패킷을 보여줍니다.

src portrange 2000-2500

출발지의 UDP, TCP 포트가 2000-2500 사이인 패킷을 보여줍니다.

not imcp

icmp 패킷을 제외한 모든 패킷을 보여줍니다. (icmp는 보통 ping 프로그램에서 사용합니다.)

src host 10.7.2.12 and not dst net 10.200.0.0/16

출발지 IP 주소가 10.7.2.12이면서, 목적지 IP 네트워크가 10.200.0.0/16이 아닌 패킷을 보여줍니다.

(src host 10.4.1.12 or src net 10.6.0.0/16) and tcp dst portrange 200-10000 and dst net 10.0.0.0/8

출발지 IP 주소가 10.4.1.12이거나, 출발지 네트워크가 10.6.0.0/16인 패킷중에서 목적지 TCP 포트 범위가 200-10000이면서, 목적지 IP 네트워크가 10.0.0.0/8인 패킷을 보여줍니다. 

 
 

DISPLAY FILTERS

display 필터는 캡쳐된 데이터에서 원하는 정보를 찾을 때 사용합니다.

display 필터의 검색 능력은 capture 필터 보다 더 뛰어납니다. 그리고 필터의 내용을 바꾸고 싶을 때 캡쳐 작업을 다시 시작하지 않아도 됩니다.


2-2.png

 
 

Protocol:

OSI layer 2에서 layer 7 사이에 있는 매우 다양한 프로토콜을 사용 할 수 있습니다. 그것들은 메인 화면에 보이는 "Expression..." 버튼을 클릭하면 볼 수 있습니다.

비교 연산자:

6개의 비교 연산자를 사용 할 수 있습니다:

 

2-3.png

 

논리 표현 식:


2-4.png

 

사용 예:

snmp || dns || icmp

SNMP 혹은 DNS 혹은 ICMP 트래픽을 보여줍니다.

ip.addr == 10.1.1.1

출발지나 목적지의 IP 주소가 10.1.1.1인 패킷을 보여줍니다.

ip.src != 10.1.2.3 or ip.dst != 10.4.5.6

출발지의 IP 주소가 10.1.2.3이 아니거나 목적지의 IP 주소가 10.4.5.6이 아닌 패킷을 보여줍니다.

다른 말로 하자면, 화면에 보여지는 패킷은 다음과 같을 것입니다:

출발지 IP 주소 : 10.1.2.3이 아닌 모든 주소, 목적지 IP 주소 : 10.1.2.3이 아닌 모든 주소

그리고

출발지 IP 주소 : 모든 주소, 목적지 IP 주소 : 10.4.5.6이 아닌 모든 주소

ip.src != 10.1.2.3 and ip.dst != 10.4.5.6

출발지 IP 주소가 10.1.2.3이 아니면서, 동시에 목적지 IP 주소가 10.4.5.6이 아닌 패킷을 화면에 보여줍니다.

다른 말로 하자면, 화면에 보여지는 패킷은 다음과 같을 것입니다:

출발지 IP 주소 : 10.1.2.3이 아닌 모든 주소, 그리고 목적지 IP 주소 : 10.4.5.6이 아닌 모든 주소

tcp.port == 25

출발지와 목적지의 TCP 포트가 25인 패킷을 보여줍니다.

tcp.dstport == 25

목적지의 TCP 포트가 25인 패킷을 보여줍니다.

tcp.flags

TCP 플래그를 가지고 있는 패킷을 보여줍니다.

tcp.flags.syn == 0x02

TCP SYN 플래그를 가지고 있는 패킷을 보여줍니다.

필터 구문에 문제가 없다면, 녹색으로 하이라이트 될 것이며, 잘못됐다면 붉은색으로 하이라이트 될 것입니다.

 

 

통계

화면의 상단에 있는 "statistics"을 클릭하면 다양한 통계자료를 볼 수 있습니다.

protocol hierarchy창에서는 각 OSI layer별로 세부적인 데이터를 확인 할 수 있습니다.

 

4-1.png

 

 

Conversations

TCP/IP어플리케이션이나 프로토콜을 사용한다면, Ethernet, IP, TCP, UDP 의conversations 을 위한 4개의 탭이활성화 된 것을 볼 수 있습니다. "conversation"이란 두 호스트 사이의 트래픽을 말합니다.

각 탭의 프로토콜 명 옆에 있는 숫자는 conversation의 수를 나타냅니다. 예: "Ethernet:6"

 

Ethernet conversations:

4-2.png

 

 

TCP conversations:

4-3.png
 
 

UDP conversations:

4-4.png

 

 

Endpoints

Endpoints 창은 각 장치 별로 주고 받은 데이터에 대한 통계 정보를 보여준다.

탭에서 프로토콜 이름 옆에 있는 숫자는 endpoints의 수를 나타냅니다. 예 : "Ethernet:6".

(화면 구성은 Conversations 동일 하고 표시되는 내용만 다르다)

 

Packet Length

4-5.png

패킷의 수와 속도 비율을 보여줍니다. 
 

 

IO Graphs

 Packet 사용자가 보기 편하게 실시간 그래프로 나타내어 줍니다.

Filter옵션으로 한눈에 Packet 양을 보기 쉽게 확인   있습니다.

4-6.png
 

 

Flow Graph

4-7.png

"Flow Graph" 섹션은 TCP 연결 흐름을 한눈에 확인   있다. 

 

 

처음 세 줄은 TCP 연결이 "SYN", "SYN ACK", "ACK"의 순서로 만들어지는 것을 보여줍니다.

4-8.png

HTTP

HTTP (Hypertext Transfer Protocol)는 HTML 파일을 전송하기 위한 클라이언트/서버간 통신 프로토콜이다

대부분의 웹 브라우저 사용자인 HTTP 클라이언트는 파일을 찾기 위해 HTTP request을 "URL"과 함께 웹 서버에보냅니다. 그리고 웹 서버는 HTTP reponse을 통해 그에 대한 응답을 하고, 클라이언트가 원하는 웹 페이지를 보여준다.

 

"HTTP" 아래 세가지 하위 섹션이 존재한다.

- Load Distribution

- Packet Counter

- Requests

 

Load distribution:

4-10.png

 

 

Packet Counter:

4-12.png

HTTP 요청과 응답을 보여줍니다. 

 

Requests:

웹 서버에서 요청 받은 파일들을 보여준다.

4-13.png
 
 

IP address

4-14.png

네트워크 패킷의 출발지 IP주소를 보여준다. 
 

 

IP destinations

4-15.png
"Destinations" 섹션은 네트워크 패킷의 모든 목적지 IP 주소를 보여준다. 

 

IP Protocol Types

4-16.png

TCP나 UDP 포트의 통계 정보를 보여준다 
 

아 끝났네요^^ 와이어샤크는 손쉬운 조작으로 강력한 기능을 보여주네요~

간단하게 쓰기에는 정말 좋은거 같아요 ~

이제 기본 툴은 여기까지 하고 다음 시간부터는 OSI 7계층 정리와 패킷에 대한 분석

그리고 시간이 남으면 와이어 샤크로 여려 상황의 대한 패킷분석을 보여 드릴께요^^

 

읽어주셔서 감사합니다__)/

저작자 표시 비영리 변경 금지
Posted by 보미아빠

http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=41&MAEULNo=17&no=10732&ref=10732

댓글 수정하면 스크립트가 다 깨져서 블로그로 옮깁니다.

 

compute scalar 가 union all 을 수행하는 메타 데이터를 검색해야 하는데 이때 server_info 와 t_ipinfo 의 컬럼 정보를 가져와 merge 를 수행합니다. 그러므로 server_info 의 meta data와 호환되지 않는 잠금이 있다면 실행되지 않습니다. tablockx 를 holdlock 으로 걸어 계속 유지를 한다면, 해당 object 전체가 잠기게 됩니다. (schema 를 포함해서 모두 잠깁니다.)

그러므로, 2번째 쿼리는 compute scalar 이터레이터를 server_info 의 컬럼정보가 모두 잠겨있으니 union all 을 수행하지 못하고 대기하고 있는중입니다.

 

 

session 69 에서 실행한 쿼리

BEGIN TRAN
SELECT * FROM TBLX WITH (tablockx, holdlock)

 

session_id 68에서 실행한 쿼리

SELECT * FROM TBLX WHERE 1=0
UNION ALL
SELECT * FROM TBLY WHERE 1=1

 

select * from sys.dm_tran_locks

확인

object id      mode  request_status   session id
245575913 0 X         LOCK GRANT      69  <---- object X lock 이 걸림
245575913 0 IS        LOCK WAIT         68  <---- 두번째 쿼리는 해당 object 에 IS 락을 얻기위해 대기합니다.

 

내부에 메터데이터를 unionall 하는것은 3가지 정도로 확인할 수 있습니다.

 

tablename    object_id
--------------
tblx         245575913
tbly         261575970

 

테스트 쿼리
--------------
SELECT * FROM TBLX WHERE 1=0
UNION ALL
SELECT * FROM TBLY WHERE 1=1

 

1,
xml plan 에 outputlist 를 확인하면 아래와 같은것이 있을겁니다. 이는 메터를 확인하는 과정이 추가된다고 추측할 수 있습니다.
그러나, server_info 에 접근하는 것은 볼 수 없죠. (저는 tblx 가 server_info 이고 tbly 가 t_ipinfo 입니다. )

 

                <ColumnReference Column="Union1008" />


                  <DefinedValue>
                    <ColumnReference Column="Union1008" />
                    <ScalarOperator ScalarString="[t].[dbo].[tbly].[cd]">
                      <Identifier>
                        <ColumnReference Database="[t]" Schema="[dbo]" Table="[tbly]" Column="cd" />
                      </Identifier>
                    </ScalarOperator>
                  </DefinedValue>

 

2,
메타에 접근하는지는 실제 lock 을 얻으러가는것을 조회해 보면 되는데 실제 테이블에 먼저 접근해 unionall 도 수행하고 server_info에 접근하는것도 볼 수 있습니다. session_id 는 바꾸어 테스트 하시길 바랍니다.


CREATE EVENT SESSION [XE_PLAN3] ON SERVER
ADD EVENT sqlos.wait_info(
    ACTION(package0.callstack,sqlserver.sql_text,sqlserver.tsql_stack)
    WHERE ([sqlserver].[session_id]=(68))),
ADD EVENT sqlserver.expression_compile_stop_batch_processing(
    ACTION(package0.callstack,sqlserver.sql_text)
    WHERE ([sqlserver].[session_id]=(68))),
ADD EVENT sqlserver.lock_acquired(
    ACTION(package0.callstack,sqlserver.sql_text)
    WHERE ([sqlserver].[session_id]=(68))),
ADD EVENT sqlserver.locks_lock_waits(
    ACTION(package0.callstack,sqlserver.sql_text,sqlserver.tsql_stack)
    WHERE ([sqlserver].[session_id]=(68))),
ADD EVENT sqlserver.query_post_compilation_showplan(
    ACTION(package0.callstack,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_stack)
    WHERE ([sqlserver].[session_id]=(68))),
ADD EVENT sqlserver.sql_batch_starting(SET collect_batch_text=(1)
    ACTION(package0.callstack,sqlserver.sql_text)
    WHERE ([sqlserver].[session_id]=(68)))
ADD TARGET package0.event_file(SET filename=N'XE_PLAN3'),
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY=102400 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=1 SECONDS,MAX_EVENT_SIZE=307200 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO

ALTER EVENT SESSION XE_PLAN3 ON SERVER STATE=START
GO


tblx 즉 server_info에 sch_s 락을 요구하는것은 확인할 수 있습니다.

 

  <event name="lock_acquired" package="sqlserver" timestamp="2014-11-02T08:16:37.103Z">
    <data name="resource_type">
      <type name="lock_resource_type" packge="sqlserver"></type>
      <value>5</value>
      <text><![CDATA[OBJECT]]></text>
    </data>
    <data name="mode">
      <type name="lock_mode" package="sqlserver"></type>
      <value>1</value>
      <text><![CDATA[SCH_S]]></text>
    </data>
    <data name="owner_type">
      <type name="lock_owner_type" package="sqlserver"></type>
      <value>1</value>
      <text><![CDATA[Transaction]]></text>
    </data>
    <data name="transaction_id">
      <type name="int64" package="package0"></type>
      <value>151279</value>
    </data>
    <data name="database_id">
      <type name="uint32" package="package0"></type>
      <value>5</value>
    </data>
    <data name="lockspace_workspace_id">
      <type name="ptr" package="package0"></type>
      <value>0x00000004746c1770</value>
    </data>
    <data name="lockspace_sub_id">
      <type name="uint32" package="package0"></type>
      <value>1</value>
    </data>
    <data name="lockspace_nest_id">
      <type name="uint32" package="package0"></type>
      <value>1</value>
    </data>
    <data name="resource_0">
      <type name="uint32" package="package0"></type>
      <value>245575913</value>   <--- 이부분이 tblx 입니다. 
    </data>
    <data name="resource_1">
      <type name="uint32" package="package0"></type>
      <value>0</value>
    </data>
    <data name="resource_2">
      <type name="uint32" package="package0"></type>
      <value>0</value>
    </data>
    <data name="object_id">
      <type name="int32" package="package0"></type>
      <value>245575913</value>
    </data>
    <data name="associated_object_id">
      <type name="uint64" package="package0"></type>
      <value>245575913</value>
    </data>
    <data name="duration">
      <type name="uint64" package="package0"></type>
      <value>0</value>
    </data>
    <data name="resource_description">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[]]></value>
    </data>
    <data name="database_name">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[]]></value>
    </data>
    <action name="callstack" package="package0">
      <type name="callstack" package="package0"></type>
      <value><![CDATA[XeSqlPkg::lock_acquired::Publish+1ba [ @ 0+0x0
lck_ProduceExtendedEvent<XeSqlPkg::lock_acquired>+189 [ @ 0+0x0
lck_lockInternal+1402 [ @ 0+0x0
MDL::LockObjectLocal+443 [ @ 0+0x0
CMEDCacheEntryFactory::AcquireLock+48 [ @ 0+0x0
CMEDCatalogObject::GetCachedObjectById+157 [ @ 0+0x0
CMEDCatalogObject::GetCachedObjectByName+6b [ @ 0+0x0
CMEDProxySchema::GetObjectByName+6e [ @ 0+0x0
IMetadataAccess::GetMultiNameObjectHelper+6dd [ @ 0+0x0
CMEDAccess::GetMultiNameObject+c9 [ @ 0+0x0
CAlgTableMetadata::FPartialBind+712 [ @ 0+0x0
CAlgTableMetadata::Bind+31d [ @ 0+0x0
CRelOp_Get::BindTree+483 [ @ 0+0x0
COptExpr::BindTree+85 [ @ 0+0x0
CRelOp_FromList::BindTree+37 [ @ 0+0x0
COptExpr::BindTree+85 [ @ 0+0x0
CRelOp_Select::BindTree+32 [ @ 0+0x0
COptExpr::BindTree+85 [ @ 0+0x0
CRelOp_QuerySpec::BindTree+f0 [ @ 0+0x0
COptExpr::BindTree+85 [ @ 0+0x0
CRelOp_UnionAll::BindTree+118 [ @ 0+0x0
COptExpr::BindTree+85 [ @ 0+0x0
CRelOp_SelectQuery::BindTree+80 [ @ 0+0x0
COptExpr::BindTree+85 [ @ 0+0x0]]></value>
    </action>
    <action name="sql_text" package="sqlserver">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[SELECT * FROM TBLX WHERE 1=0
UNION ALL
SELECT * FROM TBLY WHERE 1=1]]></value>
    </action>
  </event>

 

callstack 을 모니터링 하는 방법은 http://sqlsql.tistory.com/353 를 참조하시길 바랍니다.

 

3,

플랜의 노드를 좀 더 상세히 보면

dbcc traceon (3604)
dbcc traceon (7352) -- 쿼리 트리 노드의 추가정보 출력

SELECT * FROM TBLX WHERE 1=0
UNION ALL
SELECT * FROM TBLY WHERE 1=1

tblx 의 컬럼정보를 기준으로 union1008, 9, 10 이 생성되는 것을 볼 수 있습니다.
그러니 where 1=0 이 있다고 하더라도 컬럼정보는 본다고 하는것이 옳습니다.

Compute Scalar Compute Scalar (0)
                    [CALC:COL: Union1008  TI(int,Null,ML=4)] 0000000472C9A470  P  N
                    [CALC:COL: Union1009  TI(varchar collate 53265,Null,Var,Trim,ML=10)] 0000000472C9A560  P  N
                    [CALC:COL: Union1010  TI(varchar collate 53265,Null,Var,Trim,ML=10)] 0000000472C9A640  P  N
Table Scan Table Scan (1)
                      [QCOL: [t].[dbo].[tbly].cd TI(int,Null,ML=4)] 0000000472C9A160  P  N
                      [QCOL: [t].[dbo].[tbly].status TI(varchar collate 53265,Null,Var,Trim,ML=10)] 0000000472C9A2A0  P  N
                      [QCOL: [t].[dbo].[tbly].c1 TI(varchar collate 53265,Null,Var,Trim,ML=10)] 0000000472C9A3D0  P  N

 

-- 증명
create table abcd
(aaabbb int
,cccddd int
)
go

create table efgh
(aaabbb bigint
,cccddd bigint
)
go

dbcc traceon (3604)
dbcc traceon (7352)

select * from abcd where 1=1
union all
select * from efgh where 1=0
go

 

-- 실제 사용은 하지 않지만 efgh 테이블에서 bigint 컬럼을 기준으로 union 하는 과정을 볼 수 있음
Compute Scalar Compute Scalar (0)
                    [CALC:COL: Union1010  TI(bigint,Null,ML=8)] 0000000472496240  P  N
                    [CALC:COL: Union1011  TI(bigint,Null,ML=8)] 0000000472496320  P  N
Table Scan Table Scan (1)
                    [QCOL: [t].[dbo].[abcd].aaabbb TI(int,Null,ML=4)] 0000000472496060  P  N
                    [QCOL: [t].[dbo].[abcd].cccddd TI(int,Null,ML=4)] 0000000472496190  P  N

 

-- int 만 실행한 경우 (bigint convert 과정이 없다)
select * from abcd where 1=1
Table Scan Table Scan (0)
                    [QCOL: [t].[dbo].[abcd].aaabbb TI(int,Null,ML=4)] 0000000474A81B30  P  N
                    [QCOL: [t].[dbo].[abcd].cccddd TI(int,Null,ML=4)] 0000000474A81C60  P  N

 

 

 

 

 

실행계획에 모든것이 나오지는 않습니다.

위 댓글은 실행계획에서 잘 표시되지 않은 부분을 extended events로 찾고 실행계획에서 빠진 unionall 부분을 증명한 부분입니다.

 

아래 블로그는 paul white 라는 분이 작성한 글입니다. 잘 알려지지 않은 prefetch 를 설명하고 실행계획 그림에는 나타나지 않고 debug를 통해서 확인은 가능하다는것을 보여줍니다. prefetch 가 한번 생성된 실행계획은 cold 이든 warm 상태이든 나타나게 됩니다. 이것을 scalar function call 의 실행횟수를 보여주며 증명 합니다. 또한 실행계획의 노드 id 가 건너뛴것을 보면 일부 생략된것을 알 수 있습니다. 시간 나실때 paul white 님의 블로그를 보시면 sql server optimizer 에 대해 깊이있는 공부를 할 수 있을겁니다.

 

실행계획은 왼쪽에서 오른쪽 상위번호로 컨트롤 시그널을 보내고 상위번호에서 아래번호로 데이터를 페치합니다. 흔히들 오른쪽부터 읽는다라고 하지만 이는 조금 불완전한 설명입니다. 학원이나 강의에서 오른쪽 위부터 읽는다라고 가르치면 찬찬히 설명해 주시길 바랍니다. ;)

 

http://sqlblog.com/blogs/paul_white/archive/2013/08/31/sql-server-internals-nested-loops-prefetching.aspx

 

 

 

저작자 표시 비영리 변경 금지
Posted by 보미아빠

linked server

분류없음 / 2014/10/30 10:13

http://m.blog.daum.net/partsofmemory/110#  


 

저작자 표시 비영리 변경 금지
Posted by 보미아빠

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

티스토리 툴바