Что эквивалентно SQL_CALC_FOUND_ROWS/FOUND_ROWS() в никель N1QL Couchbase

Есть ли встроенная функция в N1QL, которая эквивалентна SQL_CALC_FOUND_ROWS И FOUND_ROWS() в MySQL для использования с LIMIT , OFFSET для целей подготовки пейджера?

Если нет, то какой лучший обходной путь для достижения того же результата, а не выполнение дополнительного запроса N1QL, упомянутого ниже

SELECT COUNT(id) FROM mybucket WHERE <same condition that get first result set>

person Mohammed Al-Hyari    schedule 24.05.2016    source источник


Ответы (1)


Вы получаете подсчет полного возможного набора результатов в тех случаях, когда мы сортируем данные (чтобы мы могли их посчитать) и ОГРАНИЧИВАЕМ набор результатов. sortCount — это общее количество возможных документов без ограничений.

select * from `beer-sample` where city > "" order by city limit 10;
...
    "status": "success",
    "metrics": {
        "elapsedTime": "273.677801ms",
        "executionTime": "273.636223ms",
        "resultCount": 10,
        "resultSize": 8740,
        **"sortCount": 1390**
    }
}

Без ORDER BY вы просто получаете следующее.

select * from `beer-sample` where city > ""  limit 10;
...
    "status": "success",
    "metrics": {
        "elapsedTime": "21.661524ms",
        "executionTime": "21.619021ms",
        "resultCount": 10,
        "resultSize": 10163
    }
}

В версии 4.5, когда у вас есть покрывающее сканирование индекса, вы можете выполнить параллельный запрос для выполнения подсчета только из сканирования индекса.
В объяснении будет указано, может ли этот метод "CountScan" использоваться для запроса.

Пример:

cbq> explain select count(1) from `beer-sample` where city = 'San Francisco';
{
    "requestID": "fe9b3f0f-bfc2-4132-bfd7-6268b78860d4",
    "signature": "json",
    "results": [
        {
            "plan": {
                "#operator": "Sequence",
                "~children": [
                    {
                        **"#operator": "IndexCountScan",**
                        "covers": [
                            "cover ((`beer-sample`.`city`))",
                            "cover ((meta(`beer-sample`).`id`))"
                        ],
                        "index": "idxcity",
                        "index_id": "66d88e11a6178a04",
                        "keyspace": "beer-sample",
                        "namespace": "default",
                        "spans": [
                            {
                                "Range": {
                                    "High": [
                                        "\"San Francisco\""
                                    ],
                                    "Inclusion": 3,
                                    "Low": [
                                        "\"San Francisco\""
                                    ]
                                }
                            }
                        ],
                        "using": "gsi"
                    },
                    {
                        "#operator": "IndexCountProject",
                        "result_terms": [
                            {
                                "expr": "count(1)"
                            }
                        ]
                    }
                ]
            },
            "text": "select count(1) from `beer-sample` where city = 'San Francisco'"
        }
    ],
    "status": "success",
    "metrics": {
        "elapsedTime": "4.434551ms",
        "executionTime": "4.382437ms",
        "resultCount": 1,
        "resultSize": 1572
    }
}
cbq> 
person Keshav Murthy    schedule 26.05.2016
comment
Спасибо @Keshav, но как мы можем получить объект метрик в результате, если мы выполним запрос n1ql через SDK, такой как php - person Mohammed Al-Hyari; 26.05.2016
comment
Привет @MohammedAl-Hyari. Прямо сейчас единственная ситуация, когда вы получаете это автоматически, - это когда сортировка завершена. Этот полный подсчет важен для нумерации страниц. Я указал это в наших запросах функций: MB-19763. Вы можете следить за этим для планов. Спасибо. - person Keshav Murthy; 27.05.2016