Ошибка загрузки файла сортировки базы данных 1cv7 or
Обновлено: 21.11.2024
Вы можете повысить производительность загрузки по прямому пути, предварительно отсортировав данные по индексированным столбцам. Предварительная сортировка минимизирует требования к временному хранилищу во время загрузки. Предварительная сортировка также позволяет воспользоваться преимуществами высокопроизводительных процедур сортировки, оптимизированных для вашей операционной системы или приложения.
Если данные предварительно отсортированы и существующий индекс не пуст, то предварительная сортировка минимизирует объем временного сегмента, необходимого для новых ключей. Процедура сортировки добавляет каждый новый ключ в список ключей.
Вместо дополнительного места для сортировки требуется только место для ключей. Чтобы рассчитать необходимый объем хранилища, используйте коэффициент сортировки 1,0 вместо 1,3. Дополнительные сведения об оценке требований к хранилищу см. в разделе «Требования к временному хранилищу сегментов» .
Если указана предварительная сортировка и существующий индекс пуст, достигается максимальная эффективность. Новые ключи просто вставляются в индекс. Вместо временного сегмента и нового индекса, существующих одновременно с пустым старым индексом, существует только новый индекс. Таким образом, временное хранилище не требуется, а время экономится.
Отсортированные индексы
Предложение SORTED INDEXES определяет индексы, по которым предварительно сортируются данные. Это предложение разрешено только для загрузки прямого пути. В качестве примера см. тематическое исследование 6, Загрузка данных с использованием метода загрузки прямого пути. (См. «Примеры использования SQL*Loader» для получения информации о том, как получить доступ к примерам использования.)
Как правило, вы указываете только один индекс в предложении SORTED INDEXES, потому что данные, отсортированные для одного индекса, обычно не находятся в правильном порядке для другого индекса. Однако если данные расположены в одном и том же порядке для нескольких индексов, все индексы можно указать одновременно.
Все индексы, перечисленные в предложении SORTED INDEXES, должны быть созданы до того, как вы начнете загрузку по прямому пути.
Несортированные данные
Если вы укажете индекс в предложении SORTED INDEXES, а данные для этого индекса не отсортированы, то в конце загрузки индекс останется в состоянии Index Unusable. Данные присутствуют, но любая попытка использовать индекс приводит к ошибке. Любой индекс, оставшийся в состоянии Index Unusable, должен быть перестроен после загрузки.
Многостолбцовые индексы
Если вы укажете многостолбцовый индекс в предложении SORTED INDEXES, то данные должны быть отсортированы так, чтобы они располагались сначала в первом столбце индекса, затем во втором столбце индекса и т. д.
Например, если в первом столбце индекса указан город, а во втором — фамилия; затем данные должны быть упорядочены по названию внутри каждого города, как в следующем списке:
Выбор наилучшего порядка сортировки
Для достижения наилучшей общей производительности загрузки по прямому пути следует выполнить предварительную сортировку данных на основе индекса, для которого требуется больше всего места для временного сегмента. Например, если первичный ключ представляет собой один числовой столбец, а вторичный ключ состоит из трех текстовых столбцов, то вы можете минимизировать как время сортировки, так и требования к объему хранилища, выполнив предварительную сортировку по вторичному ключу.
Мы рекомендуем создавать таблицы с помощью SORTKEY AUTO . В этом случае Amazon Redshift использует автоматическую оптимизацию таблицы для выбора ключа сортировки. Дополнительные сведения см. в разделе Работа с автоматической оптимизацией таблицы. В оставшейся части этого раздела содержится подробная информация о порядке сортировки.
При создании таблицы вы также можете определить один или несколько ее столбцов в качестве ключей сортировки. Когда данные изначально загружаются в пустую таблицу, строки сохраняются на диске в отсортированном порядке. Информация о столбцах ключа сортировки передается планировщику запросов, и планировщик использует эту информацию для построения планов, использующих способ сортировки данных. Дополнительные сведения см. в разделе СОЗДАНИЕ ТАБЛИЦЫ.
Сортировка позволяет эффективно обрабатывать предикаты с ограниченным диапазоном. Amazon Redshift хранит столбцовые данные блоками по 1 МБ на диске. Минимальное и максимальное значения для каждого блока хранятся как часть метаданных. Если в запросе используется предикат с ограничением диапазона, обработчик запросов может использовать минимальное и максимальное значения для быстрого пропуска большого количества блоков во время сканирования таблицы. Например, предположим, что в таблице хранятся данные за пять лет, отсортированные по дате, а запрос указывает диапазон дат в один месяц. В этом случае вы можете исключить из проверки до 98 процентов дисковых блоков. Если данные не отсортированы, необходимо просканировать больше блоков диска (возможно, все).
Можно указать составной или чередующийся ключ сортировки. Составной ключ сортировки более эффективен, если предикаты запроса используют префикс, который представляет собой подмножество столбцов ключа сортировки по порядку. Ключ сортировки с чередованием придает равный вес каждому столбцу в ключе сортировки, поэтому предикаты запроса могут использовать любое подмножество столбцов, составляющих ключ сортировки, в любом порядке.
Чтобы понять влияние выбранного ключа сортировки на производительность запроса, используйте команду EXPLAIN.Дополнительные сведения см. в разделе Рабочий процесс планирования и выполнения запросов.
Чтобы определить тип сортировки, используйте ключевое слово INTERLEAVED или COMPOUND с оператором CREATE TABLE или CREATE TABLE AS. Значение по умолчанию — СОЕДИНЕНИЕ. COMPOUND по умолчанию рекомендуется, если ваши таблицы не обновляются регулярно с помощью INSERT, UPDATE или DELETE. Ключ сортировки INTERLEAVED может использовать максимум восемь столбцов. В зависимости от ваших данных и размера кластера VACUUM REINDEX занимает значительно больше времени, чем VACUUM FULL, потому что он делает дополнительный проход для анализа чередующихся ключей сортировки. Операция сортировки и слияния может занять больше времени для таблиц с чередованием, поскольку при сортировке с чередованием может потребоваться изменить порядок большего количества строк, чем при составной сортировке.
Чтобы просмотреть ключи сортировки для таблицы, запросите системное представление SVV_TABLE_INFO.
Темы
Составной ключ сортировки
Составной ключ состоит из всех столбцов, перечисленных в определении ключа сортировки, в том порядке, в котором они перечислены. Составной ключ сортировки наиболее полезен, когда фильтр запроса применяет условия, такие как фильтры и соединения, которые используют префикс ключей сортировки. Преимущества составной сортировки в производительности уменьшаются, когда запросы зависят только от вторичных столбцов сортировки без ссылки на первичные столбцы. COMPOUND – это тип сортировки по умолчанию.
Ключи составной сортировки могут ускорить объединение, операции GROUP BY и ORDER BY, а также оконные функции, использующие PARTITION BY и ORDER BY. Например, объединение слиянием, которое часто выполняется быстрее, чем хэш-соединение, возможно, когда данные распределены и предварительно отсортированы по соединяемым столбцам. Составные ключи сортировки также помогают улучшить сжатие.
По мере добавления строк в отсортированную таблицу, которая уже содержит данные, несортированная область увеличивается, что существенно влияет на производительность. Эффект больше, когда в таблице используется сортировка с чередованием, особенно когда столбцы сортировки включают данные, которые монотонно увеличиваются, например столбцы даты или метки времени. Следует регулярно запускать операцию VACUUM, особенно после загрузки больших объемов данных, для повторной сортировки и повторного анализа данных. Дополнительные сведения см. в разделе Управление размером несортированной области. После очистки данных рекомендуется выполнить команду ANALYZE, чтобы обновить статистические метаданные для планировщика запросов. Дополнительные сведения см. в разделе Анализ таблиц.
Ключ чередующейся сортировки
При сортировке с чередованием каждому столбцу или подмножеству столбцов в ключе сортировки присваивается одинаковый вес. Если в нескольких запросах используются разные столбцы для фильтров, вы часто можете повысить производительность этих запросов, используя стиль сортировки с чередованием. Когда в запросе используются ограничительные предикаты для вторичных столбцов сортировки, сортировка с чередованием значительно повышает производительность запроса по сравнению с составной сортировкой.
Не используйте ключ сортировки с чередованием для столбцов с монотонно возрастающими атрибутами, такими как столбцы идентификаторов, даты или временные метки.
Улучшение производительности, которое вы получите за счет внедрения ключа сортировки с чередованием, следует сопоставлять с увеличением времени загрузки и очистки.
Сортировка с чередованием наиболее эффективна при высокоселективных запросах, фильтрующих по одному или нескольким столбцам ключа сортировки в предложении WHERE, например, select c_name from customer where c_region = 'ASIA' . Преимущества сортировки с чередованием увеличиваются с увеличением количества отсортированных столбцов, для которых есть ограничения.
Сортировка с чередованием более эффективна для больших таблиц. Сортировка применяется к каждому срезу. Таким образом, сортировка с чередованием наиболее эффективна, когда таблица достаточно велика, чтобы на срез приходилось несколько блоков размером 1 МБ. Здесь обработчик запросов может пропустить значительную часть блоков, используя ограничительные предикаты. Чтобы просмотреть количество блоков, используемых таблицей, запросите системное представление STV_BLOCKLIST.
При сортировке по одному столбцу сортировка с чередованием может обеспечить более высокую производительность, чем составная сортировка, если значения столбцов имеют длинный общий префикс. Например, URL-адреса обычно начинаются с «http://www». Составные ключи сортировки используют ограниченное количество символов из префикса, что приводит к большому количеству дублирований ключей. Сортировка с чередованием использует внутреннюю схему сжатия для значений сопоставления зон, что позволяет лучше различать значения столбцов с длинным общим префиксом.
ВАКУУМНАЯ ПЕРЕИНДЕКСАЦИЯ
При добавлении строк в отсортированную таблицу, которая уже содержит данные, производительность со временем может снизиться. Это ухудшение происходит как для составных, так и для чередующихся сортировок, но сильнее влияет на чередующиеся таблицы. VACUUM восстанавливает порядок сортировки, но для таблиц с чередованием эта операция может занять больше времени, поскольку объединение новых данных с чередованием может потребовать изменения каждого блока данных.
При первоначальной загрузке таблиц Amazon Redshift анализирует распределение значений в столбцах ключей сортировки и использует эту информацию для оптимального чередования столбцов ключей сортировки.По мере роста таблицы распределение значений в столбцах ключа сортировки может меняться или искажаться, особенно в столбцах даты или отметки времени. Если перекос становится слишком большим, это может повлиять на производительность. Чтобы повторно проанализировать ключи сортировки и восстановить производительность, запустите команду VACUUM с ключевым словом REINDEX. Поскольку требуется дополнительный анализ данных, VACUUM REINDEX может занять больше времени, чем стандартная VACUUM для чередующихся таблиц. Чтобы просмотреть информацию об искажении распределения ключей и времени последней переиндексации, запросите системное представление SVV_INTERLEAVED_COLUMNS.
Дополнительную информацию о том, как определить, как часто запускать VACUUM и когда запускать VACUUM REINDEX, см. в разделе Решение о переиндексации.
Теперь мы не можем просто загрузить все в коллекцию и использовать механизм сортировки. Это съест всю память, и программа получит ошибку кучи.
В таком случае как бы вы отсортировали записи/строки в файле?
Есть ли причина, по которой вы не можете использовать систему баз данных? Базы данных созданы для таких сценариев, потому что они очень эффективны при сортировке больших объемов данных.
@Erika: чем внедрение облегченной неустановленной базы данных отличается от внедрения написанной на заказ программы, которая делает все, что вы хотите, но не так хорошо протестирована? И то, и другое технически «меняет систему».
Попробуйте передать это руководителю, который ни хрена не понимает в программировании. Если ты сможешь продать его ему, ты мой наставник!
14 ответов 14
Похоже, вы ищете внешнюю сортировку.
По сути, вы сначала сортируете небольшие фрагменты данных, записываете их обратно на диск, а затем перебираете их, чтобы отсортировать все.
Из моего исследования я понял, что если у вас есть 1000 записей в файле и вы читаете 100 за раз, отсортируйте эти 100 и поместите отсортированную версию во временный файл, который создаст 10 временных отсортированных файлов. Затем последовательно прочитайте два файла и создайте еще один отсортированный (теперь уже больший) файл и удалите два других, которые только что были прочитаны. Продолжайте, пока у вас не будет одного файла. СЕРЬЕЗНО? Теперь предположим, что у вас есть 10 миллионов записей в файле, и вы читаете 5000 за раз, сколько временных файлов вы создали и сколько времени вам потребуется, чтобы получить окончательную версию?
Внешняя сортировка всегда медленнее по сравнению с сортировкой в памяти, но вы больше не ограничены оперативной памятью. если для вас важна скорость и у вас есть несколько машин под рукой, взгляните на hadoop (упомянутый в других ответах). Он выполняет внешнюю сортировку, при которой все отдельные операции сортировки могут выполняться на многих компьютерах параллельно.
Эрика: Когда вы объединяете файлы (отсортированные, меньшего размера), у вас может быть более двух открытых файлов, просто немного проще описать алгоритм, используя всего два временных файла. Но, если вам нужен файл, размер которого больше, чем отсортированная доступная память, вам все равно придется (в конечном итоге) сделать это таким образом, и операция слияния будет (относительно) быстрой, так как все, что ей нужно сделать, это держать N файловых указателей открытыми и найдите наименьшую из N «следующих записей», чтобы узнать, что следует испускать дальше. Я предполагаю, что критически важной частью настройки является выбор количества записей для хранения в каждом временном файле.
Вы можете читать файлы небольшими частями, сортировать их и записывать во временные файлы. Затем вы снова последовательно читаете два из них и объединяете их в больший временный файл и так далее. Если остался только один, ваш файл отсортирован. По сути, это алгоритм Megresort, применяемый к внешним файлам. Он достаточно хорошо масштабируется с файлами произвольного размера, но вызывает дополнительный файловый ввод-вывод.
Правка: если у вас есть некоторое представление о вероятном отклонении строк в ваших файлах, вы можете использовать более эффективный алгоритм (сортировка по распределению). Упрощенно, вы должны прочитать исходный файл один раз и записать каждую строку во временный файл, который принимает только строки с одним и тем же первым символом (или определенным диапазоном первых символов). Затем вы перебираете все (теперь небольшие) временные файлы в порядке возрастания, сортируете их в памяти и добавляете непосредственно в выходной файл. Если временный файл окажется слишком большим для сортировки в памяти, вы можете повторить тот же процесс для этого, основываясь на 2-м символе в строках и так далее. Таким образом, если ваше первое разбиение было достаточно хорошим для создания достаточно маленьких файлов, вы будете иметь только 100% накладных расходов на ввод-вывод независимо от размера файла, но в худшем случае они могут стать намного больше, чем при стабильной сортировке слиянием с точки зрения производительности.
Из моего исследования я понял, что если у вас есть 1000 записей в файле и вы читаете 100 за раз, отсортируйте эти 100 и поместите отсортированную версию во временный файл, который создаст 10 временных отсортированных файлов. Затем последовательно прочитайте два файла и создайте еще один отсортированный (теперь уже больший) файл и удалите два других, которые только что были прочитаны. Продолжайте, пока у вас не будет одного файла. СЕРЬЕЗНО? Теперь предположим, что у вас есть 10 миллионов записей в файле, и вы читаете 5000 за раз, сколько временных файлов вы создали и сколько времени вам потребуется, чтобы получить окончательную версию?
Вы выполняете слияние, беря два самых маленьких временных файла и объединяя их в один временный файл большего размера. Это вызывает в log2(n) раз больше операций файлового ввода-вывода, чем сортировка всего в памяти (n — это количество временных файлов, с которых вы начали). Таким образом, для 8 частей в начале это будет 300 % накладных расходов на ввод-вывод, а для 128 частей — 700 %.
Это метод монгоша. Это не документация по Node.js или другим методам драйвера, специфичным для языка программирования.
В большинстве случаев методы mongosh работают так же, как устаревшие методы оболочки mongo. Однако некоторые устаревшие методы недоступны в mongosh .
Документацию по устаревшей оболочке mongo см. в документации по соответствующему выпуску сервера MongoDB:
Драйверы MongoDB API см. в документации по драйверам MongoDB для конкретного языка.
Указывает порядок, в котором запрос возвращает совпадающие документы. Вы должны применить sort() к курсору перед извлечением каких-либо документов из базы данных.
Метод sort() имеет следующий параметр:
Параметр sort содержит пары полей и значений в следующей форме:
Поведение
Ограничения
Можно сортировать не более чем по 32 ключам.
Последовательность сортировки
Изменено в версии 4.4.
MongoDB не хранит документы в коллекции в определенном порядке. При сортировке по полю, содержащему повторяющиеся значения, документы, содержащие эти значения, могут быть возвращены в любом порядке.
Если требуется постоянный порядок сортировки, включите в сортировку хотя бы одно поле, содержащее уникальные значения. Самый простой способ гарантировать это — включить поле _id в запрос сортировки.
Рассмотрите следующую коллекцию ресторанов:
Следующая команда использует метод sort() для сортировки по полю района:
В этом примере порядок сортировки может быть несогласованным, так как поле района содержит повторяющиеся значения как для Манхэттена, так и для Бруклина. Документы возвращаются в алфавитном порядке по району , но порядок этих документов с повторяющимися значениями для района может не совпадать при многократном выполнении одного и того же вида. Например, вот результаты двух разных исполнений вышеуказанной команды:
Хотя значения для района по-прежнему сортируются в алфавитном порядке, порядок документов, содержащих повторяющиеся значения для района (например, Манхэттен и Бруклин ), отличается.
Чтобы добиться непротиворечивой сортировки, добавьте в сортировку поле, содержащее исключительно уникальные значения. Следующая команда использует метод sort() для сортировки как по полю района, так и по полю _id:
Поскольку поле _id всегда содержит исключительно уникальные значения, возвращаемый порядок сортировки всегда будет одинаковым при многократном выполнении одной и той же сортировки.
Сортировка по возрастанию/убыванию
Укажите в параметре sort поле или поля для сортировки и значение 1 или -1, чтобы задать сортировку по возрастанию или по убыванию соответственно.
Следующая операция сортирует документы сначала по полю возраста в порядке убывания, а затем по полю сообщений в порядке возрастания:
При сравнении значений разных типов BSON MongoDB использует следующий порядок сравнения, от меньшего к большему:
- MinKey (внутренний тип)
- Нет
- Числа (целые, длинные, двойные, десятичные)
- Символ, строка
- Объект
- Массив
- Бинданные
- Идентификатор объекта
- логическое значение
- Дата
- Отметка времени
- Регулярное выражение
- MaxKey (внутренний тип)
Подробнее о порядке сравнения/сортировки для определенных типов см. в разделе Сравнение/порядок сортировки.
Сортировка метаданных оценки текста
Для поиска $text вы можете сортировать по убыванию оценки релевантности с помощью выражения.
В следующем образце документа указана сортировка по убыванию метаданных textScore:
Метаданные textScore сортируются в порядке убывания.
Дополнительную информацию см. в разделе $meta.
Сортировка и индексирование
MongoDB может получать результаты операции сортировки из индекса, включающего поля сортировки. MongoDB может использовать несколько индексов для поддержки операции сортировки, если сортировка использует те же индексы, что и предикат запроса.
Если MongoDB не может использовать индекс или индексы для получения порядка сортировки, MongoDB должна выполнить операцию блокирующей сортировки данных. Блокирующая сортировка указывает, что MongoDB должна использовать и обрабатывать все входные документы для сортировки, прежде чем возвращать результаты. Блокирующие сортировки не блокируют одновременные операции над коллекцией или базой данных.
Операции сортировки, использующие индекс, часто имеют более высокую производительность, чем блокирующие сортировки. Дополнительные сведения о создании индексов для поддержки операций сортировки см. в разделе Использование индексов для сортировки результатов запроса.
Если MongoDB требует использования более 100 мегабайт системной памяти для операции сортировки с блокировкой, MongoDB возвращает ошибку, если в запросе не указан cursor.allowDiskUse() (Новое в MongoDB 4.4 эм>). allowDiskUse() позволяет MongoDB использовать временные файлы на диске для хранения данных, превышающих лимит системной памяти в 100 мегабайт, при обработке операции блокирующей сортировки.
Чтобы проверить, должна ли MongoDB выполнять сортировку с блокировкой, добавьте к запросу cursor.explain() и проверьте результаты объяснения. Если план запроса содержит этап SORT, то MongoDB должна выполнить операцию блокирующей сортировки с учетом ограничения памяти в 100 МБ.
Начиная с версии 3.2 оператор $orderby устарел в mongosh. В mongosh используйте вместо этого cursor.sort().
Операция $orderby сортирует результаты запроса в порядке возрастания или убывания.
Вы также можете указать параметр в любой из следующих форм:
Эти примеры возвращают все документы в названной коллекции, отсортированные по полю возраста в порядке убывания. Укажите отрицательное значение $orderby (например, -1 , как указано выше) для сортировки в порядке убывания или положительное значение (например, 1 ) для сортировки в порядке возрастания.
Поведение
Поскольку индексы содержат упорядоченные записи, MongoDB может получать результаты сортировки из индекса, включающего поля сортировки. MongoDB может использовать несколько индексов для поддержки операции сортировки, если сортировка использует те же индексы, что и предикат запроса.
Если MongoDB не может использовать индекс или индексы для получения порядка сортировки, MongoDB должна выполнить операцию блокирующей сортировки данных. Блокирующая сортировка указывает, что MongoDB должна использовать и обрабатывать все входные документы для сортировки, прежде чем возвращать результаты. Блокирующие сортировки не блокируют одновременные операции над коллекцией или базой данных.
Операции сортировки, использующие индекс, часто имеют более высокую производительность, чем блокирующие сортировки. Дополнительные сведения о создании индексов для поддержки операций сортировки см. в разделе Использование индексов для сортировки результатов запроса.
Если MongoDB требует использования более 100 мегабайт системной памяти для операции сортировки с блокировкой, MongoDB возвращает ошибку, если в запросе не указан cursor.allowDiskUse() (Новое в MongoDB 4.4 эм>). allowDiskUse() позволяет MongoDB использовать временные файлы на диске для хранения данных, превышающих лимит системной памяти в 100 мегабайт, при обработке операции блокирующей сортировки.
Чтобы избежать этой ошибки, создайте индекс для поддержки операции сортировки или используйте $orderby в сочетании с cursor.maxTimeMS() и/или cursor.limit() . Курсор.limit() увеличивает скорость и уменьшает объем памяти, необходимый для возврата этого запроса, с помощью оптимизированного алгоритма. Указанное ограничение должно привести к тому, что количество документов не превысит ограничение в 100 мегабайт.
Читайте также: