Hi Luigi,
On Wednesday, May 20, 2015 at 9:24:59 AM UTC+2, Luigi Dell'Aquila wrote:
>
> Hi,
>
> thank you for reporting. I'd like to have some more details to understand 
> if it's a corner case or if it's the average.
> Anyway I'll investigate it.
> In the roadmap we have the caching of SQL statements (like prepared 
> statements) but it will not be released in 2.1
>
>
please see attached simple testcase...my query is similar to one below, 
timings on 2.0.9 are around  *1.3* 
and for 2.1-SNAPSHOT  *3.2*

Normally I wouldn't care that much, but for one of my projects I need quite 
low latencies (it's not anything like trading platform, but I need to keep 
it quite low) so I am optimizing anything I can.. :) 

import java.util.Calendar;

import com.orientechnologies.orient.core.command.OCommandRequest;
import com.orientechnologies.orient.core.metadata.schema.OType;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import com.tinkerpop.blueprints.impls.orient.OrientGraphNoTx;
import com.tinkerpop.blueprints.impls.orient.OrientVertex;
import com.tinkerpop.blueprints.impls.orient.OrientVertexType;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

@Test
public class SimpleTest  {
    private static final Logger log = LogManager.getLogger(SimpleTest.class);

    private OrientGraphNoTx graph;
    int counter = 0;

