You can always send a compute task via one of IgniteCompute.affinityX() methods and run a *local* SQL query on that node:
- affinity calls: https://apacheignite.readme.io/docs/collocate-compute-and-data#affinity-call-and-run-methods - local SQL queries: https://apacheignite-sql.readme.io/docs/local-queries My selects are complex but they do use the primary keys for the partitioned > tables/caches participating in the query. But they perform poorly if the > data is distributed across multiple nodes. If the data is co-located and scattered across cluster nodes then it's expected that Ignite will execute a query across several nodes. It's a standard approach of distributed databases that support SQL engines. My suggestion would be to investigate the root cause of low performance. You just might need to configure some indexes: https://apacheignite-sql.readme.io/docs/performance-and-debugging - Denis On Wed, Jun 17, 2020 at 7:33 PM narges saleh <snarges...@gmail.com> wrote: > My selects are complex but they do use the primary keys for the > partitioned tables/caches participating in the query. But they perform > poorly if the data is distributed across multiple nodes. > > On Wed, Jun 17, 2020 at 8:04 PM narges saleh <snarges...@gmail.com> wrote: > >> Thanks Denis. In case of selects, can I push ignite to broadcast the sql >> to where the data is, say by using employing services deployed on the >> targeted data nodes, or utilizing affinity calls (with the sql as part of >> the logic)? >> >> On Wed, Jun 17, 2020 at 7:02 PM Denis Magda <dma...@apache.org> wrote: >> >>> Narges, >>> >>> INSERTS/UPDATES/DELETES will be forwarded to primary nodes based on the >>> value of primary keys you pass into queries. Ignite maps a primary key to a >>> partition and, finally, to a primary node that holds that partition. All >>> this happens transparently in Ignite. You don't need to do anything except >>> for sending those SQL commands. >>> >>> As for SELECTS, most of them will be broadcasted to your server nodes >>> unless Ignite can pre-select a sub-set of target nodes a query needs to be >>> executed on. This optimization always takes place for simple queries when >>> you try to get records based on the value of a primary key, such as "SELECT >>> * FROM Table WHERE primaryKeyColumn = 2". >>> >>> - >>> Denis >>> >>> >>> On Wed, Jun 17, 2020 at 12:43 PM narges saleh <snarges...@gmail.com> >>> wrote: >>> >>>> Thanks Denis. Will watch the video. >>>> One more question, related to SQL execution. If I issue a SQL from a >>>> client, how would ignite know which node to run the SQL query on? I assume >>>> the SQL is parsed on the server nodes, and I will still need to direct the >>>> SQL to be executed on the right server node (assuming that all the data is >>>> collocated on a single node). Am I right? >>>> >>>> On Wed, Jun 17, 2020 at 2:26 PM Denis Magda <dma...@apache.org> wrote: >>>> >>>>> The collocated flag is an extra optimization hint for SQL queries with >>>>> GROUP BYs. The parameter requests to group records locally on the nodes >>>>> that participated in the query execution. For instance, if your >>>>> application >>>>> sends a query with GROUP BY to a couple of server nodes, then the nodes >>>>> will group their portions of the result sets locally not making that the >>>>> burden of the application that merges/reduces the result sets into one. >>>>> The >>>>> description of this parameter here should be helpful as well: >>>>> https://apacheignite-sql.readme.io/docs/jdbc-driver#parameters >>>>> >>>>> <https://apacheignite-sql.readme.io/docs/jdbc-driver#parameters> >>>>>> >>>>>> Should I assume that if the table is defined with affinity set, then >>>>>> compute collocation, including sql execution will happen automatically? >>>>> >>>>> >>>>> That's right. You just need to set up the affinity keys and Ignite >>>>> will take care of the rest. Btw, you might be interested in this SQL >>>>> webinar we delivered recently. The webinar explains our SQL capabilities >>>>> in >>>>> detail: https://www.youtube.com/watch?v=eYV-tNLzIts >>>>> >>>>> - >>>>> Denis >>>>> >>>>> >>>>> On Wed, Jun 17, 2020 at 11:28 AM narges saleh <snarges...@gmail.com> >>>>> wrote: >>>>> >>>>>> Then can you please explain what the option collocated=true for JDBC >>>>>> url is for? >>>>>> Should I assume that if the table is defined with affinity set, then >>>>>> compute collocation, including sql execution will happen automatically? >>>>>> I am sorry if this is just a basic question. >>>>>> >>>>>> On Wed, Jun 17, 2020 at 12:57 PM Denis Magda <dma...@apache.org> >>>>>> wrote: >>>>>> >>>>>>> If the data is already co-located you don't need to pass in any >>>>>>> other parameters. >>>>>>> >>>>>>> - >>>>>>> Denis >>>>>>> >>>>>>> >>>>>>> On Wed, Jun 17, 2020 at 10:13 AM narges saleh <snarges...@gmail.com> >>>>>>> wrote: >>>>>>> >>>>>>>> Hi Denis. The tables are defined with affinity keys specified. What >>>>>>>> I am asking whether to set the collection option when I insert or >>>>>>>> query the >>>>>>>> data via SQL line. >>>>>>>> >>>>>>>> thanks >>>>>>>> >>>>>>>> On Wed, Jun 17, 2020 at 11:39 AM Denis Magda <dma...@apache.org> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> Hi, >>>>>>>>> >>>>>>>>> You need to pass the required parameters to the JDBC driver's >>>>>>>>> connection URL: >>>>>>>>> https://apacheignite-sql.readme.io/docs/jdbc-driver#parameters >>>>>>>>> >>>>>>>>> However, I'm not quite sure what you mean under the "collocation" >>>>>>>>> in the following context. All your data needs to be co-located >>>>>>>>> beforehand >>>>>>>>> (ensure you have affinity keys configured) and then just send your >>>>>>>>> queries >>>>>>>>> with joins with no additional connection parameters. >>>>>>>>> >>>>>>>>> - >>>>>>>>> Denis >>>>>>>>> >>>>>>>>> >>>>>>>>> On Wed, Jun 17, 2020 at 9:33 AM narges saleh <snarges...@gmail.com> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>>> Hi All, >>>>>>>>>> >>>>>>>>>> Is collocation enforced when SQL is issues in sqline command line >>>>>>>>>> or do I need to give the option when I start sqlline? >>>>>>>>>> >>>>>>>>>> thanks. >>>>>>>>>> >>>>>>>>>