Can you adjust this benchmark project to have the data and query more like
your real project?
Currently we have a similar number of rows and the query performs very
well, let's understand what is different.

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

> Hi,
> Thank you for your email. I apologize for the late reply.
> I ran the sample and summaries are:-
>
> BenchmarkDotNet v0.14.0, Windows 10
> (10.0.19044.2130/21H2/November2021Update)
> Intel Core i5-8500 CPU 3.00GHz (Coffee Lake), 1 CPU, 6 logical and 6
> physical cores
> .NET SDK 8.0.101
>   [Host]     : .NET 8.0.1 (8.0.123.58001), X64 RyuJIT AVX2
>   DefaultJob : .NET 8.0.1 (8.0.123.58001), X64 RyuJIT AVX2
>
>
> | Method           | Mean        | Error    | StdDev   |
> |--------------------|--------------:|----------:|---------------:|
> | Linq                |   94.60 us | 1.515 us | 1.417 us |
> | LinqCompiled |  16.50 us  | 0.328 us | 0.449 us |
>
> LINQCompiled much faster than LINQ in sample code but with real data it's
> not much different.
>
>
> Thanks
> Charlin
>
> On Thu, 14 Nov 2024 at 20:30, Pavel Tupitsyn <ptupit...@apache.org> wrote:
>
>> 1. Run the code in Release configuration
>> 2. Try Compiled Query
>> https://ignite.apache.org/docs/latest/net-specific/net-linq#compiled-queries
>>
>> My benchmark on 550_000 rows with 1 matching row shows 28 microseconds
>> for regular query and 6 microseconds for compiled query:
>> https://gist.github.com/ptupitsyn/189c8164061bace8d975b2ec39045ca4
>>
>> 200 ms is a lot. Can you run my code and share the results?
>>
>>
>>
>> On Thu, Nov 14, 2024 at 1:46 PM Charlin S <charli...@hotelhub.com> wrote:
>>
>>> Hi,
>>> I was measuring performance after 5 times. Now I have run more than 100
>>> times and  var queryRes = query.ToList(); taken 202 milliseconds as
>>> minimum.
>>> Will be appreciated if I get a solution for getting the result in 10 -
>>> 50 milliseconds.
>>>
>>> Regards,
>>> Charlin
>>>
>>>
>>>
>>> On Thu, 14 Nov 2024 at 15:35, Pavel Tupitsyn <ptupit...@apache.org>
>>> wrote:
>>>
>>>> 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