163 wrote:
> I met a performance issue when using SQLite 3.8.4.3. I found it would
> be quite slow trying to select count(*) using a where statement with
> several OR condition. For example:
>
> select ctrl_no from T_CTRL_CLRRULE where CTRL_NO='%s' and ((PRODUCT_ID='%s' 
> and OPERATE_TYPE='%s') or (PRODUCT_ID='AAAAAA' and OPERATE_TYPE='%s') or 
> (PRODUCT_ID='%s' and OPERATE_TYPE='AAAAAA')) and CTRL_FLAG='%s'

This query does not select count(*).

Anyway, its EXPLAIN QUERY PLAN output is:

  0|0|0|SEARCH TABLE T_CTRL_CLRRULE USING INDEX I_T_CTRL_CLRRULE1 (CTRL_NO=? 
AND CTRL_FLAG=?)

> it will take 1.24ms to get the count result using above sql.
> Then I split above sql to 3 seperate sql and test the efficiency again.
>
> 1.  select count(*) from T_CTRL_CLRRULE where CTRL_NO='%s' and 
> PRODUCT_ID='%s' and OPERATE_TYPE='%s' and CTRL_FLAG='%s'
> 2.  select count(*) from T_CTRL_CLRRULE where CTRL_NO='%s' and 
> PRODUCT_ID='AAAAAA' and OPERATE_TYPE='%s' and CTRL_FLAG='%s'
> 3.  select count(*) from T_CTRL_CLRRULE where CTRL_NO='%s' and 
> PRODUCT_ID='%s' and OPERATE_TYPE='AAAAAA' and CTRL_FLAG='%s'

The EXPLAIN QUERY PLAN output is the same for all three:

  0|0|0|SEARCH TABLE T_CTRL_CLRRULE USING COVERING INDEX UIDX_T_CTRL_CLRRULE 
(CTRL_NO=? AND PRODUCT_ID=? AND OPERATE_TYPE=? AND CTRL_FLAG=?)

> I find it will only take 0.27ms on average executing all above 3 sql.

The combined OR conditions are too complex for the query optimizer, so
it does index lookup only on the other columns.

> should I split the where statement every time manually if I met above 
> requirement?

You could combine the three queries like this:

  select (select count(*) ...) + (select count(*) ...) + (select count(*) ...)

But better try this instead:

  select count(*)
  from T_CTRL_CLRRULE
  where CTRL_NO='%s'
    and PRODUCT_ID in ('%s', 'AAAAAA')
    and OPERATE_TYPE in ('%s', 'AAAAAA')
    and (PRODUCT_ID != 'AAAAAA' or OPERATE_TYPE != 'AAAAAA')
    and CTRL_FLAG='%s'


Regards,
Clemens
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to