Azure SQL Server и производительность табличного хранилища - PullRequest
0 голосов
/ 01 октября 2019

Я много читал о производительности хранилища таблиц Azure. Мой вывод - если только использование partionkey Azure Table Storage работает молниеносно. Чтобы проверить это, я создал два сценария.

Сервер SQL на базовом ценовом уровне с 13 миллионами строк. Все столбцы проиндексированы. Таблица хранения с 120000 строками. Оба с одним и тем же объектом:

public class Item
{
    [Key]
    public int Id { get; set; }

    public string Path { get; set; }

    public bool Deleted { get; set; }

    public int JobId { get; set; }

    public DateTime Started { get; set; }

    public int DurationInMS { get; set; }

    public int Status { get; set; }
}

Когда я запрашиваю сервер SQL, он возвращает 706326 строк за 28 секунд.

Когда я запрашиваю хранение таблицы по ключу разделения, он возвращает 100000 строк в 36,5 секунд.

Я ожидаю, что хранение таблицы будет намного быстрее. Тем более, что в таблице гораздо меньше данных, а я использую только ключ разделения. SQL-сервер действительно быстрее? Я удивлен тем, что в большинстве статей говорится, что Table Storage работает так быстро.

Запрос SQL Server EF:

 var db = new CleanupDB(_config.DBConnection);

 var sw = new Stopwatch();
 sw.Start();
 var dd = db.Items.Where(p => p.JobId == 4).ToList();
 sw.Stop();
 var ms = sw.Elapsed.TotalMilliseconds;

Запрос хранения таблицы:

 CloudTable table = tableClient.GetTableReference("items");

 var q = from s in table.CreateQuery<ItemItemEntity>()
 where s.PartitionKey == "1"
 select s.JobId;

 var sw = new Stopwatch();
 sw.Start();
 var ee = q.ToList();
 sw.Stop();
 var ms = sw.Elapsed.TotalMilliseconds;

Любой из васесть другой опыт? Я что-то здесь упускаю или SQL-сервер может быть быстрее? Я думаю, что этот конкретный сценарий должен отдавать предпочтение Table Storage.

1 Ответ

0 голосов
/ 02 октября 2019

Только для хранилища таблиц Azure (я не знаком с Azure SQL), не рекомендуется запрашивать хранилище таблиц, используя только partition_key, и он будет выполнять partition scan, что займет немного больше времени.

Для запроса таблицы Azure производительность от хорошей до плохой: Точечный запрос -> Запрос диапазона -> Сканирование раздела -> Сканирование таблицы.

Подробности приведены ниже (вы также можете найти их по этому документу ):

Запрос точки: Запрос точки является наиболее эффективнымпоиск для использования и рекомендуется использовать для поиска в больших объемах или поиска, требующего минимальной задержки. Такой запрос может использовать индексы для очень эффективного определения местоположения отдельной сущности путем указания значений PartitionKey и RowKey. Например: $ filter = (PartitionKey eq 'Sales') и (RowKey eq '2')

Range Query: Он использует PartitionKey и фильтрует диапазон значений RowKey для возвратаболее одного лица. Значение PartitionKey идентифицирует конкретный раздел, а значения RowKey идентифицируют подмножество сущностей в этом разделе. Например: $ filter = PartitionKey eq 'Sales' и RowKey ge 'S' и RowKey lt 'T'

Сканирование раздела: Используется PartitionKey и фильтры для другого неключевого свойстваи это может вернуть более одного объекта. Значение PartitionKey идентифицирует конкретный раздел, а значения свойств выбираются для подмножества сущностей в этом разделе. Например: $ filter = PartitionKey eq 'Sales' и LastName eq 'Smith'

Сканирование таблицы: Он не включает PartitionKey и очень неэффективен, так как ищет все разделы, которыесоставьте свою таблицу по очереди для любых соответствующих лиц. Он будет выполнять сканирование таблицы независимо от того, использует ли ваш фильтр RowKey. Например: $ filter = LastName eq 'Jones'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...