<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=HASH%EC%A1%B0%EC%9D%B8_%EC%84%B1%EB%8A%A5%EC%A0%80%ED%95%98_%ED%8C%8C%EC%9D%B4%EC%8D%AC_%EC%98%88%EC%A0%9C</id>
	<title>HASH조인 성능저하 파이썬 예제 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=HASH%EC%A1%B0%EC%9D%B8_%EC%84%B1%EB%8A%A5%EC%A0%80%ED%95%98_%ED%8C%8C%EC%9D%B4%EC%8D%AC_%EC%98%88%EC%A0%9C"/>
	<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=HASH%EC%A1%B0%EC%9D%B8_%EC%84%B1%EB%8A%A5%EC%A0%80%ED%95%98_%ED%8C%8C%EC%9D%B4%EC%8D%AC_%EC%98%88%EC%A0%9C&amp;action=history"/>
	<updated>2026-05-08T14:29:59Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=HASH%EC%A1%B0%EC%9D%B8_%EC%84%B1%EB%8A%A5%EC%A0%80%ED%95%98_%ED%8C%8C%EC%9D%B4%EC%8D%AC_%EC%98%88%EC%A0%9C&amp;diff=1199&amp;oldid=prev</id>
		<title>2025년 8월 8일 (금) 05:31에 Oracle님의 편집</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=HASH%EC%A1%B0%EC%9D%B8_%EC%84%B1%EB%8A%A5%EC%A0%80%ED%95%98_%ED%8C%8C%EC%9D%B4%EC%8D%AC_%EC%98%88%EC%A0%9C&amp;diff=1199&amp;oldid=prev"/>
		<updated>2025-08-08T05:31:53Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2025년 8월 8일 (금) 14:31 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l149&quot;&gt;149번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;149번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{결론&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{결론&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|내용 =* Hash Bucket은 조인 키를 해시 영역으로 나누는 인덱스 역할을 하며, 균형 잡힌 버킷과 충분한 메모리가 성능의 핵심입니다.  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|내용 = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[결론]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Hash Bucket은 조인 키를 해시 영역으로 나누는 인덱스 역할을 하며, 균형 잡힌 버킷과 충분한 메모리가 성능의 핵심입니다.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 버킷 과밀과 키 왜곡은 체인 스캔 비용을 키워 성능을 크게 떨어뜨립니다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 버킷 과밀과 키 왜곡은 체인 스캔 비용을 키워 성능을 크게 떨어뜨립니다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Oracle</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=HASH%EC%A1%B0%EC%9D%B8_%EC%84%B1%EB%8A%A5%EC%A0%80%ED%95%98_%ED%8C%8C%EC%9D%B4%EC%8D%AC_%EC%98%88%EC%A0%9C&amp;diff=1198&amp;oldid=prev</id>
		<title>2025년 8월 8일 (금) 05:31에 Oracle님의 편집</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=HASH%EC%A1%B0%EC%9D%B8_%EC%84%B1%EB%8A%A5%EC%A0%80%ED%95%98_%ED%8C%8C%EC%9D%B4%EC%8D%AC_%EC%98%88%EC%A0%9C&amp;diff=1198&amp;oldid=prev"/>
		<updated>2025-08-08T05:31:22Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2025년 8월 8일 (금) 14:31 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l149&quot;&gt;149번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;149번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{결론&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{결론&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|내용 =*&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;- 요점: &lt;/del&gt;Hash Bucket은 조인 키를 해시 영역으로 나누는 인덱스 역할을 하며, 균형 잡힌 버킷과 충분한 메모리가 성능의 핵심입니다.  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|내용 =* Hash Bucket은 조인 키를 해시 영역으로 나누는 인덱스 역할을 하며, 균형 잡힌 버킷과 충분한 메모리가 성능의 핵심입니다.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 버킷 과밀과 키 왜곡은 체인 스캔 비용을 키워 성능을 크게 떨어뜨립니다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 버킷 과밀과 키 왜곡은 체인 스캔 비용을 키워 성능을 크게 떨어뜨립니다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;*- 위 파이썬 코드는 이러한 병목을 실험적으로 확인하도록 도와줍니다.&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* 위 파이썬 코드는 이러한 병목을 실험적으로 확인하도록 도와줍니다.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category:oracle]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category:oracle]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Oracle</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=HASH%EC%A1%B0%EC%9D%B8_%EC%84%B1%EB%8A%A5%EC%A0%80%ED%95%98_%ED%8C%8C%EC%9D%B4%EC%8D%AC_%EC%98%88%EC%A0%9C&amp;diff=1197&amp;oldid=prev</id>
		<title>2025년 8월 8일 (금) 05:30에 Oracle님의 편집</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=HASH%EC%A1%B0%EC%9D%B8_%EC%84%B1%EB%8A%A5%EC%A0%80%ED%95%98_%ED%8C%8C%EC%9D%B4%EC%8D%AC_%EC%98%88%EC%A0%9C&amp;diff=1197&amp;oldid=prev"/>
		<updated>2025-08-08T05:30:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2025년 8월 8일 (금) 14:30 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l149&quot;&gt;149번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;149번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{결론&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{결론&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|내용 =  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|내용 =&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;*&lt;/ins&gt;- 요점: Hash Bucket은 조인 키를 해시 영역으로 나누는 인덱스 역할을 하며, 균형 잡힌 버킷과 충분한 메모리가 성능의 핵심입니다.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;- 요점: Hash Bucket은 조인 키를 해시 영역으로 나누는 인덱스 역할을 하며, 균형 잡힌 버킷과 충분한 메모리가 성능의 핵심입니다. 버킷 과밀과 키 왜곡은 체인 스캔 비용을 키워 성능을 크게 떨어뜨립니다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* &lt;/ins&gt;버킷 과밀과 키 왜곡은 체인 스캔 비용을 키워 성능을 크게 떨어뜨립니다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;- 위 파이썬 코드는 이러한 병목을 실험적으로 확인하도록 도와줍니다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;*&lt;/ins&gt;- 위 파이썬 코드는 이러한 병목을 실험적으로 확인하도록 도와줍니다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category:oracle]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category:oracle]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Oracle</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=HASH%EC%A1%B0%EC%9D%B8_%EC%84%B1%EB%8A%A5%EC%A0%80%ED%95%98_%ED%8C%8C%EC%9D%B4%EC%8D%AC_%EC%98%88%EC%A0%9C&amp;diff=1196&amp;oldid=prev</id>
		<title>2025년 8월 8일 (금) 05:29에 Oracle님의 편집</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=HASH%EC%A1%B0%EC%9D%B8_%EC%84%B1%EB%8A%A5%EC%A0%80%ED%95%98_%ED%8C%8C%EC%9D%B4%EC%8D%AC_%EC%98%88%EC%A0%9C&amp;diff=1196&amp;oldid=prev"/>
		<updated>2025-08-08T05:29:12Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2025년 8월 8일 (금) 14:29 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l149&quot;&gt;149번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;149번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{결론&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{결론&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;제목 &lt;/del&gt;=  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;내용 &lt;/ins&gt;=  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;- 요점: Hash Bucket은 조인 키를 해시 영역으로 나누는 인덱스 역할을 하며, 균형 잡힌 버킷과 충분한 메모리가 성능의 핵심입니다. 버킷 과밀과 키 왜곡은 체인 스캔 비용을 키워 성능을 크게 떨어뜨립니다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;- 요점: Hash Bucket은 조인 키를 해시 영역으로 나누는 인덱스 역할을 하며, 균형 잡힌 버킷과 충분한 메모리가 성능의 핵심입니다. 버킷 과밀과 키 왜곡은 체인 스캔 비용을 키워 성능을 크게 떨어뜨립니다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;- 위 파이썬 코드는 이러한 병목을 실험적으로 확인하도록 도와줍니다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;- 위 파이썬 코드는 이러한 병목을 실험적으로 확인하도록 도와줍니다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Oracle</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=HASH%EC%A1%B0%EC%9D%B8_%EC%84%B1%EB%8A%A5%EC%A0%80%ED%95%98_%ED%8C%8C%EC%9D%B4%EC%8D%AC_%EC%98%88%EC%A0%9C&amp;diff=1194&amp;oldid=prev</id>
		<title>Oracle: 새 문서: == 해시조인 “문제 상황” 퍼이썬으로 재현 == * 두 가지 시나리오를 비교 *:- 시나리오 A(정상): 적정 버킷 수 + 고르게 분포된 키 *:- 시나리오 B(문제): 너무 적은 버킷 수 + 편향된 키(핫 키 집중) * 핵심 포인트는 “버킷 과밀 → 체인 길이 급증 → 조인 탐색 시간 증가”를 눈으로 확인하는 것입니다.  &lt;source lang=python&gt; import random import time from collections import defaultdict, Coun...</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=HASH%EC%A1%B0%EC%9D%B8_%EC%84%B1%EB%8A%A5%EC%A0%80%ED%95%98_%ED%8C%8C%EC%9D%B4%EC%8D%AC_%EC%98%88%EC%A0%9C&amp;diff=1194&amp;oldid=prev"/>
		<updated>2025-08-08T05:25:04Z</updated>

		<summary type="html">&lt;p&gt;새 문서: == 해시조인 “문제 상황” 퍼이썬으로 재현 == * 두 가지 시나리오를 비교 *:- 시나리오 A(정상): 적정 버킷 수 + 고르게 분포된 키 *:- 시나리오 B(문제): 너무 적은 버킷 수 + 편향된 키(핫 키 집중) * 핵심 포인트는 “버킷 과밀 → 체인 길이 급증 → 조인 탐색 시간 증가”를 눈으로 확인하는 것입니다.  &amp;lt;source lang=python&amp;gt; import random import time from collections import defaultdict, Coun...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 해시조인 “문제 상황” 퍼이썬으로 재현 ==&lt;br /&gt;
* 두 가지 시나리오를 비교&lt;br /&gt;
*:- 시나리오 A(정상): 적정 버킷 수 + 고르게 분포된 키&lt;br /&gt;
*:- 시나리오 B(문제): 너무 적은 버킷 수 + 편향된 키(핫 키 집중)&lt;br /&gt;
* 핵심 포인트는 “버킷 과밀 → 체인 길이 급증 → 조인 탐색 시간 증가”를 눈으로 확인하는 것입니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
from collections import defaultdict, Counter&lt;br /&gt;
&lt;br /&gt;
random.seed(42)&lt;br /&gt;
&lt;br /&gt;
class HashTable:&lt;br /&gt;
    def __init__(self, num_buckets: int):&lt;br /&gt;
        self.num_buckets = num_buckets&lt;br /&gt;
        # 각 버킷은 (key, payload) 튜플 리스트&lt;br /&gt;
        self.buckets = [[] for _ in range(num_buckets)]&lt;br /&gt;
        self.rows = 0&lt;br /&gt;
        self.collisions = 0&lt;br /&gt;
        self.max_chain = 0&lt;br /&gt;
&lt;br /&gt;
    def _bucket_idx(self, key):&lt;br /&gt;
        # 파이썬 내장 해시를 사용하되, 버킷 수로 모듈로&lt;br /&gt;
        return hash(key) % self.num_buckets&lt;br /&gt;
&lt;br /&gt;
    def insert(self, key, payload):&lt;br /&gt;
        idx = self._bucket_idx(key)&lt;br /&gt;
        bucket = self.buckets[idx]&lt;br /&gt;
        if bucket:  # 버킷에 이미 뭔가 있으면 충돌로 카운트&lt;br /&gt;
            self.collisions += 1&lt;br /&gt;
        bucket.append((key, payload))&lt;br /&gt;
        self.rows += 1&lt;br /&gt;
        if len(bucket) &amp;gt; self.max_chain:&lt;br /&gt;
            self.max_chain = len(bucket)&lt;br /&gt;
&lt;br /&gt;
    def probe(self, key):&lt;br /&gt;
        idx = self._bucket_idx(key)&lt;br /&gt;
        bucket = self.buckets[idx]&lt;br /&gt;
        # 동일 키만 반환 (동등 조인)&lt;br /&gt;
        return [p for (k, p) in bucket if k == key]&lt;br /&gt;
&lt;br /&gt;
def generate_data(n_build=50_000, n_probe=150_000, skew=False):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    빌드/프로브 양쪽에 키와 페이로드를 생성.&lt;br /&gt;
    skew=True면 &amp;#039;핫 키&amp;#039;가 대량으로 생성되어 특정 버킷에 몰리게 됨.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    build = []&lt;br /&gt;
    probe = []&lt;br /&gt;
&lt;br /&gt;
    if not skew:&lt;br /&gt;
        # 고른 분포: 넓은 키 도메인에서 균일 랜덤&lt;br /&gt;
        domain = n_build * 20&lt;br /&gt;
        build_keys = [random.randint(0, domain) for _ in range(n_build)]&lt;br /&gt;
        probe_keys = [random.randint(0, domain) for _ in range(n_probe)]&lt;br /&gt;
    else:&lt;br /&gt;
        # 편향된 분포: 80%는 작은 도메인(핫 키), 20%는 넓은 도메인&lt;br /&gt;
        hot_ratio = 0.8&lt;br /&gt;
        hot_domain = max(10, n_build // 200)   # 매우 작은 도메인&lt;br /&gt;
        cold_domain = n_build * 20&lt;br /&gt;
&lt;br /&gt;
        def skewed_keys(n):&lt;br /&gt;
            keys = []&lt;br /&gt;
            for _ in range(n):&lt;br /&gt;
                if random.random() &amp;lt; hot_ratio:&lt;br /&gt;
                    keys.append(random.randint(0, hot_domain))  # 핫 영역&lt;br /&gt;
                else:&lt;br /&gt;
                    keys.append(random.randint(hot_domain + 1, hot_domain + cold_domain))&lt;br /&gt;
            return keys&lt;br /&gt;
&lt;br /&gt;
        build_keys = skewed_keys(n_build)&lt;br /&gt;
        probe_keys = skewed_keys(n_probe)&lt;br /&gt;
&lt;br /&gt;
    # 페이로드는 단순 숫자/문자열&lt;br /&gt;
    build = [(k, f&amp;quot;B{k}&amp;quot;) for k in build_keys]&lt;br /&gt;
    probe = [(k, f&amp;quot;P{k}&amp;quot;) for k in probe_keys]&lt;br /&gt;
    return build, probe&lt;br /&gt;
&lt;br /&gt;
def hash_join(build_rows, probe_rows, num_buckets):&lt;br /&gt;
    ht = HashTable(num_buckets)&lt;br /&gt;
    t0 = time.perf_counter()&lt;br /&gt;
    for k, p in build_rows:&lt;br /&gt;
        ht.insert(k, p)&lt;br /&gt;
    t1 = time.perf_counter()&lt;br /&gt;
&lt;br /&gt;
    matches = 0&lt;br /&gt;
    for k, _ in probe_rows:&lt;br /&gt;
        matches += len(ht.probe(k))&lt;br /&gt;
    t2 = time.perf_counter()&lt;br /&gt;
&lt;br /&gt;
    stats = {&lt;br /&gt;
        &amp;quot;num_buckets&amp;quot;: num_buckets,&lt;br /&gt;
        &amp;quot;build_rows&amp;quot;: len(build_rows),&lt;br /&gt;
        &amp;quot;probe_rows&amp;quot;: len(probe_rows),&lt;br /&gt;
        &amp;quot;collisions&amp;quot;: ht.collisions,&lt;br /&gt;
        &amp;quot;max_chain&amp;quot;: ht.max_chain,&lt;br /&gt;
        &amp;quot;avg_rows_per_bucket&amp;quot;: round(ht.rows / num_buckets, 2),&lt;br /&gt;
        &amp;quot;build_time_ms&amp;quot;: round((t1 - t0) * 1000, 2),&lt;br /&gt;
        &amp;quot;probe_time_ms&amp;quot;: round((t2 - t1) * 1000, 2),&lt;br /&gt;
        &amp;quot;total_time_ms&amp;quot;: round((t2 - t0) * 1000, 2),&lt;br /&gt;
        &amp;quot;matches&amp;quot;: matches&lt;br /&gt;
    }&lt;br /&gt;
    return stats&lt;br /&gt;
&lt;br /&gt;
def run_scenarios():&lt;br /&gt;
    n_build = 50_000&lt;br /&gt;
    n_probe = 150_000&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;=== 시나리오 A: 균일 분포 + 충분한 버킷 ===&amp;quot;)&lt;br /&gt;
    buildA, probeA = generate_data(n_build, n_probe, skew=False)&lt;br /&gt;
    statsA = hash_join(buildA, probeA, num_buckets=65_536)  # 충분한 버킷&lt;br /&gt;
    for k, v in statsA.items():&lt;br /&gt;
        print(f&amp;quot;{k}: {v}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\n=== 시나리오 B: 편향 분포 + 부족한 버킷(문제 상황) ===&amp;quot;)&lt;br /&gt;
    buildB, probeB = generate_data(n_build, n_probe, skew=True)&lt;br /&gt;
    statsB = hash_join(buildB, probeB, num_buckets=512)  # 의도적으로 작은 버킷&lt;br /&gt;
    for k, v in statsB.items():&lt;br /&gt;
        print(f&amp;quot;{k}: {v}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # 간단한 비교 요약&lt;br /&gt;
    print(&amp;quot;\n=== 비교 요약 ===&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;버킷 충분(A) vs 부족(B) - max_chain: {statsA[&amp;#039;max_chain&amp;#039;]} vs {statsB[&amp;#039;max_chain&amp;#039;]}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;버킷 충분(A) vs 부족(B) - probe_time_ms: {statsA[&amp;#039;probe_time_ms&amp;#039;]} vs {statsB[&amp;#039;probe_time_ms&amp;#039;]}&amp;quot;)&lt;br /&gt;
    print(&amp;quot;체인 길이와 프로브 시간의 상관 관계를 확인해 보세요.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    run_scenarios()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 예상 시나리오 ===&lt;br /&gt;
1) 시나리오 A(균일+버킷 충분): max_chain이 상대적으로 작고, probe_time이 짧습니다.&lt;br /&gt;
2) 시나리오 B(편향+버킷 부족): collisions와 max_chain이 커지고, probe_time이 유의미하게 늘어납니다.&lt;br /&gt;
&lt;br /&gt;
* 이것이 Oracle에서 키 왜곡과 버킷 과밀로 인해 체인 스캔 비용이 증가하는 현상의 축약판입니다. &lt;br /&gt;
* 실제 Oracle은 더 정교한 해시/배치/스필 전략을 사용하지만, 기본 병목(충돌→체인 스캔→CPU↑/I/O↑)은 동일합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Oracle 현상과의 연관성 ===&lt;br /&gt;
# Python 시뮬레이션의 “버킷 부족/스큐 → max_chain↑ → probe_time↑”는&lt;br /&gt;
#:  - Oracle의 “키 왜곡으로 특정 버킷 과밀” 또는 “메모리 부족으로 배치/스필 발생” 시, 버킷 체인 스캔과 추가 I/O로 응답시간이 늘어나는 것과 같은 맥락입니다.&lt;br /&gt;
# 실전 튜닝 체크리스트&lt;br /&gt;
#:  - 빌드/프로브 선택 검토(SWAP_JOIN_INPUTS), 작은 쪽을 빌드로.&lt;br /&gt;
#:  - 조인 키 히스토그램으로 스큐 인지, 통계 최신화.&lt;br /&gt;
#:  - PGA/동시성 조정으로 스필 최소화(1-pass/multipass 회피).&lt;br /&gt;
#:  - 병렬 시 분배 전략 조정(작은 테이블 BROADCAST, 큰 테이블 HASH 등).&lt;br /&gt;
#:  - 심한 핫 키는 설계/SQL에서 SALT 기법으로 분산.&lt;br /&gt;
#:  - 상황에 따라 USE_NL/USE_MERGE로 방식 전환.&lt;br /&gt;
&lt;br /&gt;
{{결론&lt;br /&gt;
|제목 = &lt;br /&gt;
- 요점: Hash Bucket은 조인 키를 해시 영역으로 나누는 인덱스 역할을 하며, 균형 잡힌 버킷과 충분한 메모리가 성능의 핵심입니다. 버킷 과밀과 키 왜곡은 체인 스캔 비용을 키워 성능을 크게 떨어뜨립니다.&lt;br /&gt;
- 위 파이썬 코드는 이러한 병목을 실험적으로 확인하도록 도와줍니다.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[category:oracle]]&lt;/div&gt;</summary>
		<author><name>Oracle</name></author>
	</entry>
</feed>