nhibernate-core icon indicating copy to clipboard operation
nhibernate-core copied to clipboard

If there is an unequal operator in the query, HQL Query Plan is regenerated

Open cokalyoncu opened this issue 3 years ago • 5 comments

CrdCardResponse crdCardResponse = Query<CrdCard>()
    .Where(x => x.CardNo == cardNo)
    .Select(x => new CrdCardResponse()
    {
        IsLimitExceed = x.Dci != CardDci.Credit.GetKey()
    }).SingleOrDefault();

Hql query plan is regenerated each time this query is run. If the query is changed in this way, hql query plan is cached.

CrdCardResponse crdCardResponse = Query<CrdCard>()
    .Where(x => x.CardNo == cardNo)
    .Select(x => new CrdCardResponse()
    {
        IsLimitExceed = x.Dci == CardDci.Credit.GetKey()
    }).SingleOrDefault();

This line in SelectClauseHqlNominator is causing this trouble:

var projectConstantsInHql = _stateStack.Peek() || expression.NodeType == ExpressionType.Equal || IsRegisteredFunction(expression);

This code should be changed like this:

var projectConstantsInHql = _stateStack.Peek() || expression.NodeType == ExpressionType.Equal || expression.NodeType == ExpressionType.NotEqual || IsRegisteredFunction(expression);

cokalyoncu avatar May 24 '22 17:05 cokalyoncu

@fredericDelaporte is it ok to change as @cokalyoncu suggested it effects performance of our application and we don't know until we investigate deeply ?

var projectConstantsInHql = _stateStack.Peek() || expression.NodeType == ExpressionType.Equal || expression.NodeType == ExpressionType.NotEqual || IsRegisteredFunction(expression);

gokhanabatay avatar May 26 '22 10:05 gokhanabatay

I don't understand importance of Equal/NotEqual operators. Shouldn't this check at least include all others comparison operators too (<, >, ...)

bahusoid avatar Aug 12 '22 15:08 bahusoid

I don't understand importance of Equal/NotEqual operators. Shouldn't this check at least include all others comparison operators too (<, >, ...)

You are right with other operators (<, >, ...) in our case we just faced this issue with not equal operator. QueryPlanCache is effects application performance under high load.

gokhanabatay avatar Aug 14 '22 08:08 gokhanabatay

Hi @bahusoid could you lead us for providing fix for this issue.

gokhanabatay avatar Sep 06 '22 13:09 gokhanabatay

What assistance do you need? Just prepare pull request with the fix and a test case. Fix should be applied at least for all comparison operations Maybe others binary operations too - I don't understand this code.

bahusoid avatar Sep 14 '22 15:09 bahusoid