Azure UDF Cosmos DB для даты и времени серьезно замедляет запрос - PullRequest
0 голосов
/ 09 апреля 2020

Наши даты хранятся как: "2/22/2008 12:00:00 AM". Нам нужно отфильтровать результаты, чтобы мы могли получать документы два раза.

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

С:

SELECT DISTINCT 
    c.eh, c.wcm, w AS wt 
FROM 
    c 
    JOIN w IN c.wt 
WHERE 
    (udf.toValue(w.ced) BETWEEN udf.toValue('03/02/2023') AND udf.toValue('09/02/2023'))
    AND w.ty = 'FW' 
OFFSET 0 
LIMIT 10

И без:

SELECT DISTINCT 
    c.eh, c.wcm, w AS wt 
FROM 
    c 
    JOIN w IN c.wt 
WHERE 
    w.ty = 'FW' 
OFFSET 0 
LIMIT 10

Вот UDF:

function userDefinedFunction(datestr){
    return new Date(datestr).getTime();
}

Согласно второй ответ здесь (один из сотрудников MS, который работает в Космосе) Я просто смог бы сделать прямое сравнение:

(w.ced BETWEEN '03/02/2023' AND '09/02/2023')

Но это возвращает 0 результатов. Я чрезвычайно новичок в Космосе. Как можно оптимизировать этот запрос? Я должен добавить, что уже есть idex на wt/ced.

1 Ответ

1 голос
/ 09 апреля 2020

Вообще говоря, если вы можете использовать системную функцию вместо UDF, производительность будет намного лучше.

Однако в этом сценарии вам следует сохранять даты в согласованном формате, чтобы избежать использования UDF. исправляйте их каждый раз.

Я рекомендую ознакомиться с нашими рекомендациями по работе с датами .

Если вы можете сохранить даты в согласованном формате в Cosmos DB (рекомендуемый формат соответствует стандарту ISO 8601 UT C), тогда вам не нужно преобразовывать формат в самом запросе ( это будет дорого). Любые преобразования форматирования данных, если это необходимо, должны выполняться в приложении. Например, перед выполнением запроса необходимо преобразовать дату «03/02/2023» в стандарт ISO 8601 UT C (а затем использовать этот текст в запросе).

Надеюсь, это полезно.

...