Выбор ключей раздела Cosmos - PullRequest
0 голосов
/ 17 апреля 2019

Я создаю доказательство концепции для микросервиса, который будет запрашивать базу данных Cosmos. Эта БД будет содержать значительные объемы данных, взятых из тысяч баз данных SQL. Каждая база данных SQL - это сайт с siteId, а каждая запись имеет uniqueref (это уникально на этом сайте , но не глобально). Идея Cosmos DB состоит в том, чтобы хранить документы, которые содержат все биты данных, которые может запросить очень широкая поисковая функция (я думаю, что есть что-то вроде 25+ возможных поисковых терминов). Тем не менее, около 82% всех поисковых запросов выполняются только uniqueref (пользователю не нужно выбирать siteId, поскольку они уже будут эффективно зарегистрированы на своем собственном сайте и не смогут выполнять поиск других). Это, наряду с еще 7 комбинациями терминов, охватывает около 97,5% всех поисков.

Причина, по которой мы смотрим на Cosmos, заключается в том, что базы данных SQL имеют большой размер и их структура скорее не оптимальна, что означает, что эти поиски загружают десятки или даже сотни тысяч строк данных из нескольких таблиц, чтобы объединить их в память (без принудительных внешних ключей является одним из неоптимальных проектных решений), чтобы вернуть, возможно, только одну строку данных. К сожалению, мы не можем изменить базы данных SQL.

То, что я пытаюсь решить, это то, что может стать хорошим ключом раздела в Космосе? uniqueref вовсе не гарантированно является глобально уникальным, то есть он сам по себе бесполезен, если я правильно понял документы, поскольку у вас будут десятки тысяч логических разделов, в которых может быть от 1 до 3000 записей. ,

Количество данных на сайт сильно варьируется: у некоторых может быть относительно небольшое количество записей, возможно, несколько тысяч или меньше, а у некоторых может быть сотня тысяч, поэтому siteId ощущается как горячая точка физического раздела, ожидающая своего появления как если бы у нас было 3000 сайтов, то это 3000 логических разделов, я думаю, с очень переменным количеством данных в них, если только я неправильно понял, как возникают горячие точки

Другая возможность - синтезировать ключ, скажем, из siteId и uniqueref, так как я считаю, что это популярный способ попытаться равномерно распределить данные. Во всех случаях мы можем включить siteId в поиск, а в 82% случаев мы можем включить uniqueref, чтобы затем мы могли безболезненно создать и добавить синтетический ключ. Оставшиеся 18% или около того запросов, вероятно, будут более требовательными к пропускной способности, но это, вероятно, все же лучше, чем очень значительные затраты ресурсов SQL Server, которые генерируют эти поиски. Проблема в том, что, как очень визуальный ученик, у меня возникают проблемы с визуализацией, как это будет распространять данные! Сочетание siteId и uniqueref, скорее всего, будет не столько разбросом значений, сколько уникальными значениями.

Размер документа может быть разным, но в среднем он может составлять от 1,5 КБ до 2,5 КБ. Я еще не знаю максимальное количество документов на сайт, но оно все равно будет расти, и я не думаю, что мы пока достигли отметки в 4 миллиона для какого-либо одного сайта, что будет где-то около 10 ГБ для разделов. Я не уверен, насколько это влияет или должно повлиять на мой выбор ключа.

Мой опыт работы с Космосом ограничен, поэтому я не уверен, как поступить. Должен ли я использовать уникальное значение, значение, которое имеет неравномерное распределение данных, или значение, которое может быть не уникальным, но может иметь огромный разброс значений?

...