Мы можем использовать lag
и fill
из tidyverse
library(tidyverse)
df %>%
mutate(b1 = replace(a, a < lag(a), NA)) %>%
fill(b1)
# a b b1
# <dbl> <dbl> <dbl>
#1 1 1 1
#2 2 2 2
#3 3 3 3
#4 4 4 4
#5 3 4 4
#6 2 4 4
#7 5 5 5
#8 6 6 6
#9 9 9 9
. Логика заключается в том, что мы заменяем значения в a
на NA
, где предыдущее значение больше следующего а затем используйте fill
для замены этих NA
на последнее значение, отличное от NA.
Я соглашаюсь с другими ответами, что необходимо посмотреть схему и индексы прежде, чем обратиться к sharding. 10 миллионов строк хорошо в возможностях любого из главных механизмов базы данных.
Однако, если Вы хотите некоторые ресурсы для приобретения знаний о предмете sharding, затем пробуют их:
10 миллионов строк являются действительно не большими в терминах DBMS, и я сначала посмотрел бы на свою индексацию и планы запросов прежде, чем начать планировать физическое распределение данных с черепками или разделами, которые не должны действительно быть необходимыми, пока Ваша таблица не выросла на несколько порядков величины.
Все, по моему скромному мнению, конечно.
Я соглашаюсь с наблюдением Mike Woodhouse, что текущий размер не должен быть проблемой - и корреспондент соглашается.
Большая часть коммерческого DBMS оказывает поддержку для фрагментированных таблиц в некоторых для или другом под одним именем или несколькими другими. Один из ключевых вопросов - существует ли разумный способ разделить данные на фрагменты. Один распространенный способ состоит в том, чтобы сделать так на основе даты, таким образом, все значения на, скажем, ноябрь 2008 входят в один фрагмент, значения на октябрь 2008 в другого и так далее. Это имеет преимущества, когда это прибывает время для удаления старых данных. Можно, вероятно, отбросить фрагмент, содержащий данные с октября 2001 (хранение данных семи лет), не влияя на другие фрагменты. Этот вид фрагментации может также помочь с 'устранением фрагмента'; если запрос ясно не может должен быть считывать данные с данного фрагмента, то это оставят непрочитанным, который может дать Вам великолепный выигрыш в производительности. (Например, если оптимизатор будет знать, что запрос для даты в октябре 2008, то это проигнорирует все фрагменты кроме того, который содержит данные с октября 2008.)
Существуют другие методы фрагментации - циклический алгоритм распределяет загрузку через несколько дисков, но означает, что Вы не можете извлечь выгоду из устранения фрагмента.
По моему опыту, большие таблицы всегда поражают Вас в сторону ввода-вывода. Самое дешевое решение состоит в том, чтобы добавить достаточно многостолбцовых индексов так, чтобы все Ваши запросы могли получить данные непосредственно из индекса, не имея необходимость загружать основные страницы данных. Это делает Ваши вставки и обновляет более интенсивно использующий средства ввода-вывода, но это может быть в порядке. Следующая легкая опция это истратило RAM в Вашем сервере. Никакая причина иметь меньше чем 32 ГБ, если Ваша база данных является большой. Но в конце Вы все еще найдете себя вводом-выводом связанный, и Вы будете смотреть на покупку большого количества жестких дисков и поддержания сложной схемы выделения разделов, которая стоит состояния между аппаратными средствами и работой. Я надеюсь, что существует лучшая альтернатива в эти дни - перемещают базу данных от вращения жестких дисков к твердотельным накопителям SLC - это должно сделать Ваши случайные чтения и пишет в сто раз быстрее, чем вершина строки диски SAS, и удалите узкое место ввода-вывода. SSD запускаются на уровне 10$ за гигабайт, таким образом, Вы собираетесь потратить некоторых главных, но это еще намного более дешево, чем SAN и т.д.