Problem is resolved now. The index type setting in cache configuration was
incorrect. After setting DefaultDataAffinityKey.class in cache config index
type query executed successfully.

New sql is as follows. I have few questions on it.

1) Execution plan is showing 2 sqls. What does second sql (highlighted)
indicate ?  What it merge scan?

2) The sql is using index on unitid but it not using any index for
condition (AG__Z0.USERID = UAD__Z1.USERID).
I tried to use index hints : USE INDEX(user_account_idx2, asset_group_idx2)
but I got error Index "USER_ACCOUNT_IDX2" not found.
Index user_account_idx2 is present in UserAccountData class.

How can I make use of index created on userId and unitId in this case?

3) Can I create index on affinityId?

4) After making affinityId change, how can I check that SQL is going the
single node only?

5) Do I need to include extra condition " ag.affinityId = uad.affinityId"
in JOIN ON clause?

6) If I am using sub queries or join queries, is it necessary to write
affinity key condition for each Cache where caluse?



SELECT ag.assetGroupId,
  ag.name
FROM AssetGroupData ag
JOIN USER_ACCOUNT_CACHE.UserAccountData uad
ON (ag.userId       = uad.userId)
WHERE ag.affinityId = ?
AND uad.unitId      = ?
AND uad.userRole    = 1

Execution Plan:

SELECT
    AG__Z0.ASSETGROUPID AS __C0_0,
    AG__Z0.NAME <http://ag__z0.name/> AS __C0_1
FROM USER_ACCOUNT_CACHE.USERACCOUNTDATA UAD__Z1
    /* *USER_ACCOUNT_CACHE.USER_ACCOUNT_IDX2: UNITID = ?2* */
    /* WHERE (UAD__Z1.USERROLE = 83)
        AND (UAD__Z1.UNITID = ?2)
    */
INNER JOIN ASSET_GROUP_CACHE.ASSETGROUPDATA AG__Z0
    /* ASSET_GROUP_CACHE.AFFINITY_KEY: AFFINITYID = ?1 */
    ON 1=1
WHERE (AG__Z0.USERID = UAD__Z1.USERID)
    AND ((UAD__Z1.USERROLE = 83)
    AND ((AG__Z0.AFFINITYID = ?1)
    AND (UAD__Z1.UNITID = ?2)))

SELECT
    __C0_0 AS ASSETGROUPID,
    __C0_1 AS NAME
FROM PUBLIC.__T0
    /* ASSET_GROUP_CACHE."merge_scan" */



Thanks,
Prasad

>
> On Thu, Aug 23, 2018 at 2:31 PM Prasad Bhalerao <
> [email protected]> wrote:
>
>> Hi,
>>
>> I tried your suggestion but I am getting query parsing error now. I am
>> attaching my data and data key class in this mail. Could you please help me
>> out?
>>
>> SQL :  select assetGroupId, name from AssetGroupData where affinityId =
>> ?
>>
>> *Exception:*
>> javax.cache.CacheException: Failed to parse query. Column "AFFINITYID"
>> not found; SQL statement:
>> explain select assetGroupId, name from AssetGroupData where affinityId =
>> ?  [42122-196]
>>  at
>> org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.query(IgniteCacheProxyImpl.java:676)
>>  at
>> org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.query(IgniteCacheProxyImpl.java:615)
>>  at
>> org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy.query(GatewayProtectedCacheProxy.java:356)
>>
>> Test code I am using to push data to cache:
>>
>> private void pushData(String cacheName,List<? extends Data> datas){
>>
>>   final IgniteCache<DataKey, Data> cache = ignite
>>       .cache(cacheName);
>>   for (Data data : datas) {
>>     cache.put(data.getKey(), data);
>>   }
>> }
>>
>>
>>
>>
>> Thanks,
>> Prasad
>>
>> On Wed, Aug 22, 2018 at 10:18 PM Prasad Bhalerao <
>> [email protected]> wrote:
>>
>>> Ok, I tried to write generic impl to use the same key class with
>>> different caches . That's why kept the name affinityId. The reason I am not
>>> getting error is I have the subscriptionId in Data(value) class as well.
>>>
>>> So it means the affinity key field name matters. I was thinking/trying
>>> to map the affinity column name "subscriptionId" to field "affinityId"
>>> without keeping the field name same. Was looking in wrong direction.
>>>
>>> Thanks,
>>> Prasad
>>>
>>>
>>> Thanks,
>>> Prasad
>>>
>>>
>>> On Wed, Aug 22, 2018, 9:29 PM vkulichenko <[email protected]>
>>> wrote:
>>>
>>>> Prasad,
>>>>
>>>> In this case using subscriptionId in query would be a syntax error,
>>>> because
>>>> the name of the field is affinityId. If you use affinityId, however,
>>>> Ignite
>>>> will route the query to a single node. It knows that it's affinity key
>>>> based
>>>> on @AffinityKeyMapped annotation.
>>>>
>>>> -Val
>>>>
>>>>
>>>>
>>>> --
>>>> Sent from: http://apache-ignite-users.70518.x6.nabble.com/
>>>>
>>>
>>>
>>> On Wed, Aug 22, 2018, 9:29 PM vkulichenko <[email protected]>
>>> wrote:
>>>
>>>> Prasad,
>>>>
>>>> In this case using subscriptionId in query would be a syntax error,
>>>> because
>>>> the name of the field is affinityId. If you use affinityId, however,
>>>> Ignite
>>>> will route the query to a single node. It knows that it's affinity key
>>>> based
>>>> on @AffinityKeyMapped annotation.
>>>>
>>>> -Val
>>>>
>>>>
>>>>
>>>> --
>>>> Sent from: http://apache-ignite-users.70518.x6.nabble.com/
>>>>
>>>

Reply via email to