- This shows a full scan, the index is not being used.
- There is no parametrization, I'm not sure why. Which Ignite version do
you use?

I've prepared a simple proof of concept [1] which shows that an index is
used in this situation. Generated SQL is different:

>> SQL:
select _T0._KEY, _T0._VAL from "c".TESTMODEL as _T0 where (_T0.COUNTRYCODE
IS NOT DISTINCT FROM ?)

>> EXPLAIN:
SELECT
    _T0__Z0._KEY AS __C0_0,
    _T0__Z0._VAL AS __C0_1
FROM "c".TESTMODEL _T0__Z0
    /* "c".TESTMODEL_COUNTRYCODE_ASC_IDX: COUNTRYCODE IS ?1 */
WHERE _T0__Z0.COUNTRYCODE IS ?1
SELECT
    __C0_0 AS _KEY,
    __C0_1 AS _VAL
FROM PUBLIC.__T0
    /* "c"."merge_scan" */

[1] https://gist.github.com/ptupitsyn/882b9b9e5e13c82fcf96f83fd53b2777



On Wed, Nov 13, 2024 at 6:41 PM Charlin S <charli...@hotelhub.com> wrote:

> Hi,
> 1. Use "==" instead of "string.Equals", looks like the provider does not
> like string.Equals.
>        changed to ==
> 2. Share the generated SQL
>
>   SELECT Field1,Field2 FROM TestModel WHERE COUNTRYCODE='AU'
> 3. Share the result of EXPLAIN for that SQL
>    plan=SELECT
>     __Z0.FIELD1 AS __C0_0,
>     __Z0.FIELD2 AS __C0_1
> FROM "TestModel".TESTMODEL __Z0
>     /* "TestModel".TESTMODEL.__SCAN_ */
>     /* scanCount: 1681786 */
> WHERE (__Z0.COUNTRYCODE = 'AU')
> 4. Is there an index on CountryCode?
>     Yes,  [QuerySqlField(IsIndexed = true)]
>         public string CountryCode { get; set; }
>
> Thanks,
> Charlin
>
> On Wed, 13 Nov 2024 at 15:06, Pavel Tupitsyn <ptupit...@apache.org> wrote:
>
>> 1. Use "==" instead of "string.Equals", looks like the provider does not
>> like string.Equals
>> 2. Share the generated SQL
>> 3. Share the result of EXPLAIN for that SQL
>> 4. Is there an index on CountryCode?
>>
>> On Wed, Nov 13, 2024 at 9:16 AM Charlin S <charli...@hotelhub.com> wrote:
>>
>>> Hi,
>>> Thanks for your response.
>>> I have tried different ways but the result is the same.
>>> my cache records count is above 160,0000
>>> var watchLINQQuery = System.Diagnostics.Stopwatch.StartNew();
>>>       var tmp=  TestIcache.AsEnumerable().Where(tc=> string.Equals(tc.
>>> Value.CountryCode, CountryCode)).Select(tc => tc.Value);
>>>       watchLINQQuery.Stop(); //0 or 1 Milliseconds
>>>       var watchIQueryableToArray = System.Diagnostics.Stopwatch.StartNew();
>>>
>>>       var result = tmp.ToArray(); // 12354 milliseconds taken
>>>       watchIQueryableToArray.Stop();
>>>
>>> var result = tmp.ToArray(); taking similar time even if my query result
>>> returns 1 or 2 records. Please suggest to me how to improve this query
>>> performance.
>>> Regards,
>>> Charlin
>>>
>>>
>>> On Tue, 5 Nov 2024 at 19:01, Pavel Tupitsyn <ptupit...@apache.org>
>>> wrote:
>>>
>>>> 1. Check the generated SQL
>>>>
>>>> // Cast to ICacheQueryable
>>>> var cacheQueryable = (ICacheQueryable) query;
>>>>
>>>> // Get resulting fields query
>>>> SqlFieldsQuery fieldsQuery = cacheQueryable.GetFieldsQuery();
>>>>
>>>> // Examine generated SQL
>>>> Console.WriteLine(fieldsQuery.Sql);
>>>>
>>>>
>>>> 2. Try EXPLAIN and other suggestions from
>>>> https://ignite.apache.org/docs/latest/SQL/sql-tuning
>>>>
>>>> 3. Is there an index on CountryCode?
>>>>
>>>> 4. Case-insensitive comparison might be inefficient. A better approach
>>>> is to store lower/uppercase value in cache, and then using lower/upper
>>>> criteria for search
>>>>
>>>> On Tue, Nov 5, 2024 at 1:08 PM Charlin S <charli...@hotelhub.com>
>>>> wrote:
>>>>
>>>>> Hi  Pavel,
>>>>> Thanks for your email. it reduces to 9 seconds after removing
>>>>> AsParallel. Please let me know if there are any more options to get good
>>>>> performance.
>>>>>
>>>>> Regards,
>>>>> Charlin
>>>>>
>>>>> On Tue, 5 Nov 2024 at 13:31, Pavel Tupitsyn <ptupit...@apache.org>
>>>>> wrote:
>>>>>
>>>>>> Hi, "AsParallel" is the problem, it causes the entire data set to be
>>>>>> loaded locally before filtering.
>>>>>>
>>>>>> Remove it so that the LINQ expression can be translated into Ignite
>>>>>> SQL and executed more efficiently.
>>>>>>
>>>>>> https://ignite.apache.org/docs/latest/net-specific/net-linq
>>>>>>
>>>>>> On Tue, Nov 5, 2024 at 8:58 AM Charlin S <charli...@hotelhub.com>
>>>>>> wrote:
>>>>>>
>>>>>>> Hi All,
>>>>>>>
>>>>>>> I am trying Ignit.Net LINQ for the first time and seeing very
>>>>>>> slowness with my linq query taking 13-15 seconds. Test model having 
>>>>>>> 550,000
>>>>>>> records
>>>>>>> my query as below
>>>>>>> TestModel having index for CountryCode field.
>>>>>>> ICache<string, TestModel> cache = ignite.GetCache<string,
>>>>>>> TestModel>(CacheName);
>>>>>>> IQueryable<ICacheEntry<string, TestModel>>  igniteQuerable  =
>>>>>>> cache.AsCacheQueryable();
>>>>>>> igniteQuerable.AsParallel()
>>>>>>>             .Where(x=>string.Equals(x.Value.CountryCode, criteria.
>>>>>>> CountryCode, StringComparison.CurrentCultureIgnoreCase))
>>>>>>>             .Select(x => x.Key).ToList();
>>>>>>>
>>>>>>>
>>>>>>> Regards,
>>>>>>> Charlin
>>>>>>>
>>>>>>>

Reply via email to