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