Можно ли запросить большую таблицу Azure с конкретными параметрами поиска, но без PartitionKey?

Допустим, у меня есть таблица сущности как это:

Partitionkey Rowkey таблица ID пользователя создан

Давайте возьмем запрос, который прекрасно работает, с его помощью я могу получить все записи, которые имеют определенный идентификатор (который используется в качестве PartitionKey)

Dim azt_query As CloudTableQuery(Of adlog)
azt_query = azt_context.CreateQuery(Of adlog)("adlog").Where(Function(e) (e.PartitionKey = "myid" And e.table = "mytable" And e.userid = "myuserid" And e.datecreated >= dateStart And e.datecreated <= dateEnd)).AsTableServiceQuery()

Теперь я хотел бы запросить таблицу, не зная PartitionKey, но основываясь на USERID

Было бы так:

Dim azt_query As CloudTableQuery(Of adlog)
azt_query = azt_context.CreateQuery(Of adlog)("adlog").Where(Function(e) (e.table = "mytable" And e.userid = "myuserid" And e.datecreated >= dateStart And e.datecreated <= dateEnd)).AsTableServiceQuery()

Но удаление e.PartitionKey = "myid" теперь занимает вечность. Я думаю, что запрос хочет получить все строки таблицы и искать в ней с помощью параметра.

Но есть миллионы строк. Запросы с помощью ключа раздела на самом деле довольно быстрые.

Есть ли способ запросить это? Могу ли я получить все строки определенного USERID или я застрял на уровне ключа раздела?

2 ответа

Решение

Вы можете запросить таблицу таким образом, но, как вы заметили, это не очень хорошая идея. Без PartitionKey сервер хранения делает именно то, о чем вы подозревали: он читает каждую сущность в таблице. В языке Azure Tables это называется "сканирование таблицы", что очень медленно.

Единственный способ обойти это - включить PartitionKey в запрос. Если вам нужно много выполнять подобные запросы, вы можете рассмотреть возможность сохранения отдельной таблицы со схемой PartitonKey/RowKey, которая сделает этот запрос быстрым, или же использовать базу данных SQL с соответствующими индексами.

Ключи Partition и Row Keys являются обязательными полями, в то время как вы можете запрашивать, не указывая их, это приведет к сканированию таблицы, что может привести к загрузке всех результатов из таблиц Azure в ваше приложение, где они будут проверяться на достоверность строка за строкой.

Ключи разделов и строк индексируются. Ключ Partition фактически будет использоваться для разделения вашей таблицы между разделами, чтобы сделать доступ к некоторым разделам (чаще используемым) более быстрым, в пределах раздела строки все вместе.

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

Надеюсь это поможет,

Другие вопросы по тегам