2017-01-13 1 views
0

Я пытаюсь ускорить запрос ниже индексированием массива, и я не могу понять его правильно.Couchbase Индексирование для запроса вложенного массива

SELECT count(*) FROM pacientes UNNEST COMPOSITION.content contentItem 
WHERE contentItem.items IS NOT NULL AND ANY i WITHIN contentItem.items 
SATISFIES i.archetype_id="at0007" AND i.`value`.`value` < 200 AND 
i.`value`.`value` > 100 END; 

Я попытался создать следующие показатели, но ни один не работает:

CREATE INDEX idx_item_value ON pacientes (ARRAY i FOR i IN 
COMPOSITION.content.items.`value`.`value` WHEN i.archetype_id="at0007" END); 

CREATE INDEX idx_item ON pacientes 
(ARRAY i FOR i IN COMPOSITION.content.items END); 

CREATE INDEX idx_item ON pacientes UNNEST COMPOSITION.content contentItem 
(ARRAY i FOR i IN contentItem.items WHEN i.archetype_id="at0007" END); 

Есть предложения?

ответ

0

В своих операторах CREATE INDEX используйте РАССЕИВАНИЕ DISTINCT вместо ARRAY.

Вот пересмотренный запрос и индексы.

SELECT count(*) 
FROM pacientes AS p 
UNNEST COMPOSITION.content AS contentItem 
WHERE 
     ANY ci IN p.COMPOSITION.content SATISFIES 
      (ANY i WITHIN ci.items SATISFIES 
       i.archetype_id="at0007" 
       AND i.`value`.`value` < 200 
       AND i.`value`.`value` > 100 END 
      ) 
     END 
; 

CREATE INDEX idx_archetype ON pacientes(DISTINCT ARRAY (DISTINCT ARRAY i.archetype_id FOR i WITHIN ci.items END) FOR ci IN COMPOSITION.content END); 

CREATE INDEX idx_value ON pacientes(DISTINCT ARRAY (DISTINCT ARRAY i.`value`.`value` FOR i WITHIN ci.items END) FOR ci IN COMPOSITION.content END); 
+0

Я уже пробовал использовать DISTINCT, запрос не использует индекс в любом случае. – crigore