У нас есть два типа документов: CS и //, когда все дополнительные фильтры присутствуют в одном и том же сегменте, и мы объединяем два, используя latestCommandStatusId поле PCI, который является id из CS документа и нескольких необязательных и некоторых обязательных полей в N1QL.Время отклика на рабочем сервере занимает слишком много времени, более 5-6 секунд, нам нужно сократить его до 300 миллисекунд.
У нас есть два типа документов, CS и PCI в одном сегменте, имы соединяем эти два, используя поле lastCommandStatusId PCI, которое является идентификатором документа CS и несколькими необязательными и некоторыми обязательными полями в N1QL.
CS(id = request10)
{
"id": "request10",
"_class": "CS",
"status": "FAILED"
}
PCI(id = pci1)
{
"id": "pci1",
"latestCommandStatusId": "request10", // equal to some CS doc id
"_class": "PCI",
"createdDateTime": 1672531200000,
"effectiveDateTime": 1688083200000,
"locationDSL": {
"parameters": {
"locationClusterId": ["L3", "L1","L2"]
}
},
"productDSL": {
"parameters": {
"tpnb": ["02","04"]
}
}
}
Теперь, чтобы присоединиться к этим документам, у нас есть следующий запрос, который работает нормально, но занимает слишком много времени на производственном сервере с огромным набором данных.Мой вопрос, какие индексы нам нужно создать, чтобы ускорить время отклика для комбинации фильтров ниже
SELECT META(pci).id AS _ID,META(pci).cas AS _CAS, pci,cs
FROM prices pci JOIN prices cs ON KEYS pci.latestCommandStatusId // join CS and PCI on pci.latestCommandStatusId which is id of CS doc
WHERE pci.effectiveDateTime BETWEEN "some_from_time" AND "some_to_time" // compulsory filter
AND 'some_tpnb' IN pci.productDSL.parameters.tpnb // optional filter if some_tpnb is null in request param
AND 'some_locationClusterId' IN pci.locationDSL.parameters.locationClusterId // optional filter if some_locationClusterId is null in request param
AND pci.state = "some_pci_state" // optional filter if some_pci_state is null in request param
AND cs.status = "some_cs_status" // optional filter if some_cs_status is null in request param
ORDER BY pci.effectiveDateTime DESC //mandatory ordering by pci.effectiveDateTime DESCending order
OFFSET 0 LIMIT 15 // mandatory pagination
, поэтому у нас есть несколько обязательных фильтров и несколько дополнительных фильтров в зависимости от ввода
, например, если всенеобязательные фильтры имеют значение null
WHERE pci.effectiveDateTime BETWEEN "some_from_time" AND "some_to_time" // compulsory filter
ORDER BY pci.effectiveDateTime DESC //mandatory ordering by pci.effectiveDateTime
OFFSET 0 LIMIT 15 // mandatory pagination
например, если some_tpnb не равно нулю в параметре запроса, а другие необязательные фильтры имеют значение null
WHERE pci.effectiveDateTime BETWEEN "some_from_time" AND "some_to_time" // compulsory filter
AND 'some_tpnb' IN pci.productDSL.parameters.tpnb // if some_tpnb is not null in request param and other optional filters are null
ORDER BY pci.effectiveDateTime DESC //mandatory ordering by pci.effectiveDateTime
OFFSET 0 LIMIT 15 // mandatory pagination
например: если some_locationClusterId не равно нулю, а другие необязательные фильтры имеют значение null
WHERE pci.effectiveDateTime BETWEEN "some_from_time" AND "some_to_time" // compulsory filter
AND 'some_locationClusterId' IN pci.locationDSL.parameters.locationClusterId
ORDER BY pci.effectiveDateTime DESC //mandatory ordering by pci.effectiveDateTime
OFFSET 0 LIMIT 15 // mandatory pagination
например: если some_pci_state и some_cs_status не равны NULL и другие необязательные фильтры имеют значение NULL
WHERE pci.effectiveDateTime BETWEEN "some_from_time" AND "some_to_time" // compulsory filter
AND pci.state = "some_pci_state"
AND cs.status = "some_cs_status"
ORDER BY pci.effectiveDateTime DESC //mandatory ordering by pci.effectiveDateTime DESCending order
OFFSET 0 LIMIT 15 // mandatory pagination
например: если присутствуют все дополнительные фильтры
WHERE pci.effectiveDateTime BETWEEN "some_from_time" AND "some_to_time"
AND 'some_tpnb' IN pci.productDSL.parameters.tpnb
AND 'some_locationClusterId' IN pci.locationDSL.parameters.locationClusterId
AND pci.state = "some_pci_state"
AND cs.status = "some_cs_status"
ORDER BY pci.effectiveDateTime DESC //mandatory ordering by pci.effectiveDateTime
OFFSET 0 LIMIT 15 // mandatory pagination