У меня возник вопрос о выборе ключа раздела DocumentDB. У меня есть данные с UserId, DeviceId и WhateverId. Параметр UserId всегда будет в запросах, поэтому я выбрал UserId в качестве ключа раздела. Но у меня много данных для одного пользователя (миллионы объектов), и когда я сделал quety, как "SELECT * FROM c WHERE c.DeviceId = @DeviceId"
с указанным ключом раздела, требуется много времени (около 6 минут для около 220 000 возвращенных объектов). Возможно, было бы более эффективным выбрать, например, DeviceId в качестве ключа раздела и делать запросы против нескольких разделов параллельно (с указанием EnableCrossPartitionQuery = true и MaxDegreeOfParallelism = количество разделов)? Или, может быть, это хорошая идея использовать отдельную коллекцию для каждого пользователя?Ключ раздела для DocumentDB
ответ
Это может помочь немного, но я не думаю, что раздел для каждого пользователя решит вашу проблему, потому что вы по существу имеете это под обложками.
Вы можете поэкспериментировать с ключом раздела, чтобы улучшить parrallism, но, в лучшем случае, это обеспечит вам улучшение в 2-5 раз по сравнению с моим опытом. Этого достаточно?
Для более значительных улучшений вам обычно приходится прибегать к выборочной денормализации и/или кешированию.
Я изменил ключ раздела на DeviceId и попытался сделать запрос как 'SELECT c.Value FROM c WHERE c.UserId = @userId и c.WhateverId = @ WhateverId'. Для 19845 возвращенных объектов потребовалось 4.6. Все в порядке. Но когда я попытался запросить ключ раздела, например 'SELECT c.Value FROM c WHERE c.UserId = @userId и c.DeviceId = @ DeviceId', потребовалось около 27 секунд почти для того же количества возвращенных объектов. И это плохо, потому что запросы с DeviceId чаще используются. Я понимаю, что это произошло потому, что когда мы указываем ключ раздела, параллелизм отсутствует. Должен ли я рассмотреть другой pk – Paval
Ключ в том, что вам придется продолжать экспериментировать. Не забудьте включить настройку индекса в свои эксперименты. Клавиши индекса по умолчанию отключены от первых 3 байтов данных. Если это не изменится достаточно, вы можете получить горячую точку индекса. –
Вы имеете в виду, что это произойдет, если у меня будет много ключей, начинающихся с одних и тех же символов, правильно. – Paval
Я знаю, что это немного старое, но на благо других, приезжающие в эту тему ...
Из вашего описания я полагаю, что эти устройства являются в основном уникальными для пользователя. Часто рекомендуется разделять что-то вроде userid, что хорошо, если у вас есть, скажем, приложение для колл-центра, со многими запросами для данного идентификатора пользователя и хотите найти не более нескольких сотен записей. В таких случаях данные могут быть быстро извлечены из одного раздела без накладных расходов при сопоставлении данных по разделам. Однако, если у вас есть миллионы записей для пользователя, то разделение на ИД пользователя, пожалуй, самый худший вариант, так как извлечение больших объемов данных из одного раздела скоро превысит накладные расходы на сортировку. В таких случаях вы хотите распределить данные пользователя как можно более равномерно по всем разделам. Если у каждого пользователя нет более 25 устройств с аналогичным использованием, то идентификатор устройства, вероятно, тоже не является хорошим выбором.
В таких случаях, как ваш, я обычно нахожу системный сгенерированный инкрементный ключ (например, идентификатор события или идентификатор транзакции), чтобы быть лучшим выбором.
- 1. Documentdb хранимый запрос перекрестного раздела proc
- 2. DocumentDB найти глубокий ключ: значение
- 3. Cassandra: выбирая ключ раздела
- 4. Ключ раздела в Cassandra
- 5. dynamodb ключ раздела для вопросов таблица
- 6. SQL Server уникальный ключ для каждого раздела
- 7. MySQL - Первичный ключ необходим для раздела
- 8. DocumentDB REST API: x-ms-documentdb-partitionkey недействителен
- 9. Почему Cassandra меняет ключ раздела?
- 10. Ключ раздела только в Cassandra
- 11. Требуется ли ключ раздела при получении документа ID
- 12. Определить ключ раздела (имя или диапазон номеров) из раздела ID
- 13. Создать коллекцию в Azure DocumentDB с разным режимом раздела
- 14. Хеширование на разделы в DocumentDB
- 15. ключ раздела в cassandra, сделать поле невидимым
- 16. Плагин Grails для DocumentDB
- 17. Сортировка для Azure DocumentDB
- 18. иСПользоВание Azure ключ раздела с «начинается с»
- 19. Разделительный ключ для рассылки бюллетеня
- 20. Используя ключ раздела в функции Oracle
- 21. Поиска ключ большого раздела в Кассандре
- 22. DocumentDB: Список используемых разделов разделов
- 23. Получить основной ключ Azure DocumentDB с помощью PowerShell
- 24. DocumentDb требует 64bit
- 25. Сообщение журнала Log4net для Documentdb
- 26. documentdb индексирование для одного свойства
- 27. DocumentDb для Запросов Inner результаты
- 28. запросов в DocumentDB для Поиска
- 29. Поддержка протокола DocumentDB для MongoDB
- 30. Таблицы Azure: как использовать ключ раздела и ключ строки, если объекты имеют только один ключ?
Не то, чтобы это отвечало на ваш вопрос, но ... Я думаю, что в любое время, когда вы пытаетесь извлечь четверть миллиона объектов, вам может потребоваться переосмыслить ваш шаблон доступа к данным. Кроме того, «SELECT *' »является еще одним кодовым запахом. Я не вижу, как ваш выбор ключа раздела будет иметь значение, если вы пытаетесь переместить столько данных в ваш уровень приложения. –
Спасибо. 'SELECT *' был просто для быстрого примера, извините. Я буду использовать 'SELECT c.Value'. И этот вопрос касается выбора ключа раздела, поскольку информация о сайте документации на лазурном языке немного абстрактна, как и для меня. Все эти измерения предназначены только для сравнения производительности в зависимости от запроса. – Paval