2017-01-05 5 views
-1

У меня ниже запросапроизводительность улучшения в n1ql, couchbase используя индекс

explain SELECT * FROM (select ROUND(sum(ARRAY_SUM(DailyCampaignUsage.`statistics`[*].clicksCost)),2) total_revenue, 
ROUND(sum(CASE WHEN DailyCampaignUsage.day between '2016-05-01' and '2016-05-23' THEN ARRAY_SUM(DailyCampaignUsage.`statistics`[*].clicksCost) ELSE 0 END),2) period_revenue, 
ROUND(sum(CASe WHEN DailyCampaignUsage.day between '2016-04-01' and '2016-04-23' THEN ARRAY_SUM(DailyCampaignUsage.`statistics`[*].clicksCost) ELSE 0 END),2) period_prev_revenue 
from Inheritx DailyCampaignUsage use index(dailyCampaignUsage_type_day_clicksCost) 
JOIN Inheritx Campaign ON KEYS ('Campaign|'||TOSTRING(DailyCampaignUsage.campaignId)) 
JOIN Inheritx Users on keys('User|'|| TOSTRING(Campaign.`user`)) 
WHERE DailyCampaignUsage._type='DailyCampaignUsage' and CASE WHEN FALSE THEN Users.`user` in FALSE ELSE TRUE END) AS __viewdef__ ORDER BY `created` DESC 

У меня ниже индекса

CREATE INDEX dailyCampaignUsage_type_day_clicksCost ON Inheritx 
(_type,day,`statistics`[*].clicksCost) WHERE _type='DailyCampaignUsage' 

, который я должен использовать в запросе.

мой план объяснения - удар.

{ 
    "plan": { 
     "#operator": "Sequence", 
     "~children": [ 
     { 
      "#operator": "Sequence", 
      "~children": [ 
      { 
       "#operator": "Sequence", 
       "~children": [ 
       { 
        "#operator": "IndexScan", 
        "index": "dailyCampaignUsage_type_day_clicksCost", 
        "index_id": "37387d27d560354b", 
        "keyspace": "Inheritx", 
        "namespace": "default", 
        "spans": [ 
        { 
         "Range": { 
         "High": [ 
          "successor(\"DailyCampaignUsage\")" 
         ], 
         "Inclusion": 1, 
         "Low": [ 
          "\"DailyCampaignUsage\"" 
         ] 
         } 
        } 
        ], 
        "using": "gsi" 
       }, 
       { 
        "#operator": "Parallel", 
        "~child": { 
        "#operator": "Sequence", 
        "~children": [ 
         { 
         "#operator": "Fetch", 
         "as": "DailyCampaignUsage", 
         "keyspace": "Inheritx", 
         "namespace": "default" 
         }, 
         { 
         "#operator": "Join", 
         "as": "Campaign", 
         "keyspace": "Inheritx", 
         "namespace": "default", 
         "on_keys": "(\"Campaign|\" || to_string((`DailyCampaignUsage`.`campaignId`)))" 
         }, 
         { 
         "#operator": "Join", 
         "as": "Users", 
         "keyspace": "Inheritx", 
         "namespace": "default", 
         "on_keys": "(\"User|\" || to_string((`Campaign`.`user`)))" 
         }, 
         { 
         "#operator": "Filter", 
         "condition": "(((`DailyCampaignUsage`.`_type`) = \"DailyCampaignUsage\") and case when false then ((`Users`.`user`) in false) else true end)" 
         }, 
         { 
         "#operator": "InitialGroup", 
         "aggregates": [ 
          "sum(array_sum((array_star((`DailyCampaignUsage`.`statistics`)).`clicksCost`)))", 
          "sum(case when ((`DailyCampaignUsage`.`day`) between \"2016-04-01\" and \"2016-04-23\") then array_sum((array_star((`DailyCampaignUsage`.`statistics`)).`clicksCost`)) else 0 end)", 
          "sum(case when ((`DailyCampaignUsage`.`day`) between \"2016-05-01\" and \"2016-05-23\") then array_sum((array_star((`DailyCampaignUsage`.`statistics`)).`clicksCost`)) else 0 end)" 
         ], 
         "group_keys": [] 
         } 
        ] 
        } 
       }, 
       { 
        "#operator": "IntermediateGroup", 
        "aggregates": [ 
        "sum(array_sum((array_star((`DailyCampaignUsage`.`statistics`)).`clicksCost`)))", 
        "sum(case when ((`DailyCampaignUsage`.`day`) between \"2016-04-01\" and \"2016-04-23\") then array_sum((array_star((`DailyCampaignUsage`.`statistics`)).`clicksCost`)) else 0 end)", 
        "sum(case when ((`DailyCampaignUsage`.`day`) between \"2016-05-01\" and \"2016-05-23\") then array_sum((array_star((`DailyCampaignUsage`.`statistics`)).`clicksCost`)) else 0 end)" 
        ], 
        "group_keys": [] 
       }, 
       { 
        "#operator": "FinalGroup", 
        "aggregates": [ 
        "sum(array_sum((array_star((`DailyCampaignUsage`.`statistics`)).`clicksCost`)))", 
        "sum(case when ((`DailyCampaignUsage`.`day`) between \"2016-04-01\" and \"2016-04-23\") then array_sum((array_star((`DailyCampaignUsage`.`statistics`)).`clicksCost`)) else 0 end)", 
        "sum(case when ((`DailyCampaignUsage`.`day`) between \"2016-05-01\" and \"2016-05-23\") then array_sum((array_star((`DailyCampaignUsage`.`statistics`)).`clicksCost`)) else 0 end)" 
        ], 
        "group_keys": [] 
       }, 
       { 
        "#operator": "Parallel", 
        "~child": { 
        "#operator": "Sequence", 
        "~children": [ 
         { 
         "#operator": "InitialProject", 
         "result_terms": [ 
          { 
          "as": "total_revenue", 
          "expr": "round(sum(array_sum((array_star((`DailyCampaignUsage`.`statistics`)).`clicksCost`))), 2)" 
          }, 
          { 
          "as": "period_revenue", 
          "expr": "round(sum(case when ((`DailyCampaignUsage`.`day`) between \"2016-05-01\" and \"2016-05-23\") then array_sum((array_star((`DailyCampaignUsage`.`statistics`)).`clicksCost`)) else 0 end), 2)" 
          }, 
          { 
          "as": "period_prev_revenue", 
          "expr": "round(sum(case when ((`DailyCampaignUsage`.`day`) between \"2016-04-01\" and \"2016-04-23\") then array_sum((array_star((`DailyCampaignUsage`.`statistics`)).`clicksCost`)) else 0 end), 2)" 
          } 
         ] 
         }, 
         { 
         "#operator": "FinalProject" 
         } 
        ] 
        } 
       } 
       ] 
      }, 
      { 
       "#operator": "Alias", 
       "as": "__viewdef__" 
      }, 
      { 
       "#operator": "Parallel", 
       "~child": { 
       "#operator": "Sequence", 
       "~children": [ 
        { 
        "#operator": "InitialProject", 
        "result_terms": [ 
         { 
         "expr": "self", 
         "star": true 
         } 
        ] 
        } 
       ] 
       } 
      } 
      ] 
     }, 
     { 
      "#operator": "Order", 
      "sort_terms": [ 
      { 
       "desc": true, 
       "expr": "(`__viewdef__`.`created`)" 
      } 
      ] 
     }, 
     { 
      "#operator": "FinalProject" 
     } 
     ] 
    }, 
    "text": "SELECT * FROM (select ROUND(sum(ARRAY_SUM(DailyCampaignUsage.`statistics`[*].clicksCost)),2) total_revenue,\nROUND(sum(CASE WHEN DailyCampaignUsage.day between '2016-05-01' and '2016-05-23' THEN ARRAY_SUM(DailyCampaignUsage.`statistics`[*].clicksCost) ELSE 0 END),2) period_revenue,\nROUND(sum(CASe WHEN DailyCampaignUsage.day between '2016-04-01' and '2016-04-23' THEN ARRAY_SUM(DailyCampaignUsage.`statistics`[*].clicksCost) ELSE 0 END),2) period_prev_revenue \nfrom Inheritx DailyCampaignUsage use index(dailyCampaignUsage_type_day_clicksCost)\nJOIN Inheritx Campaign ON KEYS ('Campaign|'||TOSTRING(DailyCampaignUsage.campaignId)) \nJOIN Inheritx Users on keys('User|'|| TOSTRING(Campaign.`user`)) \nWHERE DailyCampaignUsage._type='DailyCampaignUsage' and CASE WHEN FALSE THEN Users.`user` in FALSE ELSE TRUE END) AS __viewdef__ ORDER BY `created` DESC" 
    } 

