<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AnySQL.net &#187; Join</title>
	<atom:link href="http://www.anysql.net/tag/join/feed" rel="self" type="application/rss+xml" />
	<link>http://www.anysql.net</link>
	<description>SQLULDR2, DataCopy, DataSync, WebChart, OraMon, AUL/MyDUL, 性能优化及容量分析</description>
	<lastBuildDate>Wed, 14 Jul 2010 09:27:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>OR引起的Join性能问题</title>
		<link>http://www.anysql.net/dba/hash_join_or_condition.html</link>
		<comments>http://www.anysql.net/dba/hash_join_or_condition.html#comments</comments>
		<pubDate>Sat, 15 Mar 2008 17:25:34 +0000</pubDate>
		<dc:creator>anysql</dc:creator>
				<category><![CDATA[DBA]]></category>
		<category><![CDATA[Join]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Tuning]]></category>

		<guid isPermaLink="false">http://www.anysql.net/wordpress/uncategorized/or%e5%bc%95%e8%b5%b7%e7%9a%84join%e6%80%a7%e8%83%bd%e9%97%ae%e9%a2%98.html</guid>
		<description><![CDATA[&#160; &#160; 在SQL语句中用了OR之后, 其实很不容易控制, 第一次是想让一个带两个OR的用UNION去执行, 结果用了USE_CONCAT后变成了4个UNION了, 居然没有办法让他按我想象的第一个OR进行UNION. 第二次是在索引上, OR条件导致了不能在索引上进行条件过滤. 现在遇到了第三次, 是同事发现的, 怕自已记不住, 就没有征得他的同意, 在这儿共享出来了. &#160; &#160; 有下面两个表, TYPE_ID列上值的重复性很高. CREATE TABLE T_SMALL (TYPE_ID, ID, &#8230;); CREATE TABLE T_MIDDLE (TYPE_ID, ID1, ID2, &#8230;); &#160; &#160; 运行下面的SQL时, 总是很慢, 我们已经指定用HASH JOIN, 并也指定了T_SMALL是驱动表, 百思不得其解. SELECT &#8230;.. &#160;&#160;FROM T_SMALL S, T_MIDDLE M &#160;&#160;WHERE S.TYPE_ID = M.TYPE_ID &#160;&#160;&#160;&#160;AND (S.ID = M.ID1 OR [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp; &nbsp; 在SQL语句中用了OR之后, 其实很不容易控制, 第一次是想让一个带两个OR的用UNION去执行, 结果用了USE_CONCAT后变成了4个UNION了, 居然没有办法让他按我想象的第一个OR进行UNION. 第二次是在索引上, OR条件导致了不能在索引上进行<a href="http://www.anysql.net/dba/index_vs_table_filter.html">条件过滤</a>. 现在遇到了第三次, 是同事发现的, 怕自已记不住, 就没有征得他的同意, 在这儿共享出来了. </p>
<p>&nbsp; &nbsp; 有下面两个表, TYPE_ID列上值的重复性很高.</p>
<blockquote class="prefont"><p>
CREATE TABLE T_SMALL (TYPE_ID, ID, &#8230;);<br />
CREATE TABLE T_MIDDLE (TYPE_ID, ID1, ID2, &#8230;);
</p></blockquote>
<p>&nbsp; &nbsp; 运行下面的SQL时, 总是很慢, 我们已经指定用HASH JOIN, 并也指定了T_SMALL是驱动表, 百思不得其解. </p>
<blockquote class="prefont"><p>
SELECT &#8230;..<br />
&nbsp;&nbsp;FROM T_SMALL S, T_MIDDLE M<br />
&nbsp;&nbsp;WHERE S.TYPE_ID = M.TYPE_ID <br />
&nbsp;&nbsp;&nbsp;&nbsp;AND (S.ID = M.ID1 OR S.ID = M.ID2)
</p></blockquote>
<p>&nbsp; &nbsp; 第一百零一思时, 发现了原因所在, 因为OR的问题, Oracle在做HASH JOIN时只依据了TYPE_ID这个效率不高的列, 这时的PLAN中肯定出现了FILTER这样的步骤. 后来将这个语句手工改成UNION方式, 就从2个小时变成了15分钟. </p>
<blockquote class="prefont"><p>
SELECT &#8230;..<br />
&nbsp;&nbsp;FROM T_SMALL S, T_MIDDLE M<br />
&nbsp;&nbsp;WHERE S.TYPE_ID = M.TYPE_ID <br />
&nbsp;&nbsp;&nbsp;&nbsp;AND S.ID = M.ID1 <br />
UNION ALL <br />
SELECT &#8230;..<br />
&nbsp;&nbsp;FROM T_SMALL S, T_MIDDLE M<br />
&nbsp;&nbsp;WHERE S.TYPE_ID = M.TYPE_ID <br />
&nbsp;&nbsp;&nbsp;&nbsp;AND S.ID = M.ID2 AND M.ID1 &lt;&gt; M.ID2
</p></blockquote>
<p>&nbsp; &nbsp; SQL语句的调优, 其实很需要功夫, 也是一门很深的学问, 如此简单的SQL, 也有很深刻的知识. </p>
<h3  class="related_post_title">Relative Posts:</h3><ul class="related_post"><li>2008/08/04 -- <a href="http://www.anysql.net/oracle/high_phyread_assm_dml.html" title="ASSM下DML的物理读高">ASSM下DML的物理读高</a> (5)</li><li>2008/01/15 -- <a href="http://www.anysql.net/dba/after_analyze_whole_schema.html" title="分析用户所有表之后">分析用户所有表之后</a> (5)</li><li>2007/08/06 -- <a href="http://www.anysql.net/oracle/oracle_skip_locked_gets.html" title="FOR UPDATE SKIP LOCKED语句中的逻辑读">FOR UPDATE SKIP LOCKED语句中的逻辑读</a> (3)</li><li>2007/06/06 -- <a href="http://www.anysql.net/dba/index_vs_table_filter.html" title="OR引起的性能问题, 在表上进行行过滤">OR引起的性能问题, 在表上进行行过滤</a> (4)</li><li>2007/04/24 -- <a href="http://www.anysql.net/oracle/how_to_create_hash_table.html" title="如何创建Single Hash Cluster的表?">如何创建Single Hash Cluster的表?</a> (3)</li><li>2007/04/24 -- <a href="http://www.anysql.net/dba/choose_wrong_function.html" title="选择了错误的实现方法, 其实很简单!">选择了错误的实现方法, 其实很简单!</a> (8)</li><li>2007/03/22 -- <a href="http://www.anysql.net/oracle/in_list_sql_memory.html" title="过长的In List引起的共享池内存问题">过长的In List引起的共享池内存问题</a> (4)</li><li>2009/07/09 -- <a href="http://www.anysql.net/dba/oracle-where-filter-order.html" title="SQL执行filter条件的顺序问题">SQL执行filter条件的顺序问题</a> (2)</li><li>2009/06/25 -- <a href="http://www.anysql.net/tools/oramon-system-event.html" title="oramon如何收集V$SYSTEM_EVENT数据?">oramon如何收集V$SYSTEM_EVENT数据?</a> (3)</li><li>2009/06/25 -- <a href="http://www.anysql.net/tools/oramon-session-history.html" title="oramon如何从V$SESSION收集性能数据?">oramon如何从V$SESSION收集性能数据?</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.anysql.net/dba/hash_join_or_condition.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>MySQL每个Session所需要的内存情况</title>
		<link>http://www.anysql.net/mysql/mysql_session_memory_usage.html</link>
		<comments>http://www.anysql.net/mysql/mysql_session_memory_usage.html#comments</comments>
		<pubDate>Thu, 05 Apr 2007 05:05:02 +0000</pubDate>
		<dc:creator>anysql</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Buffer]]></category>
		<category><![CDATA[Join]]></category>
		<category><![CDATA[Memory]]></category>
		<category><![CDATA[Session]]></category>
		<category><![CDATA[Sort]]></category>

		<guid isPermaLink="false">http://www.anysql.net/wordpress/uncategorized/mysql%e6%af%8f%e4%b8%aasession%e6%89%80%e9%9c%80%e8%a6%81%e7%9a%84%e5%86%85%e5%ad%98%e6%83%85%e5%86%b5.html</guid>
		<description><![CDATA[1, PGA &#160; &#160; 在Oracle中每个会话都会有PGA, MySQL中的会话也是如此. 主要包括三部份: (a), 堆栈区, 由THREAD_STACK变量来决定; (b), 接收缓冲(Receive Buffer/Connection Buffer), 由NET_BUFFER_LENGTH参数决定; (c), 发送缓冲(Send Buffer/Result Buffer), 同接收缓冲区同样大小. 当在执行SQL语时, 会将SQL语句的文本复制一份, 如果你的SQL写得很长, 这部份也不可以小看的哦! 当进程或线程不再需要时, 则这些内存区域会释放. 2, IO Buffer &#160; &#160; IO读取缓冲, 顺序读时由参数READ_BUFFER_SIZE控制大小, 而随机读时由READ_RND_BUFFER_SIZE参数来决定, 在InnoDB下据说是没用的, 因为InnoDB本身就缓冲机制, 但是在读取临时文件时是否有效呢? 象Oracle中有专门的SORT_MULTIBLOCK_READ_COUNT参数. 3, Sort Buffer &#160; &#160; 象Oracle中的SORT_AREA_SIZE一样, MySQL也有参数SORT_BUFFER_SIZE来将数据放到内存来进行排序, 比较容易理解. 有一个问题是, 当排序操作执行完后, 这些内存是立刻释放呢? 还是要到会话结束呢? 4, Join Buffer &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>1, <b>PGA</b> </p>
<p>&nbsp; &nbsp; 在Oracle中每个会话都会有PGA, MySQL中的会话也是如此. 主要包括三部份: (a), 堆栈区, 由THREAD_STACK变量来决定; (b), 接收缓冲(Receive Buffer/Connection Buffer), 由NET_BUFFER_LENGTH参数决定; (c), 发送缓冲(Send Buffer/Result Buffer), 同接收缓冲区同样大小. 当在执行SQL语时, 会将SQL语句的文本复制一份, 如果你的SQL写得很长, 这部份也不可以小看的哦! 当进程或线程不再需要时, 则这些内存区域会释放.</p>
<p>2, <b>IO Buffer</b> </p>
<p>&nbsp; &nbsp; IO读取缓冲, 顺序读时由参数READ_BUFFER_SIZE控制大小, 而随机读时由READ_RND_BUFFER_SIZE参数来决定, 在InnoDB下据说是没用的, 因为InnoDB本身就缓冲机制, 但是在读取临时文件时是否有效呢? 象Oracle中有专门的SORT_MULTIBLOCK_READ_COUNT参数. </p>
<p>3, <b>Sort Buffer</b> </p>
<p>&nbsp; &nbsp; 象Oracle中的SORT_AREA_SIZE一样, MySQL也有参数SORT_BUFFER_SIZE来将数据放到内存来进行排序, 比较容易理解. 有一个问题是, 当排序操作执行完后, 这些内存是立刻释放呢? 还是要到会话结束呢? </p>
<p>4, <b>Join Buffer</b> </p>
<p>&nbsp; &nbsp; 我到现在还不明白这一块内存是怎么用的? 当一个表没有索引可以用时, MySQL用这一块内存区进行Fast Full Join, 每两个表之间的Full Join都会使用一块这个区域, 如果更复杂的SQL包括很多个表, 有可能要使用多个Join Buffer, <strong>这下我更晕了</strong>, 理论上(按照Oracle的)最多两个就够了吧, 因为Join只能在两个表间进行. 另外MySQL中所有的内存中的表都以Hash方式组织, 因此好象都是Oracle的Hash Join了?</p>
<p>5, <b>BLOB Buffer</b> </p>
<p>&nbsp; &nbsp; 当我们去扫描一个有BLOB列的表时, 会要配一个和返回记录中最大的BLOB大小一样的缓冲区. 这个有点不爽了, 如果BLOB中有两G的数据呢? 这一块如何释放呢? SQL执行完了就释放? </p>
<p>&nbsp; &nbsp; 以上只是我在看书时的猜测, 请大家扔砖吧! </p>
<h3  class="related_post_title">Relative Posts:</h3><ul class="related_post"><li>2007/04/05 -- <a href="http://www.anysql.net/mysql/how_mysql_do_sort.html" title="MySQL数据库如何进行排序(Sort)操作?">MySQL数据库如何进行排序(Sort)操作?</a> (1)</li><li>2010/02/26 -- <a href="http://www.anysql.net/tools/webchart-dbconn-config2.html" title="WebChart的DB连接配置2">WebChart的DB连接配置2</a> (0)</li><li>2010/02/20 -- <a href="http://www.anysql.net/tools/webchart-multidb-support.html" title="定义不同数据源的SQL">定义不同数据源的SQL</a> (4)</li><li>2010/01/26 -- <a href="http://www.anysql.net/tools/webchart-logical-dbaccess2.html" title="逻辑连接层与物理连接层(2)">逻辑连接层与物理连接层(2)</a> (1)</li><li>2010/01/05 -- <a href="http://www.anysql.net/tools/webchart-forall-loop.html" title="DataReport中的FORALL循环">DataReport中的FORALL循环</a> (0)</li><li>2009/12/25 -- <a href="http://www.anysql.net/tools/sqluldr2-customized-escape-chars.html" title="SQLULDR2的自定义转义符处理">SQLULDR2的自定义转义符处理</a> (2)</li><li>2009/11/07 -- <a href="http://www.anysql.net/tools/sqluldr2-mysql-data-migration-test.html" title="MySQL数据迁移测试">MySQL数据迁移测试</a> (8)</li><li>2009/10/30 -- <a href="http://www.anysql.net/tools/sqluldr2-high-perf-insert-unload.html" title="SQLULDR2功能增加, 性能不减">SQLULDR2功能增加, 性能不减</a> (14)</li><li>2009/10/28 -- <a href="http://www.anysql.net/tools/sqluldr2-mysql-insert-sqls.html" title="SQLULDR2生成Insert SQL语句">SQLULDR2生成Insert SQL语句</a> (4)</li><li>2009/10/27 -- <a href="http://www.anysql.net/tools/sqluldr2-more-escape-chars.html" title="将SQLULDR2转义符进行到底">将SQLULDR2转义符进行到底</a> (3)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.anysql.net/mysql/mysql_session_memory_usage.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