    @Test
    public void testQuery() {

        final long start = System.nanoTime();
        for (int i = 0; i < 10000; i++) {
            final OCommandRequest command = new OSQLSynchQuery<>("select from  
Game where (user1 = 'user1' or user2 = 'user1') and result = -1 order by 
gamedate asc");
            final Iterable<OrientVertex> it = graph.command(command)
                    .setFetchPlan("*:-2")
                    .setLimit(10)
                    .execute();
            for (final OrientVertex anIt : it) {
                counter++;
            }
        }
        final long end = System.nanoTime();
        log.info("# {}", ((end - start) / 1000000));
        log.info("counter {}", counter);

        // 3280 @2.1-SNAPSHOT
        // 1304 @2.0.9

    }

    @BeforeClass
    public void setup() {


        graph = new OrientGraphNoTx("memory:/TestDB", "admin", "admin");
        // game
        final OrientVertexType game = graph.createVertexType("Game");
        game.createProperty("result", OType.INTEGER);
        game.createProperty("user1", OType.STRING);
        game.createProperty("user2", OType.STRING);
        game.createProperty("gamedate", OType.DATETIME);
        // data
        createGame("user1", "user2");
        createGame("user2", "user1");


    }

    private void createGame(final String user1, final String user2) {
        final OrientVertex g1 = graph.addVertex("class:Game");
        g1.setProperty("result", -1);
        g1.setProperty("user1", user1);
        g1.setProperty("user2", user2);
        g1.setProperty("gamedate", Calendar.getInstance().getTime());
        graph.commit();
    }


}





 

> Luigi
>
>
> 2015-05-19 17:02 GMT+02:00 machak <[email protected] <javascript:>>:
>
>> On Monday, February 16, 2015 at 10:54:10 AM UTC+1, Luigi Dell'Aquila 
>> wrote:
>>>
>>> Hi,
>>>
>>> OrientDB 2.0 was released just a few week ago, but we are already 
>>> working hard to the next release.
>>>
>>> You know that two of the oldest pieces of code inside OrientDB core are 
>>> the SQL parser and the query executor, and you know that both have some 
>>> flaws.
>>> Some of you struggled to make queries work with additional blank 
>>> spaces(see https://github.com/orientechnologies/orientdb/issues/3559 
>>> and https://github.com/orientechnologies/orientdb/issues/3519 )
>>> or to pass named/unnamed parameters to functions and inner queries (see 
>>> https://github.com/orientechnologies/orientdb/issues/1069).
>>>
>>> After releasing 2.0 we started a new development path to have:
>>> - strict query language definition 
>>> - strict query validation with better syntax error messages
>>> - full support to prepared statements and parameters (also where now it 
>>> fails)
>>> - new command/query executor structure (stateless, less memory consuming)
>>> - better query execution plans and index management
>>> - some additional operators (suspense here ;-) you have to wait for 3.0)
>>>
>>> This path will end with 3.0, but in 2.1 we are releasing the first step, 
>>> that is the new query parser.
>>>
>>> The new parser is based on well known JavaCC. It processes all the SQL 
>>> statements and produces a tree structure that will be the future query 
>>> executor. So the final query execution structure will be the following:
>>>
>>> 1. Get the SQL statement
>>> 2. look for a cached executor
>>> 3. if it exists goto 7
>>> 4. parse the statement
>>> 5. optimize the statement based on schema and indexes
>>> 6. put it in the statement cache
>>> 7. run the (new) executor with input parameters
>>> 8. send the (streamed) result to the client
>>>
>>> At this step, the SQL parser is ready, but the query executor is too 
>>> complex to be refactored in time for 2.1, so we decided to go with a hybrid 
>>> solution, to let you have a taste of the new features.
>>> Here's how the query execution changes in 2.1:
>>>
>>> 1. Get the SQL statement
>>> 2. pre-parse the statement with the new SQL parser <- this gives you 
>>> strict SQL syntax and much better syntax errors
>>> 3. replace named/unnamed parameters <- this solves problems in parameter 
>>> passing to subqueries, functions etc.
>>> 4. rewrite the query based on the parsed structure <- this solves 
>>> problems with white spaces and so on... I know it's dirty stuff, but the 
>>> old executor is too coupled with the old parser to be completely split in 
>>> such a short time
>>> 5. use the old parser to parse the rewritten query and generate the old 
>>> executor <- a very small fraction of old parsing problems will remain for 
>>> now, sorry...
>>> 6. run the (old) executor
>>>
>>>
>>> ** AN EYE TO THE PAST **
>>>
>>> Advantages in the short term are obvious, but you can also experience 
>>> small problems in the migration, eg.
>>>
>>> - old parser lets you write things like 
>>> SELECT FROM FOO ORDER BY A ASC ORDER BY A DESC GROUP BY A ORDER BY A DESC
>>> or even
>>> SELECT FROM FOO ORDER BY A ASC, , , , A ASC
>>> with the new parser you will not be allowed to do this, now every clause 
>>> has its own position in the statement (see docs)
>>>
>>> - old parser supports some old (deprecated) operators like traverse() 
>>> function (different from TRAVERSE statement)
>>> eg. SELECT FROM Profile WHERE any() traverse(0,3) (city = 'Rome')
>>> This syntax will not be supported anymore, so with the new parser you 
>>> will get a syntax error
>>>
>>> - in old parser IN and CONTAINS operators validation is somehow lazy, 
>>> eg. you can write
>>> SELECT FROM FOO WHERE a IN 'bar'
>>> but it's supposed to be incorrect, because 'bar' is a string, not a 
>>> collection, so the new parser will throw an exception
>>>
>>>
>>> ** AND HOW ABOUT BACKWARD COMPATIBILITY...? **
>>>
>>> To allow a smooth transition, we decided to apply the following policy 
>>> to 2.1:
>>> - old databases will continue to work with the old parser
>>> - databases created with 2.1 will have the new parser enabled by default
>>> - for backward compatibility, you will be able to enable/disable the new 
>>> parser (for now) setting the "strictSql" parameter to the db (ALTER 
>>> DATABASE docs will be updated shortly)
>>>
>>> In next releases we will probably drop a lot of old code, so I suggest 
>>> you to get used to the new strict SQL validation ;-)
>>>
>>> ** HOW CAN I TRY IT NOW? **
>>>
>>> All this is now in a GIT branch named "javacc_parser", but today we will 
>>> merge it in "develop" branch, so you will be able to try it in next 
>>> 2.1-SNAPSHOT releases.
>>>
>>> FOR NOW the new parser is enabled only on SELECT and TRAVERSE 
>>> statements, in next days we will also cover UPDATE, INSERT, DELETE, CREATE 
>>> EDGE, CREATE VERTEX and so on...
>>>
>>> If you have some time, please try it out and give us your feedback, WE 
>>> NEED YOUR HELP TO MAKE IT PERFECT!!!
>>>
>>> Thanks
>>>
>>>
>> Hi Luigi,
>>
>> in a fairly simple app, I see performance drop between 2.0.9 and 
>> 2.1-SNAPSHOT, mainly due to time spent in orient parser classes,... 5000 
>> req/sec drops to 3400 req/sec (34% of time is spent in query 
>> parsing/tokenizing). 
>> This is a small dataset and whole request is executing only one query, 
>> but still may be worth investigating...
>> cheers
>> /m  
>>
>>
>>
>>
>>
>>
>>  
>>
>>> Luigi
>>>
>>>
>>>
>>> -- 
>>> Luigi Dell'Aquila
>>> Orient Technologies LTD
>>>
>>  -- 
>>
>> --- 
>> You received this message because you are subscribed to the Google Groups 
>> "OrientDB" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"OrientDB" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to