How do you measure? Do you perform a warm up before measurement?
Try running the query 100 times before the measurement. Or, ideally, use
BenchmarkDotNet to get accurate results.

On Thu, Nov 14, 2024 at 11:51 AM Charlin S <charli...@hotelhub.com> wrote:

> Hi,
> Thank you for your response.and sample.
> My cache instance was created as TestIcache=_ignite.GetOrCreateCache<
> string, TestModel>("TestModel"); so index was not applied.
> now I am creating cache instance like below and index applied
>   var cacheCfgTestModel = new CacheConfiguration("TestModel", new
> QueryEntity(typeof(TestModel)));
>          TestIcache=_ignite.GetOrCreateCache<string, TestModel>(
> cacheCfgTestModel);
>
> SQL:
> select _T0._KEY, _T0._VAL from "TestModel".TESTMODEL as _T0 where
> (_T0.COUNTRYCODE IS NOT DISTINCT FROM ?)
>
> EXPLANATION:
> SELECT
>     _T0__Z0._KEY AS __C0_0,
>     _T0__Z0._VAL AS __C0_1
> FROM "TestModel".TESTMODEL _T0__Z0
>     /* "TestModel".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
>     /* "TestModel"."merge_scan" */
>
> Total records:27713 = > 27713
> Time taken for Query:2 milliseconds ->  var query = TestIcache.
> AsCacheQueryable().Where(x => x.Value.CountryCode == CountryCode); Time
> taken for QueryResult:313 milliseconds -> var queryRes = query.ToList();
> Total Time taken:316 milliseconds
> Why var queryRes = query.ToList(); taking 313 milliseconds even if the
> result having only one record is taking nearly 300 milliseconds.
>
> Regards,
> Charlin
>
>
>
> On Wed, 13 Nov 2024 at 22:36, Pavel Tupitsyn <ptupit...@apache.org> wrote:
>
>> - 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