Actually I brought a point about using SQL queries instead of scan
queries because I worry about inconsistency between different
implementations. AFAIR Scan and SQL queries implementations are
totally different. Could you tell me how Index queries fit there?

My general ideas are as follows:
1. In an ideal world it would be great to have only one API (to rule
them all) and implementation to cover all cases (i.e. scan, index,
SQL). Also, I wonder how other vendors tackle this?
2. New IndexQuery might not mimic ScanQuery behavior but instead have
a correct/expected one (including partition reservation). Perhaps
IndexQuery should also cover regular entry iteration (scan) cases and
become a new ground for generalized scan/index queries.

2021-12-09 17:08 GMT+03:00, Pavel Tupitsyn <ptupit...@apache.org>:
> IndexQuery is experimental, so we can indeed make it reserve partitions by
> default. No objections here.
>
> But with ScanQuery, I think it's better to add a "reservePartitions"
> property so that default behavior is not affected.
> Existing users may already have some logic in place to handle
> inconsistencies. So if we enable reservation by default,
> they'll get an unnecessary performance degradation.
>
> On Thu, Dec 9, 2021 at 4:42 PM Maksim Timonin <timoninma...@apache.org>
> wrote:
>
>> Hi, Ivan, Pavel! Thanks for your responses.
>>
>> > But is there a real need/benefit from using scan queries over primitive
>> SQL queries today
>>
>> In addition to Pavel's response, I'd like to add about IndexQuery. This
>> query is in experimental status, but it shows great performance and beats
>> SQL for *some* type of queries. For IndexQuery we can leverage on
>> understanding that we use only index and apply some optimizations: skip
>> boundaries check (h2 Select.isConditionMet), apply filtering by inline IO
>> instead of extracting fields from BinaryObjects, also we skip some H2
>> related stuff. Also it's not implemented yet, but for IndexQuery we can
>> access data pages sequentially instead of randomly (by iterating with
>> IndexRow cursor by batches), and I expect it may make performance better
>> in
>> some highload cases.
>>
>> > it is desirable that successful (but may be strange) scenarios continue
>> to work after fix (and not fail e.g. due to some introduced exception)
>>
>> > Partition reservation should be opt-in if we decide to proceed.
>>
>> With the approach I proposed we can reach it. Without specified query
>> timeout (and cache queries don't have a public API for setting timeout),
>> we
>> can retry our attempts to reserve partitions while we do not succeed. So,
>> users may get some increase in query time execution under unstable
>> topology. But in exchange users will get more stable results, and avoid
>> exceptions like in the ticket I showed [1].
>>
>> We can implement this logic for IndexQuery only (as it's only
>> experimental
>> since 2.12), and extend it on ScanQuery later after stabilizing with
>> IndexQuery. WDYT?
>>
>>
>> [1] https://issues.apache.org/jira/browse/IGNITE-12591
>>
>> On Thu, Dec 9, 2021 at 10:39 AM Pavel Tupitsyn <ptupit...@apache.org>
>> wrote:
>>
>> > Agree with Ivan regarding compatibility.
>> > Partition reservation should be opt-in if we decide to proceed.
>> >
>> > > is there a real need/benefit from using
>> > > scan queries over primitive SQL queries today
>> >
>> > SQL requires additional configuration (QueryEntity) and involves memory
>> and
>> > CPU overhead to maintain the indexes.
>> > Especially if the query is used rarely (maybe some maintenance tasks),
>> scan
>> > is a better option.
>> >
>> > On Thu, Dec 9, 2021 at 10:12 AM Ivan Pavlukhin <vololo...@gmail.com>
>> > wrote:
>> >
>> > > Hi Maksim,
>> > >
>> > > Thank you for looking into this. While fixing wrong/surprising
>> > > behavior is very important, I also have some concerns, let's say,
>> > > from
>> > > different angle of view:
>> > > 1. From a first glance it seems that similar behavior of scan and SQL
>> > > queries is a good idea. But is there a real need/benefit from using
>> > > scan queries over primitive SQL queries today (e.g. SELECT * FROM
>> > > table1)?
>> > > 2. Also we need to carefully think about compatibility. It is
>> > > desirable that successful (but may be strange) scenarios continue to
>> > > work after fix (and not fail e.g. due to some introduced exception).
>> > >
>> > > Regarding partition reservation for long-time open cursors I guess
>> > > some ideas might be found in LAZY mode for SQL queries [1].
>> > >
>> > > [1] https://issues.apache.org/jira/browse/IGNITE-9171
>> > >
>> > > 2021-12-08 20:11 GMT+03:00, Maksim Timonin <timoninma...@apache.org>:
>> > > > Hi, Igniters!
>> > > >
>> > > > There is a known issue that ScanQuery on unstable topology returns
>> > > > incorrect results: duplicates data [1] or fails with an exception
>> [2].
>> > > The
>> > > > reason is ScanQuery doesn't reserve partitions.
>> > > >
>> > > > IndexQuery shares the same query processing as ScanQuery, and then
>> > > > it
>> > is
>> > > > also affected by unstable topology. I want to fix it for
>> > > > IndexQuery.
>> > > > IndexQuery should provide the same stability as SQL queries do - no
>> > > > occasional failures or data duplication.
>> > > >
>> > > > I dived into the SQL query processing and found that we can unify
>> logic
>> > > for
>> > > > SQL queries and cache queries (ScanQuery, IndexQuery, TextQuery):
>> > > >
>> > > > 1. Currently, cache queries use `GridCacheQueryAdapter#nodes` to
>> > > > find
>> > > nodes
>> > > > to run a query. From the other side, SQL processing uses for the
>> > > > same
>> > > goal
>> > > > `ReducePartitionMapper#nodesForPartitions`. It looks like those
>> methods
>> > > > have some slight differences, but in the common, they do the same.
>> So,
>> > I
>> > > > propose to make a single method for both cases.
>> > > >
>> > > > 2. SQL processing uses `PartitionReservationManager` for reserve
>> > > partitions
>> > > > on the map side. I propose to move it to the ignite-core module and
>> > start
>> > > > using it for the cache queries.
>> > > >
>> > > > 3. Implement retries for the cache queries in case we failed to
>> reserve
>> > > > partitions on the map side.
>> > > >
>> > > > Currently, I see a downside of reserving partitions for cache
>> queries:
>> > > > cache queries are lazy. And the time of partition reservation
>> > > > depends
>> > on
>> > > a
>> > > > user's application code (how fast a cursor is iterated and closed).
>> > > AFAIU,
>> > > > it's not very good to have a partition in reserve too long. Please,
>> > > correct
>> > > > me if I'm wrong here.
>> > > >
>> > > > But from the other side, Ignite reserves partitions for ScanQuery
>> when
>> > a
>> > > > partition has been specified as a ScanQuery parameter, and Ignite
>> > > reserves
>> > > > partitions for SQL with the flag lazy=true. Also:
>> > > > - IndexQuery: I expect simple queries that will return a relatively
>> > small
>> > > > amount of data. Then partitions wouldn't be reserved too much time.
>> > > > - the same is for TextQuery - it returns a limited amount of data
>> (due
>> > to
>> > > > the Lucene logic).
>> > > > - full ScanQuery it's not in use much, AFAIK. So, it's by default a
>> > > pretty
>> > > > heavy operation.
>> > > >
>> > > > So, I think it's safe to reserve partitions in any case. But there
>> > could
>> > > be
>> > > > an alternative optimistic approach, smth like that:
>> > > > 1. Check that topology is stable and waiting while it's not
>> stabilized.
>> > > > 2. Run a query on a stable cluster.
>> > > > 3. In cases when a cluster becomes unstable during query execution
>> > > > -
>> > try
>> > > to
>> > > > reserve partitions at runtime (query should be aware of topology
>> > changes)
>> > > > and fail in case of reservation failure (if a user already fetched
>> some
>> > > > data).
>> > > >
>> > > > I don't like the idea of this optimistic approach because in case a
>> > user
>> > > > got some data, we don't have a better solution than to fail a query
>> in
>> > > case
>> > > > of cluster instability and reservation failure.
>> > > >
>> > > > Igniters, WDYT?
>> > > >
>> > > > [1] https://issues.apache.org/jira/browse/IGNITE-12591
>> > > > [2] https://issues.apache.org/jira/browse/IGNITE-16031
>> > > >
>> > >
>> > >
>> > > --
>> > >
>> > > Best regards,
>> > > Ivan Pavlukhin
>> > >
>> >
>>
>


-- 

Best regards,
Ivan Pavlukhin

Reply via email to