Быстрая COUNT (*) с большим количеством строк - PullRequest
2 голосов
/ 18 мая 2019

У меня есть набор таблиц с большими наборами строк (например, миллиарды строк), и мне нужно получить количество строк между двумя значениями параметров и установить два значения из результата;У меня COUNT(*) в настоящее время.

Это будет выполнено несколько тысяч раз для одной и той же таблицы с различными значениями, переданными для сравнения как часть более крупного запроса, где изменяются входные параметры и количество строк в общей таблице изменяется на несколько сотен тысяч илидаже миллион строк по мере увеличения таблицы.

Может быть несколько (4-5) одинаковых запросов к одной и той же таблице одновременно, но с разными значениями параметров.Столбец сравниваемого значения индексируется и является одним первичным ключом в некоторых таблицах, но в других он может быть частью составного первичного ключа.Возвращаемое количество в большинстве случаев будет варьироваться от 500 000 до 1 000 000.

Существует ли более быстрый способ получения и использования значений счетчика из изменяющегося диапазона?

Важно, что это НЕ для всей таблицы, но для диапазона в таблице , поэтому такие вещи, как sp_spaceused, невозможны.

SELECT 
    @newOUT = COUNT(*) , 
    @RightValueOUT = COUNT(*)
FROM mydatabase.myschema.myidcolumn
WHERE 
    myidcolumn >= @MinRowValue
    AND myidcolumn <= @MaxRowValue

Ответы [ 2 ]

2 голосов
/ 18 мая 2019

Я могу придумать два варианта для такой ситуации.

Во-первых, когда сравниваемый идентификатор является частью составного первичного ключа, то убедитесь, что используемый идентификатор является первым введите первичный ключ.Если вам нужно выполнить сравнение по нескольким ключам, то используйте вторичный индекс для каждого подключа.

Во-вторых, если это только таблицы insert с возрастающими первичными ключами, вы можете вставить кумулятивный счет вкаждый шаг.Это требует триггера или другой логики на вставке.

Тогда вы можете получить счетчик, просмотрев экстремальные значения.Это два поиска, а не сканирование индекса.

1 голос
/ 18 мая 2019

Количество запросов может быть сложно оптимизировать, потому что операция COUNT(*) включает в себя касание каждой записи в области для подсчета. Но мы можем попробовать индексировать myidcolumn, который появляется в предложении WHERE, в надежде, что он ограничительный:

CREATE INDEX idx ON yourTable (myidcolumn);

Если SQL Server использует индекс, он может выполнить одно сканирование индекса для генерации счетчика.

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