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