Чтение (даже объединение) очень большой таблицы (1,1 млрд строк) в Руководстве по предприятиям от Teradata

Надеюсь, вы, ребята, можете помочь с тем, что, я надеюсь, довольно простой вопрос для тех, кто в курсе!

Я живу (ну, работаю) в SAS Enterprise Guide и пытаюсь выполнить простое левое соединение с таблицей в Teradata.

Таблица очень большая (700+ столбцов, 1,1 млрд строк), и до сих пор я подключался с помощью оператора LIBNAME в верхней части моей программы, за которым следовал обычный PROC SQL для чтения данных.

Проблема, которую я имею, состоит в том, что это чрезвычайно медленно. Я успешно выполнил объединение, используя 90 строк в левой таблице, и это заняло 3 часа. Реальная таблица, которую я хочу использовать, имеет примерно 15 000 строк.

Я пытался подключиться с помощью метода SQL Pass-Through, но при этом выдается ошибка файла hosts, которую я не могу исправить из-за корпоративных ограничений безопасности.

У кого-нибудь был опыт выполнения такого рода задач?

Я должен отметить, что я могу выполнить простой запрос select * в Teradata SQL Assistant чуть более 1 минуты (16666666 об / с!), Поэтому ограничение должно быть где-то между SAS/Teradata или даже самим SAS.

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

Заранее спасибо за помощь.

2 ответа

Таким образом, вы присоединяете набор данных SAS к таблице Teradata и хотите вернуть соответствующие записи. Вы захотите использовать опцию DBASAS = набор данных SAS. Он обозначает, какой из таблиц больше. Говоря SAS об этом, он знает, какой стол перемещать.

Здесь я предполагаю, что librefs уже назначены, и что таблица Teradata больше - больше obs - чем набор данных SAS.

proc sql threads; выберите tdTable.* из sastables.sasTable1, td.tdTable(dbmaster=yes), где tdTable.idNum = sasTable1.idNum; уволиться;

Если случайно ваш набор данных SAS больше, вы можете использовать опцию MULTI_DATASRC_OPT=. Либо Google эти условия или посмотрите в руководстве SAS / Доступ к реляционным базам данных. Это очень хорошо.

Удачи.

Рассматривали ли вы создание изменчивой таблицы в Teradata? Поскольку это создается при распределении катушек, вам не нужны явные разрешения для создания таблицы. После создания вы можете загрузить набор данных SAS в таблицу Volatile и собрать статистику по столбцам соединения таблицы и столбцам фильтра. Это поможет оптимизатору понять демографию вашего "маленького" стола. Изменчивая таблица будет сохраняться только в течение вашего сеанса и будет недоступна в течение нескольких сеансов.

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

CREATE VOLATILE TABLE MyTable, NO FALLBACK
( ColA SMALLINT NOT NULL,
  ColB VARCHAR(10) NOT NULL
) PRIMARY INDEX (ColA)
ON COMMIT PRESERVE ROWS /* This is important */
;

Основной индекс - это то, как Teradata распределяет данные и получает к ним доступ. Таблицы, расположенные в одном и том же столбце, присоединяются к "AMP local" и не требуют перераспределения. Это не всегда возможно, так как при выборе основного индекса необходимо учитывать как распределение, так и путь доступа. Первичный индекс не должен быть уникальным, но может быть.

Надеюсь это поможет.

Другие вопросы по тегам