Простой тест производительности в хранилище данных SQL Azure
Мы работаем над переносом существующих приложений в хранилище данных SQL Azure. Чтобы лучше понять характеристики / возможности управления производительностью / рабочей нагрузкой хранилища данных SQL Azure, я настроил очень простой тест.
Я загрузил статическую таблицу, календарь нашего бизнеса, содержащую около 20 тыс. Строк (т.е. очень мало для параллельного хранилища данных). Затем я сгенерировал все возможные запросы этой единственной таблицы, используя такой шаблон:
SELECT current_timestamp,COUNT(1) FROM
( SELECT C1, ..., Cn , COUNT(1) AS _A_ROW_COUNT
FROM schema.view_to_table GROUP BY C1, ..., Cn) DER
Гивенс:
DWU установлен на 1000.Запущено 35 одновременных потоков.Все потоки работают в small_rc. (То есть, используя 1 слот на запрос.)Использование sqlcmd с начальным подключением, а затем фиксация после каждого SELECTЗапуск на виртуальной машине не Azure с подключением по экспресс-маршруту. Выберите внешнюю конструкцию SELECT COUNT (), чтобы обеспечить минимальный сетевой трафик.Использование таблицы кучи обеспечило лучшие результаты, чем стандартное хранилище столбцов (как и ожидалось). (Необходимо проверить с кластерным индексом.)Таблица распределена по столбцу первичного ключа.Предпосылки / предубеждения - я работал со многими другими базами данных MPP.
Результаты
Запросы выполняются за 10-20 секунд, что намного дольше, чем я ожидал бы для такой простой работы.Когда я отправлял каждую ветку, я спал между каждой новой веткой. Первоначальные запросы выполнялись намного быстрее, а среднее время выполнения резко ухудшалось по мере увеличения числа потоков до 35.Как я понимаю, что существует узкое место?
Конечно, я перезапущу тесты при других настройках DWU, чтобы посмотреть, влияет ли это исключительно на рабочую нагрузку small_rc.
Приложение - Пример плана запроса
<?xml version="1.0" encoding="utf-8"?>
<dsql_query number_nodes="10" number_distributions="60" number_distributions_per_node="6">
<sql>SELECT current_timestamp,COUNT(1) FROM ( SELECT GREGORIAN_DATE, WM_MONTH, MON_MULT, FRI_MULT , COUNT(1) AS _A_ROW_COUNT FROM AR_WM_VM.CALENDAR_DAY GROUP BY GREGORIAN_DATE, WM_MONTH, MON_MULT, FRI_MULT) DER</sql>
<dsql_operations total_cost="0.260568" total_number_operations="8">
<dsql_operation operation_type="RND_ID">
<identifier>TEMP_ID_21523</identifier>
</dsql_operation>
<dsql_operation operation_type="ON">
<location permanent="false" distribution="AllDistributions" />
<sql_operations>
<sql_operation type="statement">CREATE TABLE [tempdb].[dbo].[TEMP_ID_21523] ([col] DATE ) WITH(DATA_COMPRESSION=PAGE);</sql_operation>
</sql_operations>
</dsql_operation>
<dsql_operation operation_type="SHUFFLE_MOVE">
<operation_cost cost="0.258648" accumulative_cost="0.258648" average_rowsize="3" output_rows="2155.4" GroupNumber="76" />
<source_statement>SELECT [T1_1].[col] AS [col]
FROM (SELECT dateadd(dd, CAST ((364) AS INT), [T2_1].[calendar_date]) AS [col]
FROM [db_ARdev1].[AR_CORE_DIM_TABLES].[calendar_dim] AS T2_1) AS T1_1</source_statement>
<destination_table>[TEMP_ID_21523]</destination_table>
<shuffle_columns>col;</shuffle_columns>
</dsql_operation>
<dsql_operation operation_type="ON">
<location permanent="false" distribution="Control" />
<sql_operations>
<sql_operation type="statement">CREATE TABLE [tempdb].[QTables].[QTable_3ff26b5253004eec9d9ca50492bab1e2] ([col] BIGINT ) WITH(DATA_COMPRESSION=PAGE);</sql_operation>
</sql_operations>
</dsql_operation>
<dsql_operation operation_type="PARTITION_MOVE">
<operation_cost cost="0.00192" accumulative_cost="0.260568" average_rowsize="8" output_rows="1" GroupNumber="93" />
<location distribution="AllDistributions" />
<source_statement>SELECT [T1_1].[col] AS [col]
FROM (SELECT COUNT_BIG(CAST ((1) AS INT)) AS [col]
FROM (SELECT 0 AS [col]
FROM [tempdb].[dbo].[TEMP_ID_21523] AS T3_1
INNER JOIN
(SELECT CASE
WHEN ([T4_1].[wm_week_day_nbr] = CAST ((3) AS SMALLINT)) THEN CAST ((1) AS INT)
ELSE CAST ((0) AS INT)
END AS [col],
CASE
WHEN ([T4_1].[wm_week_day_nbr] = CAST ((7) AS SMALLINT)) THEN CAST ((1) AS INT)
ELSE CAST ((0) AS INT)
END AS [col1],
[T4_1].[calendar_date] AS [calendar_date],
[T4_1].[fiscal_month_nbr] AS [fiscal_month_nbr]
FROM [db_ARdev1].[AR_CORE_DIM_TABLES].[calendar_dim] AS T4_1) AS T3_2
ON ([T3_2].[calendar_date] = [T3_1].[col])
GROUP BY [T3_2].[calendar_date], [T3_2].[fiscal_month_nbr], [T3_2].[col], [T3_2].[col1]) AS T2_1
GROUP BY [T2_1].[col]) AS T1_1</source_statement>
<destination>Control</destination>
<destination_table>[QTable_3ff26b5253004eec9d9ca50492bab1e2]</destination_table>
</dsql_operation>
<dsql_operation operation_type="ON">
<location permanent="false" distribution="AllDistributions" />
<sql_operations>
<sql_operation type="statement">DROP TABLE [tempdb].[dbo].[TEMP_ID_21523]</sql_operation>
</sql_operations>
</dsql_operation>
<dsql_operation operation_type="RETURN">
<location distribution="Control" />
<select>SELECT [T1_1].[col1] AS [col],
[T1_1].[col] AS [col1]
FROM (SELECT CONVERT (INT, [T2_1].[col], 0) AS [col],
isnull(CONVERT (DATETIME, N'2016-10-03 13:04:34.203', 0), CONVERT (DATETIME, N'2016-10-03 13:04:34.203', 0)) AS [col1]
FROM (SELECT ISNULL([T3_1].[col], CONVERT (BIGINT, 0, 0)) AS [col]
FROM (SELECT SUM([T4_1].[col]) AS [col]
FROM [tempdb].[QTables].[QTable_3ff26b5253004eec9d9ca50492bab1e2] AS T4_1) AS T3_1) AS T2_1) AS T1_1</select>
</dsql_operation>
<dsql_operation operation_type="ON">
<location permanent="false" distribution="Control" />
<sql_operations>
<sql_operation type="statement">DROP TABLE [tempdb].[QTables].[QTable_3ff26b5253004eec9d9ca50492bab1e2]</sql_operation>
</sql_operations>
</dsql_operation>
</dsql_operations>
</dsql_query>