Даже индекс, использующий, я не могу уменьшить его выполнение. это 13s как я могу это сделать от 300 до 500 мс ?? мой JSON, как показано ниже меня 50k + JSon

DailyCampaignUsage|006657c0-c696-11e6-b6f2-7f0166ec7527{ 
     "_id": "006657c0-c696-11e6-b6f2-7f0166ec7527", 
     "_type": "DailyCampaignUsage", 
     "campaignId": 249, 
     "day": "2015-11-19T00:00:00Z", 
     "statistics": [ 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     { 
      "clicks": 1741, 
      "clicksCost": 48.748 
     } 
     ] 
    } 

ответ

1

1) может сначала попытаться оптимизировать внутренний запрос. Сделайте это, используя индексы покрытия, включив все поля первого ключевого пространства, используемые в where/projectionions/join-on-keys в определении индекса. См. https://developer.couchbase.com/documentation/server/4.5/indexes/covering-indexes.html. Последний пример в документации относится к вам. Что-то вроде:

CREATE INDEX dailyCampaignUsage_type_day_clicksCost ON Inheritx 
(_type,day, campaignId, `statistics`[*].clicksCost) WHERE _type='DailyCampaignUsage' 

2) Вы можете попробовать Оптимизированные по памяти индексы (MOI), чтобы значительно увеличить уровень перфорации. Для этого требуется корпоративная версия. См. https://developer.couchbase.com/documentation/server/4.5/architecture/global-secondary-indexes.html#story-h2-2

3) Внешний запрос выполняет только порядок на «созданном», который не проецируется внутренним запросом. Если он находится в первом ключевом пространстве, включите его в индекс.

4) Также проверьте условие WHERE с CASE на User.user. Он всегда оценивает значение true. Не уверен, нужна ли вам 3-я Регистрация.

НТН, -Prasad

+0

все результат придет тогда он будет делать внешний заказ на. пользовательское условие действует только для администратора, если у другого пользователя есть такое состояние, как users.'user' в [2,3,56,78 и т. д.], это связано с пользователем –

+0

, используя вашу первую ссылку. Я делаю отдельный запрос и делаю их объединенными но вы также проверяете мой этот вопрос также http://stackoverflow.com/questions/41544159/index-not-improve-speed-in-couchbase-4-5 –