So how is the real data different from the test data?
- How many rows are there?
- How many columns?
- How big is one row on average, in bytes?

On Thu, Nov 21, 2024 at 7:08 PM Charlin S <charli...@hotelhub.com> wrote:

> Hi,
> The summary with real data :-
> 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   | Median   | Gen0      |
> Gen1      | Gen2      | Allocated |
> |-------------
> |---------:|---------:|---------:|---------:|----------:|----------:|----------:|----------:|
> | Linq         | 530.0 ms | 17.28 ms | 48.46 ms | 512.4 ms | 7000.0000 |
> 3000.0000 | 1000.0000 | 999.57 MB |
> | LinqCompiled | 543.3 ms | 21.48 ms | 59.53 ms | 525.3 ms | 6000.0000 |
> 2000.0000 | 1000.0000 | 994.65 MB |
>
> // * Hints *
> Outliers
>   Benchmarks.Linq: Default         -> 9 outliers were removed (722.82
> ms..1.42 s)
>   Benchmarks.LinqCompiled: Default -> 11 outliers were removed (767.85
> ms..2.67 s)
>
> Thanks
> Charlin
>
> On Thu, 21 Nov 2024 at 16:01, Pavel Tupitsyn <ptupit...@apache.org> wrote:
>
>> 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