<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2814663575336557031</id><updated>2012-01-01T23:24:33.795-08:00</updated><title type='text'>Notes of an optimizer reviewer</title><subtitle type='html'>Some random thoughts that came to Igor's mind when he was reviewing the MySQL optimizer code</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://igors-notes.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2814663575336557031/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://igors-notes.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>igor</name><uri>http://www.blogger.com/profile/06961843646062810762</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2814663575336557031.post-5105977447839754073</id><published>2011-12-31T13:49:00.000-08:00</published><updated>2012-01-01T23:24:33.807-08:00</updated><title type='text'>A 3-way join that touches only indexes</title><content type='html'>Can an execution of 3-way join use only indexes and not touch table rows at all? If we have MyISAM tables it's just impossible. Yet with InnoDB tables it would be possible if we could exploit so called extended keys – the regular secondary keys extended by the components of the primary key. The fact is  the InnoDB engine works fine if you pass a key extended by primary key components, and, it uses the key to the full length without trimming it up to the base key fields. In the result we have a more narrow search and numerous obvious benefits from it.&lt;br /&gt;&lt;br /&gt;Let's see how extended keys could be employed by execution for the following query built over a &lt;a href="http://www.tpc.org/tpch/specs.asp"&gt;DBT-3/TPC-H database&lt;/a&gt; with one added index defined on p_retailprice.&lt;br /&gt;&lt;pre&gt; select o_orderkey&lt;br /&gt; from part, lineitem, orders&lt;br /&gt; where p_retailprice &amp;gt; 2095 and o_orderdate='1992-07-01'&lt;br /&gt;       and o_orderkey=l_orderkey and p_partkey=l_partkey; &lt;/pre&gt;&lt;br /&gt;(The query asks for orderkeys of the orders on 1992-07-01 that ordered parts with retail price greater than 2095.)&lt;br /&gt;&lt;br /&gt;The query could be executed by the following execution plan:&lt;br /&gt;&lt;ol  style="font-family:arial;"&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Scan the entries of the index i_p_retailprice where p_retailprice&amp;gt;2095 and read p_partkey values from the extended keys.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;For each value p_partkey make an index look-up into the table lineitem employing index i_l_partkey and fetch the values of l_orderkey from the extended index.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;For each fetched value of  l_orderkey append it to the date '1992-07-01' and use the resulted key for a index look-up by index i_o_orderdate to fetch the values of o_orderkey from the  found index entries.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;You can see that all access methods of this plan do not touch table rows.&lt;br /&gt;&lt;br /&gt;What prevents the current MariaDB/MySQL optimizer from choosing such an apparently efficient plan? A  trivial shortcoming of the optimizer: it does not consider extended keys when looking for possible index accesses to join a table.&lt;br /&gt;&lt;br /&gt;Quite surprisingly this defect attracted my attention when I investigated  the efficiency of index condition push-down (that, btw, exploits extended keys to the full measure) at the latest MySQL  UC. Since it did not seem too difficult to fix this problem I decided to do it as soon as I came back from the conference. Indeed, it took me less than a week to produce a working variant that made the join optimizer, the range optimizer and min/max optimizations to be aware of extended keys. The implementation was fast and robust, but rather cumbersome since it used iterator classes to look through parts of the extended keys. It required quite a few changes in the server code.&lt;br /&gt;&lt;br /&gt;Then we, at MP, became extremely busy with the first MariaDB 5.3 beta release. So it was only this fall that I managed to find some time for an alternative implementation. The new implentation just expanded the key definitions with additional key  parts when filling the TABLE_SHARE structures by the info read from frm files. It allowed to keep the changes in the optimizer code minimal.&lt;br /&gt;&lt;br /&gt;You can see this implementation in &lt;a href="https://code.launchpad.net/%7Emaria-captains/maria/maria-5.3-mwl247"&gt; this tree &lt;/a&gt; on Launchpad. The patch was applied to the latest MariaDB 5.3 build. Yet, with a minor modifications it could be easily applied to any of the   MySQL/MariaDB/PerconaServer or even Drizzle releases. When experimenting with the tree from Launchpad bear in mind that the optimizer switch must have the flag 'extended_keys' set to 'on' to enable the feature.&lt;br /&gt;&lt;br /&gt;Were other people in the MySQL community also annoyed with the deficiency of the MySQL optimizer fixed by the patch? Yes, yes. See for example &lt;a href="http://dom.as/2011/12/03/replication-prefetching"&gt;Domas's blog &lt;/a&gt;. So I expect quite a lot of interest towards the published patch. The patch has all chances to appear pretty soon in the first beta release of MariaDB 5.5 that is MariaDB 5.3.3-rc merged with the latest release of  MySQL 5.5.&lt;br /&gt;&lt;br /&gt;To intrigue you more I copy the EXPLAIN output returned by the patch for the above query:&lt;br /&gt;&lt;pre&gt;MariaDB [dbt3sf10]&amp;gt; explain&lt;br /&gt;   -&amp;gt; select o_orderkey&lt;br /&gt;   -&amp;gt;   from part, lineitem, orders&lt;br /&gt;   -&amp;gt;   where p_retailprice &amp;gt; 2095 and o_orderdate='1992-07-01'&lt;br /&gt;   -&amp;gt;         and o_orderkey=l_orderkey and p_partkey=l_partkey\G&lt;br /&gt;*************************** 1. row ***************************&lt;br /&gt;          id: 1&lt;br /&gt; select_type: SIMPLE&lt;br /&gt;       table: part&lt;br /&gt;        type: range&lt;br /&gt;possible_keys: PRIMARY,i_p_retailprice&lt;br /&gt;         key: i_p_retailprice&lt;br /&gt;     key_len: 9&lt;br /&gt;         ref: NULL&lt;br /&gt;        rows: 100&lt;br /&gt;       Extra: Using where; Using index&lt;br /&gt;*************************** 2. row ***************************&lt;br /&gt;          id: 1&lt;br /&gt; select_type: SIMPLE&lt;br /&gt;       table: lineitem&lt;br /&gt;        type: ref&lt;br /&gt;possible_keys: PRIMARY,i_l_suppkey_partkey,i_l_partkey,i_l_orderkey,i_l_orderkey_quantity&lt;br /&gt;         key: i_l_partkey&lt;br /&gt;     key_len: 5&lt;br /&gt;         ref: dbt3sf10.part.p_partkey&lt;br /&gt;        rows: 15&lt;br /&gt;       Extra: Using index&lt;br /&gt;*************************** 3. row ***************************&lt;br /&gt;          id: 1&lt;br /&gt; select_type: SIMPLE&lt;br /&gt;       table: orders&lt;br /&gt;        type: ref&lt;br /&gt;possible_keys: PRIMARY,i_o_orderdate&lt;br /&gt;         key: i_o_orderdate&lt;br /&gt;     key_len: 8&lt;br /&gt;         ref: const,dbt3sf10.lineitem.l_orderkey&lt;br /&gt;        rows: 1&lt;br /&gt;       Extra: Using index&lt;br /&gt;3 rows in set (0.00 sec)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814663575336557031-5105977447839754073?l=igors-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igors-notes.blogspot.com/feeds/5105977447839754073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igors-notes.blogspot.com/2011/12/3-way-join-that-touches-only-indexes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2814663575336557031/posts/default/5105977447839754073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2814663575336557031/posts/default/5105977447839754073'/><link rel='alternate' type='text/html' href='http://igors-notes.blogspot.com/2011/12/3-way-join-that-touches-only-indexes.html' title='A 3-way join that touches only indexes'/><author><name>igor</name><uri>http://www.blogger.com/profile/06961843646062810762</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2814663575336557031.post-6722553808216069047</id><published>2009-08-04T23:26:00.000-07:00</published><updated>2009-08-05T00:37:03.592-07:00</updated><title type='text'>In Defense of MRR</title><content type='html'>A few days before OSCon Henrik Ingo, our newly hired COO, forwarded me a post of Mark Callaghan with the following plaint on the state of certain latest optimizations that had been introduced into the MySQL Server, namely, &lt;a href="http://dev.mysql.com/doc/refman/5.4/en/mrr-optimization.html"&gt;Multi-Range Read&lt;/a&gt; (MRR), &lt;a href="http://dev.mysql.com/doc/refman/5.4/en/index-condition-pushdown-optimization.html"&gt;Index Condition Pushdown&lt;/a&gt; (ICP) and &lt;a href="http://dev.mysql.com/doc/refman/5.4/en/bnl-bka-optimization.html"&gt;Batched Key Access&lt;/a&gt; (BKA).&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt; I have seen descriptions for each of these features that describes&lt;br /&gt;&gt; them in isolation. Is there one page where they are described&lt;br /&gt;&gt; together? And if there isn't can I convince Sergey and Igor to write a&lt;br /&gt;&gt; new blog post?&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Further in the post, Mark points to the slew of &lt;a href="http://bugs.mysql.com/45029"&gt;bugs&lt;/a&gt; allegedly in the implementation of ICP for the InnoDb engine that forced managers at Sun/Oracle to ask Sergey Petrunia, the author of the code, to turn the feature off , though for this engine only. The patch was submitted and the next alpha  release of the Azalea version will appear with this optimization disabled.  At the same time Sergey was asked to disable the implementation of the MRR interface for InnoDB too.&lt;br /&gt;Why? Because at Sun they were not sure who the culprit was. They had a choir of unhappy customers (reported bugs #36981, #34591, #35080, #37415, #34590, #37208, #40992, #42580, #43617), some of whom blamed ICP, some – MRR, and some - both. Taking into account a subdued grumble of some  undisputed authorities who first planned to port the BKA code into their  product and then put the project on hold due to a mere fact that the MRR code was said to be “utterly crappy”, what would you do if you were responsible for making decisions?  Right. Condemn both suspects to minimize the consequences of a mistake. None of them is worth a single tear of our customers. What?  Are they are not even of the same kind? This makes them even more guilty. This makes them an organized gang. You are still not sure they are desperate criminals? Open the bug reports, read them. Do they make you cry too? Are you convinced at last?&lt;br /&gt;&lt;br /&gt;Anyway, the verdict runs as follows: &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[25 Jun 4:00] Paul DuBois Noted in 5.4.4 changelog.&lt;br /&gt;The Multi-Range Read access method does not work reliably for InnoDB&lt;br /&gt;and has been disabled for InnoDB tables.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;End of the story. Justice reigns. The villains deserve capital punishment, but we are civilized people and  we believe that properly applied corrective measures have a good chance of improving any scoundrel. As for now a full isolation of the convicts would be not only in the interest of good folks, but in the interest of the poor  creatures as well.&lt;br /&gt;At last all of us can exhale with a relief and rejoice the life where there are no bugs just because everything that could attract them has been mortified.&lt;br /&gt;&lt;br /&gt;I used to know MRR  for InndDb when he was a just a child. There was nothing wrong in how he was raising up. He was brought up together with his siblings,  first with MRR for MyISAM, MRR for NDB Cluster, later with MRR for Falcon. That's true that they have different biological mothers, but all these children were conceived by the same &lt;a href="http://forge.mysql.com/worklog/task.php?id=2474"&gt;father&lt;/a&gt;. Moreover the implementations of  the MRR interface for MyISAM and for InnoDB were based on the same code and were engine &lt;a href="http://forge.mysql.com/worklog/task.php?id=2475"&gt;independent&lt;/a&gt;. If there had been any genetic defect in the code it would have manifested itself for MyISAM as well.&lt;br /&gt;The implementation of the MRR interface for MyISAM/InnoDb employs other handler functions such as index_read and rnd_pos. Either there are some subtleties or side effects in the implementations of these functions for InnoDB, or the accusations are false.&lt;br /&gt;&lt;br /&gt;So I decided to spend some of my time to investigate the case on my own. First I looked through the bug reports.&lt;br /&gt;The reports for bugs #36981, #34591, #35080, #37415 say that with the settings:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; set optimizer_use_mrr='disable';&lt;br /&gt; set engine_condition_pushdown=off;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;no crashes are observed for the reported cases.&lt;br /&gt;&lt;br /&gt;The report for bug #34590  is certain that the setting&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; set engine_condition_pushdown=off;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;is enough to prevent crashing.&lt;br /&gt;&lt;br /&gt;The analysis made by Paul DuBois for bug #40992 leads to the conclusion that only settings for  &lt;b&gt;engine_condition_pushdown&lt;/b&gt; matter when trying to cause a crash. It's  worth noting that the test case for this bug resembles pretty much the one reported by Shane Bester for bug #36981.&lt;br /&gt;The reports for bugs #37208, #42580, #43617 complain about wrong results when  &lt;b&gt;engine_condition_pushdown&lt;/b&gt; is 'on'. Once more the report for #42580 says that the problem appears when both &lt;b&gt;optimizer_use_mrr&lt;/b&gt; and &lt;b&gt;engine_condition_pushdown&lt;/b&gt; are set to default values.&lt;br /&gt;&lt;br /&gt;After I had read all these reports, it became clear for me that there were  no direct evidences of MRR's bad behavior, at least from the cases that were submitted.&lt;br /&gt;To check that the MRR code had nothing to do the reported problems, I built the server from the latest mysql-azalea tree, reverted the patch from bug #45029, and ran the test cases with &lt;b&gt;engine_condition_pushdown&lt;/b&gt; set to 'off'. All the test cases passed through without crashes and with correct results. (Of course I could run only those test cases that I was able to extract from bug database easily. These were the test cases for bugs: #36981, #34590, #42580, #43617.)&lt;br /&gt;&lt;br /&gt;I continued my investigation. First I debugged the test case for bug #42580 that returned a wrong result and looked quite simple. After several attempts to force my way through the InnoDB native code  finally I came to the offending lines in innobase/row/row0sel.c:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;             *(prebuilt-&gt;fetch_cache[prebuilt-&gt;n_fetch_cached] + offs) ^=&lt;br /&gt;               (*(remainder_buf + offs) &amp;amp; templ-&gt;mysql_null_bit_mask);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It was Sergey's code and the intention was to mask in the null bit of an index field in the internal InnoDB row cache. It could be properly done with the code like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;             null_byte= prebuilt-&gt;fetch_cache[prebuilt-&gt;n_fetch_cached]+offs;&lt;br /&gt;             (*null_byte)&amp;amp;= ~templ-&gt;mysql_null_bit_mask;&lt;br /&gt;             (*null_byte)|= (*(remainder_buf + offs) &amp;amp;&lt;br /&gt;                             templ-&gt;mysql_null_bit_mask); &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I applied the fix and all the wrong results (bugs  #37208, #42580, #43617) went away.&lt;br /&gt;The crashes remained though. Several hours of additional  debugging for the test case of bug #36981 brought me to a really bad memory overwrite in the build_template function from  innobase/handler/ha_innodb.cc. By a pure chance the overwrite did not cause a problem for my test case. The crash was caused by usage of wrong template structures for reading row fields from mysql buffers. The crash happened in the code that had been added by Sergey in the row_search_for_mysql function to evaluate conditions pushed down to indexes. This problem can not be easily fixed since with ICP we may need two arrays of prebuilt template structures when executing the SELECT FOR UPDATE queries or multi-UPDATE/DELETE queries: one for the fields of the scanning index, another for the fields of the clustering index.&lt;br /&gt;As a temporary solution I could suggest  to block usage of ICP for such queries.  It can be done with the following code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;       if (file-&gt;active_index == file-&gt;pushed_idx_cond_keyno &amp;amp;&amp;amp;&lt;br /&gt;           file-&gt;active_index != MAX_KEY &amp;amp;&amp;amp;&lt;br /&gt;           index == prebuilt-&gt;index)&lt;br /&gt;         do_idx_cond_push= need_second_pass= TRUE;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This code prevents crashes for all reported test cases.&lt;br /&gt;&lt;br /&gt;Only two days of investigations (I literally spent only a week-end for it, and, I would have spent much less time if I  were familiar a little bit with the InnoDB code) convinced me that MRR for InnoDB is absolutely innocent, while ICP for InnoDB, though being guilty of serious misdeeds, should not undergo any severe punishment, as it's quite naturally to expect some faults from such a young feature and we don't have to employ any penitentiary  institutions to correct these deviations.&lt;br /&gt;A different attitude to this misdemeanor  would make me doubt that we are really supportive for young talents: we turn them down should they manifest some erratic behavior .&lt;br /&gt;&lt;br /&gt;I want to be clear here. Stating that MRR is innocent, I don't want to say that the MRR code is absolutely clean. It's a relatively new code, so most probably  it still contains serious bugs. Sergey has recently pointed me to the problem of &lt;a href="http://bugs.mysql.com/41029"&gt;unlocked gaps for InnoDB&lt;/a&gt;. A similar problem should exist for Index Merge. If it's resolved there, why can't the same solution  be applied for MMR? If it's not resolved there, should we disable Index Merge for InnoDB as well?&lt;br /&gt;&lt;br /&gt;And what about you? How  do you find MRR/ICP? Guilty, or NOT guilty? Should the case be appealed?&lt;br /&gt;&lt;br /&gt;On a side note, I would like to add that MRR and ICP  for InnoDB are really smart optimizations. MRR for InnoDB allows us to accumulate primary keys for multiple lookups in a buffer before fetching data in a sequential manner. The more keys you accumulate, the less disk sweeps you need to fetch the data. ICP allows us to reject a row as soon as the condition over the index fields is not satisfied.&lt;br /&gt;MRR and ICP can interplay, or can be used independently. They both can be very helpful for BKA . Moreover, in fact,  it does not make too much sense to use BKA for InnoDB/MyISAM without  MRR. &lt;br /&gt;The three features put together can give you a boost of performance for join queries that involve many rows. Yet, this will be the subject of a separate blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814663575336557031-6722553808216069047?l=igors-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igors-notes.blogspot.com/feeds/6722553808216069047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igors-notes.blogspot.com/2009/08/in-defense-of-mrr.html#comment-form' title='43 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2814663575336557031/posts/default/6722553808216069047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2814663575336557031/posts/default/6722553808216069047'/><link rel='alternate' type='text/html' href='http://igors-notes.blogspot.com/2009/08/in-defense-of-mrr.html' title='In Defense of MRR'/><author><name>igor</name><uri>http://www.blogger.com/profile/06961843646062810762</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>43</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2814663575336557031.post-3998725824751544457</id><published>2009-07-02T00:09:00.000-07:00</published><updated>2009-07-02T00:15:56.016-07:00</updated><title type='text'>Newly born...</title><content type='html'>Yesterday I still worked for Sun Microsystems as a Principal Engineer &amp; MySQL Sr. Architect. Today was my first day of work at Monty Program, Inc, a subsidiary  of a tiny company established by Monty Widenius in February. Yet I didn't even make the top ten. If people want not to miss the train they have to hurry up.&lt;br /&gt;&lt;br /&gt;Am I happy? Oh, yeah...&lt;br /&gt;No more waking up with the question constantly drilling my mind: “What am I doing here?”  What are all of us, MySQL  Server developers, doing without Monty? Waiting for the time when all our options are vested? I can't . That's too long for me. I'm already too old  to wait any more.&lt;br /&gt;Besides, we've already lost at least 3 years. We have to do what we planned to do in 2005. We have to raise the Server to the level where any RDBMS that claims to be called mature should be.&lt;br /&gt;&lt;br /&gt;So who is newly born? Me? In a way, yes. This is my second reincarnation for the history of MySQL, after the first one that happened in December 2002 .&lt;br /&gt;&lt;br /&gt;Also newly born is this blog where I'm planning to share with you, from time to time, my observations on  the Server development at Monty Program and on interesting patches in the  new server code that other people contribute. However, I don't want to limit myself only to this topic. What else am I going to share with you? You'll see soon enough...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2814663575336557031-3998725824751544457?l=igors-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://igors-notes.blogspot.com/feeds/3998725824751544457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://igors-notes.blogspot.com/2009/07/newly-born.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2814663575336557031/posts/default/3998725824751544457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2814663575336557031/posts/default/3998725824751544457'/><link rel='alternate' type='text/html' href='http://igors-notes.blogspot.com/2009/07/newly-born.html' title='Newly born...'/><author><name>igor</name><uri>http://www.blogger.com/profile/06961843646062810762</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry></feed>
