【问题标题】:how to do proper indexing while joining in couchbase?如何在加入 couchbase 时进行正确的索引?
【发布时间】:2020-11-24 13:11:36
【问题描述】:

我在联系人存储桶中有一个格式如下的“组织”类型的 couchbase 文档。

"contact": {
  "extendedData": [],
  "id": "organization_2_1094",
  "organizationId": 1094,
  "organizationName": "SMART COMSSS",
  "organizationRoles": [
    {
      "addressAssociations": [
        {
          "activeDate": "2019-08-08T03:51:51.417Z",
          "addressAssocTypeId": -2,
          "addressId": 749,
          "ownershipStatus": 1,
          "srvAddressStatus": 1
        }
      ],
      "extendedData": [
        {
          "characteristicId": "1",
          "characteristicValue": "Plant_Id",
          "extendedDataId": "400"
        },
        {
          "characteristicId": "2",
          "characteristicValue": "Plant_Type",
          "extendedDataId": "401"
        }
      ],
      "name": "Store1",
      "organizationRoleId": 928,
      "roleSpecId": -103,
      "statusId": 1,
      "statusLastChangedDate": "2019-08-22T12:27:51.077Z"
    },
    {
      "name": "changed",
      "organizationRoleId": 929,
      "roleSpecId": -104,
      "statusId": 1,
      "statusLastChangedDate": "2019-08-22T12:27:51.077Z"
    },
    {
      "addressAssociations": [
        {
          "activeDate": "2019-08-08T23:06:49.748Z",
          "addressAssocTypeId": -2,
          "addressId": 752,
          "ownershipStatus": 1,
          "srvAddressStatus": 1
        }
      ],
      "extendedData": [
        {
          "characteristicId": "1",
          "characteristicValue": "Plant_Id",
          "extendedDataId": "402"
        },
        {
          "characteristicId": "2",
          "characteristicValue": "Plant_Type",
          "extendedDataId": "403"
        }
      ],
      "name": "store11",
      "organizationRoleId": 930,
      "partyRoleAssocs": [
        {
          "partyRoleAssocId": "531"
        }
      ],
      "relevantEntityId": "S_103",
      "roleSpecId": -103,
      "statusId": 1,
      "statusLastChangedDate": "2019-08-22T12:27:51.077Z"
    },
    {
      "name": "new store group",
      "organizationRoleId": 931,
      "partyRoleAssocs": [
        {
          "partyRoleAssocId": "532"
        }
      ],
      "roleSpecId": -103,
      "statusId": 1,
      "statusLastChangedDate": "2019-08-22T12:27:51.077Z"
    },
    {
      "name": "child store",
      "organizationRoleId": 932,
      "partyRoleAssocs": [
        {
          "partyRoleAssocId": "533"
        }
      ],
      "roleSpecId": -103,
      "statusId": 1,
      "statusLastChangedDate": "2019-08-22T12:27:51.077Z"
    },
    {
      "name": "MCOTEST",
      "organizationRoleId": 933,
      "roleSpecId": -104,
      "statusId": 1,
      "statusLastChangedDate": "2019-08-22T12:27:51.077Z"
    },
    {
      "name": "new store child",
      "organizationRoleId": 934,
      "partyRoleAssocs": [
        {
          "partyRoleAssocId": "534"
        }
      ],
      "roleSpecId": -103,
      "statusId": 1,
      "statusLastChangedDate": "2019-08-22T12:27:51.077Z"
    },
    {
      "name": "new store child",
      "organizationRoleId": 935,
      "partyRoleAssocs": [
        {
          "partyRoleAssocId": "535"
        },
        {
          "partyRoleAssocId": "565",
          "toRoleId": 936
        }
      ],
      "roleSpecId": -103,
      "statusId": 1,
      "statusLastChangedDate": "2019-08-22T12:27:51.077Z"
    },
    {
      "organizationRoleId": 936,
      "partyRoleAssocs": [
        {
          "toRoleId": 935
        }
      ],
      "statusId": 1,
      "statusLastChangedDate": "2019-08-22T12:27:51.077Z"
    }
  ],
  "statusId": 1,
  "statusLastChangedDate": "2019-08-22T09:27:51.072Z",
  "tenantId": "2",
  "type": "organization"
  }

以及存储桶联系人中的另一个“地址”类型的沙发基础文档

 {
"contact": {
  "address1": "stret",
  "addressId": "1000",
  "city": "miryalguda",
  "countryCode": 4,
  "id": "address_2_1000",
  "state": "ap",
  "tenantId": "2",
  "type": "address",
  "zip": "500070"
       }
}

