# Оптимизация запроса с несколькими aggs

**URL:** <https://discuss.elastic.co/t/aggs/41553>\
**Category:** Вопросы на русском языке\
**Created:** [February 11, 2016, 8:06pm UTC](https://discuss.elastic.co/t/aggs/41553 "2016-02-11T20:06:34Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Bdfy1](https://avatars.discourse-cdn.com/v4/letter/b/858c86/32.png) [@Bdfy1](https://discuss.elastic.co/u/Bdfy1)\
**Post date:** [February 11, 2016, 8:06pm UTC](https://discuss.elastic.co/t/aggs/41553/1 "2016-02-11T20:06:34Z")

</div>

Есть запрос вида:

```auto
{
    "aggs": {
        "test": {
            "date_histogram": {
                "field": "user.date",
                "interval": "1d"
            },
            "aggs": {
                "all_view": {
                    "sum": {
                        "field": "view"
                    }
                },
                "uniq_users": {
                    "cardinality": {
                        "field": "uid"
                    }
                }

            }
        }
    }
}

```

где во втором aggs может быть до 10-15 однотипных полей с sum. В принципе этот вопрос работает ( 30-50 секунд на 150 Гб ). Возможно ли оптимизировать этот запрос ( например разделить на 10-15 маленьких запросов по каждому sum отдельно или может быть какой индекс добавить ? ) Текущий mapping для индекса:

```auto
{
 "template" : "test",
 "mappings" : {
    "_default_" : {
       "_all" : {"enabled" : true},
       "dynamic_templates" : [ {
         "string_fields" : {
           "match" : "*",
           "match_mapping_type" : "string",
           "mapping" : {
             "type" : "multi_field",
               "fields" : {
                 "{name}" : {"type": "string", "index" : "analyzed", "omit_norms" : true, analyzer: "keyword" }
               }
           }
         }
       } ],
       "properties" : {
         "@version": { "type": "string", "index": "not_analyzed" }
       }
    }
  }
}

```

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [February 11, 2016, 9:53pm UTC](https://discuss.elastic.co/t/aggs/41553/2 "2016-02-11T21:53:34Z")

</div>

То есть эта часть повторяется 10-15 раз с разными полями?

```auto
                "all_view": {
                    "sum": {
                        "field": "view"
                    }
                },
                "some_view": {
                    "sum": {
                        "field": "view1"
                    }
                },
                "some_other_view": {
                    "sum": {
                        "field": "view2"
                    }
                },
               ....... и т.д. 10-15 раз .....

```

---

<div class="post-metadata">

**Author:** ![Bdfy1](https://avatars.discourse-cdn.com/v4/letter/b/858c86/32.png) [@Bdfy1](https://discuss.elastic.co/u/Bdfy1)\
**Post date:** [February 12, 2016, 6:21am UTC](https://discuss.elastic.co/t/aggs/41553/3 "2016-02-12T06:21:01Z")

</div>

да с разными полями

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [February 12, 2016, 5:43pm UTC](https://discuss.elastic.co/t/aggs/41553/4 "2016-02-12T17:43:37Z")

</div>

Когда в запросе присутствуют несколько агрегаций, этот запрос обрабатывается следующим образом: сначала запрос разбивается на несколько подзапросов для каждой шарды, и все подзапросы начинают выполняться параллельно (если, конечно, в пуле потоков есть свободные потоки). Каждые подзапрос начинает поиск и потом выполняет каждую агрегацию последовательно на каждой записи, возвращенной поиском. И это последовательное исполнение может быть причиной долгой работы запроса. Поэтому такой запрос иногда можно ускорить увеличением количества шард в индексе либо разделением запроса на 2 или более отдельных запросов. Однако, увеличение степени параллелизации будет работать до тех пор, пока есть свободные циклы ЦПУ и I/O не перенасыщен. После этого надо будет смотреть каким образом можно уменьшить нагрузку, а это зависит от версии elasticsearch и от того какого ресурса не хватает. Последнее можно определить запуском hot\_threads во время исполнения запроса.

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [July 6, 2017, 1:49pm UTC](https://discuss.elastic.co/t/aggs/41553/5 "2017-07-06T13:49:26Z")

</div>


