List:Internals« Previous MessageNext Message »
From:Olav Sandstaa Date:February 27 2011 9:51pm
Subject:Re: condition pushdown
View as plain text  
Hi AugustQ,

On 02/27/2011 08:54 PM, AugustQ wrote:
> Hi,
>
> how can I enable condition pushdown?
>
> This is my first question here on this list. I'm working as a
> software-developer for quite some time and currently I am working in a
> DWH-project here in Germany.
>
> I found these sources: mysql-5.5.0-m2
> and got it to compile and work here on my machine (Ubuntu 64bit).
> After some reading (books from Hutchings/Golubchik and Pachev) I decided
> to play a bit with storage engines, so I wrote my tiny storage engines
> (which work, so the basics are understood, at least in parts).
>
> The next topic I wanted to play with is condition pushdown but I had no
> luck until now.
> In mysql I can do
>      set engine_condition_pushdown=1
> and got a result OK.
> When I enter
>      explain select * from prob_alt where rv_nr = '12345678'\G
> I can only see 'using where', nothing more.
>
> I've set a breakpoint to the following piece of code:
>
>      const COND * ha_dbf::cond_push(const COND *cond)
>      {
>          myCond = (COND *)cond;
>          return cond;
>      };

I think it would be more correct if you returned NULL from this 
function. The intention is that ::cond_push() should return the part of 
the condition that the storage engine will not evaluate. So when you 
return the original condition the server assumes that the storage engine 
did not want to handle this condition. See the following comment about 
the return value in sql/handler.h:

    @return
      The 'remainder' condition that caller must use to filter out records.
      NULL means the handler will not return rows that do not match the
      passed condition.

You can also have a look at the following code in sql/sql_select.cc 
where the condition is pushed to the storage engine:

           /* Push condition to storage engine if this is enabled
              and the condition is not guarded */
       if (thd->variables.optimizer_switch &
               OPTIMIZER_SWITCH_ENGINE_CONDITION_PUSHDOWN)
           {
             COND *push_cond=
               make_cond_for_table(tmp, tab->table->map, tab->table->map);
             if (push_cond)
             {
               /* Push condition to handler */
               if (!tab->table->file->cond_push(push_cond))
                 tab->table->file->pushed_cond= push_cond;
             }
           }

This shows that if the ::cond_push() function returns anything else than 
NULL then the handler::pushed_cond will not get set. This is the 
variable that is checked by explain to determine if it should print 
"Using where with pushed condition" or just print "Using where".


> Looking at the cond-var I do not see anything meaningful, mostly
> NULL-Ptrs.

If you see your ::cond_push() function being called then this is a good 
sign that engine condition pushdown is enabled.

> I assume that condition pushdown is disabled by default. So what do I
> have to do to enable it?

In the MySQL 5.5 codebase engine condition pushdown should be enabled by 
default so you should not have to do anything to enable it. See 
documentation:

http://dev.mysql.com/doc/refman/5.5/en/condition-pushdown-optimization.html

Best regards,
Olav

Thread
condition pushdownAugustQ27 Feb
  • Re: condition pushdownOlav Sandstaa27 Feb
    • Re: condition pushdownAugustQ28 Feb
      • Re: condition pushdownMagnus BlĂ„udd2 Mar
    • Re: condition pushdownAugustQ6 Mar