It isn't in my rule. It is in the HibernateLogicObsDAO in getCriterion:

public Criterion getCriterion(LogicExpression logicExpression, Date indexDate, Criteria criteria) {
       ....

        Concept concept = getConceptForToken(rootToken);


Therefore, every context.read has a ~400 millisecond hit from getConceptByName without the change. We run at least 20 rules with at least one read in them so that is a minimum of 8 seconds versus 1.2 seconds. Usually many more reads and rules are called making the time much higher.

Thanks,

Tammy

On 10/7/2011 3:41 PM, Darius Jazayeri wrote:
Hi Tammy,

What's the specific use case here? What fragment of your rule is turning into a call to ConceptService.getConceptByName?

-Darius

On Friday, October 7, 2011, Tammy Dugan wrote:

    I understand that, Darius, but the sql that runs for ilike with
    MySQL is unacceptably slow. Either there needs to be special
    processing for each ilike in the case that MySQL is the database
    or otherwise another solution needs to be used other than ilike.
    One example would be to have an additional column in the concept
    name table with a a lowercase version of the concept name and make
    sure the search phrase is changed to all lowercase before it is
    passed to the sql. I know the exception is inconvenient but it is
    necessary. Without the exception, the current version of logic is
    unusably slow for us.

    Thanks,

    Tammy


    On 10/7/2011 2:52 PM, Darius Jazayeri wrote:
    Hi Tammy,

    We're not coding specifically against MySQL though. So we do in
    fact need to use ilike.

    I agree that like + matchmode=exact should never be used.

    -Darius

    On Friday, October 7, 2011, Tammy Dugan wrote:

        I also want to point out that ilike is used in other places
        in the code. I think all instances should be changed because
        every time it is used it causes a performance hit in MySQL.
        Using like, exact match instead of "=" is also a unnecessary
        performance hit wherever it is used.

        Thanks,

        Tammy

        On 10/7/2011 2:10 PM, Wyclif Luyima wrote:
        Concept words are converted to uppercase before they get
        saved, so a quick possible solution would be to edit
        getConcepts to convert the search phrase to uppercase before
        executing the query and then switch ilike to like.

        Wyclif

        On Fri, Oct 7, 2011 at 1:51 PM, Darius Jazayeri
        <[email protected]> wrote:

            I thought the whole point of ConceptWord was that we
            looked at that rather than doing a query like the one
            Tammy mentions. (Tammy, which version of getConcepts is
            that?)

            -Darius


            On Friday, October 7, 2011, Tammy Dugan wrote:

                We have been testing CHICA with 1.7.x openmrs and
                have run into some performance issues. It takes 4 or
                more times longer to create a form in 1.7.x openmrs
                than 1.5 openmrs. We did some profiling this week
                and found the major culprit was this line in
                getConcepts:

                criteria.add(Expression.ilike( "names.name
                <http://names.name>", name, matchmode));

                If we change ilike to like, getConcepts runs over 6
                times faster (60 milliseconds verses 450
                milliseconds). Making this change vastly improved
                our timings. The reason this causes a problem is
                that MySQL columns are case insensitive by default
                so "like" is case insensitive. When ilike is used in
                the Expression it translates to "lower(name)".
                Applying the lower function makes the query
                considerably slower. I know that this line is
                supposed to work across multiple databases other
                than mysql, thus the ilike. However, it causes an
                unacceptable performance hit for those that use
                MySQL. Is there a way to identify whether the
                database being used is MySQL and add some logic to
                use like instead of ilike when MySQL is the
                database? Also, I noticed when like is used in exact
                mode for MySQL it is twice as fast to use "=". It
                would be a good idea to use that performance
                optimization as well.

                Thanks,

                Tammy Dugan

-- Tammy Dugan
                CHIRDL Technical Lead
                Children's Health Services Research
                IU School of Medicine

                ______________________________ ___________

                To unsubscribe from OpenMRS Developers' mailing
list, send an e-mail to [email protected]
Click here to unsubscribe from OpenMRS Developers' mailing list Click here to unsubscribe <mailto:[email protected]?body=SIGNOFF%20openmrs-devel-l> from OpenMRS Developers' mailing list

--
Tammy Dugan
CHIRDL Technical Lead
Children's Health Services Research
IU School of Medicine


_________________________________________

To unsubscribe from OpenMRS Developers' mailing list, send an e-mail to 
[email protected] with "SIGNOFF openmrs-devel-l" in the  body (not 
the subject) of your e-mail.

[mailto:[email protected]?body=SIGNOFF%20openmrs-devel-l]

Reply via email to