Запуск SUM по большому количеству строк - PullRequest
4 голосов
/ 20 июня 2019

У меня есть теоретический вопрос, касающийся функции SQL SUM ().

Представьте, что у нас есть таблица, которая содержит столбец с именем "value"

«значение» - ДЕСЯТИЧНОЕ число, положительное или отрицательное.

В нашем потенциальном решении мы хотели бы запустить SUM () по всем строкам для столбца «значение»

SELECT SUM(value) 
FROM table

Пока проблем нет, но набор данных потенциально состоит из миллионов строк. Возможно, даже сотни миллионов строк данных будут храниться годами.

Итак, мои вопросы:

  1. Можете ли вы запустить SUM () для сотен миллионов строк?
  2. Какую производительность можно ожидать для запроса в таком количестве строк? Мы не решили, но смотрим на использование MySQL или SQL Server.

Ответы [ 3 ]

2 голосов
/ 20 июня 2019

Вы можете взглянуть на хранилище столбцов в SQL Server. Короче говоря, вы можете создать индекс хранилища столбцов для ваших таблиц - в отличие от традиционного индекса хранилища строк.

Эти индексы специально разработаны для оптимизации агрегированных запросов, когда задействован огромный объем данных (например, как в схемах хранилища данных star и snowflake).

Из документов :

Индексы Columnstore могут повысить производительность до 100 раз аналитика и работа с хранилищами данных и до 10 раз лучше данных сжатие, чем традиционные индексы rowstore

, потому что:

  • Сжатие данных - вы можете получить много преимуществ здесь; например, индексы columnstore считывают сжатые данные с диска, а это означает, что в память необходимо прочитать меньше байтов данных;
  • Устранение столбцов - индексы columnstore пропускают чтение в столбцах, которые не требуются для результата запроса, и еще больше сокращают число операций ввода-вывода для выполнения запроса и, следовательно, повышают производительность запроса (не так, как индексы хранилища строк)
  • Устранение группы строк - оптимизируйте сканирование таблиц с использованием метаданных, чтобы исключить определенные группы строк на основе ваших критериев фильтрации;
  • Выполнение в пакетном режиме - до SQL Server 2019 только запросы, включающие такие индексы, могут получить выгоду от обработки batch mode, которая еще больше сократит ваше время выполнения (посмотрите это видео , чтобы увидеть, насколько хорош этот режим )
1 голос
/ 20 июня 2019

Вы, конечно, можете запустить SUM() по всей таблице, и производительность будет примерно зависеть от количества записей в этой таблице.Обратите внимание, что такие вещи, как индексы, в этом случае не сильно повлияют на производительность, поскольку SQL Server должен касаться каждой записи, чтобы вычислить сумму.

Если выполнение SUM на всей таблице в производственной среде может плохо масштабироваться, тоОдним из вариантов для рассмотрения будет сохранение суммы в отдельной таблице.Затем, когда запись вставляется или удаляется, вы можете использовать триггер для надлежащего обновления промежуточного итога.Таким образом, доступ к сумме будет примерно постоянным временем, хотя у вас будут дополнительные издержки из-за логики триггера.

0 голосов
/ 23 июня 2019

Я выкину пару идей. Если наборы данных, с которыми вы работаете, абсолютно массивны, рассмотрите возможность выполнения задания на ночь, чтобы создать представление или какую-либо временную таблицу, и обращайтесь к этому агрегированному блоку данных, когда вы входите в офис утром. Или перенесите все в облако, например, в Azure Databricks, и запустите эти задания в Spark. Spark работает быстро и работает параллельно, поэтому все выполняется очень быстро. Удачи.

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