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 >>>>>>>>>>>>>> >>>>>>>>>>>>>>