现在,我已根据我的要求通过在 addressId 上加入文档来查询组织文档中的一些数据和地址文档中的一些数据。以下是查询:

SELECT orgrole.name, orgrole.organizationRoleId,orgrole.externalIds as externalIds,orgrole.roleSpecId,a.city as city, a.zip as zip,{a.addressId,a.address1,a.address2,a.address3,a.country,a.city, a.zip,a.state,a.postalCode,a.houseNumber,a.streetName,a.fxGeocode,a.isActive} as address FROM `optima_contact` AS contact UNNEST contact.organizationRoles AS orgrole UNNEST orgrole.addressAssociations AS aa JOIN `optima_contact` AS a ON aa.addressId = TO_NUMBER(a.addressId)
WHERE  contact.type = "organization" AND a.type = "address"

我已经为连接的右侧创建了一个索引。

 CREATE INDEX `ix2` ON `optima_contact`(`addressId`,`address1`,`address2`,`address3`,`country`,`city`,`zip`,`state`,`postalCode`,`houseNumber`,`streetName`,`fxGeocode`,`isActive`) WHERE (`type` = "address")

还有什么办法可以提高查询的执行时间吗? 由于类型组织的文档数量为 10,并且类型“地址”的文档数量超过 70000,我在查询执行时超时

【问题讨论】:

    标签: couchbase n1ql


    【解决方案1】:

    https://blog.couchbase.com/ansi-join-support-n1ql/

    选项:

    Change query to ON TO_STRING(aa.addressId) = a.addressId
    Or change index to CREATE INDEX `ix3` ON `optima_contact`(TO_NUMBER(`addressId`), `addressId`,`address1`,`address2`,`address3`,`country`,`city`,`zip`,`state`,`postalCode`,`houseNumber`,`streetName`,`fxGeocode`,`isActive`) WHERE (`type` = "address")
    Use Hash JOIN in EE. 
    Change the JOIN order
    Try one of the following 
    

    第一个应该可以解决您的问题。 ON 子句与 RHS 索引键完全匹配,它将推送值,否则它需要获取所有索引键并在查询端应用谓词。

    CB 6.5.0

    WITH contact AS (SELECT orgrole.name, orgrole.organizationRoleId,
                            orgrole.externalIds AS externalIds, orgrole.roleSpecId,
                            aa.addressId
                     FROM optima_contact AS c
                     UNNEST c.organizationRoles AS orgrole
                     UNNEST orgrole.addressAssociations AS aa WHERE c.type = "organization")
    SELECT {a.addressId,a.address1,a.address2,a.address3,a.country,a.city,
            a.zip,a.state,a.postalCode,a.houseNumber,a.streetName,a.fxGeocode,a.isActive} AS address,
            c1.name, c1.organizationRoleId,
            c1.externalIds, c1.roleSpecId, a.city AS city, a.zip AS zip
    FROM optima_contact AS a
    UNNEST contact AS c1
    WHERE a.type = "address" AND TO_NUMBER(a.addressId) = c1.addressId;
    

    6.5 版之前

    SELECT {a.addressId,a.address1,a.address2,a.address3,a.country,a.city,
            a.zip,a.state,a.postalCode,a.houseNumber,a.streetName,a.fxGeocode,a.isActive} AS address,
            c1.name, c1.organizationRoleId,
            c1.externalIds, c1.roleSpecId, a.city AS city, a.zip AS zip
    FROM optima_contact AS a
    UNNEST (SELECT orgrole.name, orgrole.organizationRoleId,
                            orgrole.externalIds AS externalIds, orgrole.roleSpecId,
                            aa.addressId
                     FROM optima_contact AS c
                     UNNEST c.organizationRoles AS orgrole
                     UNNEST orgrole.addressAssociations AS aa WHERE c.type = "organization") AS c1
    WHERE a.type = "address" AND TO_NUMBER(a.addressId) = c1.addressId;
    

    SELECT a AS address, c1.name, c1.organizationRoleId, c1.externalIds, c1.roleSpecId
    FROM optima_contact AS a
    UNNEST (SELECT orgrole.name, orgrole.organizationRoleId,
                            orgrole.externalIds AS externalIds, orgrole.roleSpecId,
                            orgrole.addressAssociations[*].addressId AS addresses
                     FROM optima_contact AS c
                     UNNEST c.organizationRoles AS orgrole
                     WHERE c.type = "organization") AS c1
    WHERE a.type = "address" AND TO_NUMBER(a.addressId) IN c1.addresses;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2012-10-31
      • 2012-07-21
      • 2019-03-11
      相关资源
      最近更新 更多