2016-03-03 3 views
0

Я выполняю ниже запросы, но один запрос дает мне результат, а другой дает мне [Ошибка 2646] [SQLState HY000] Больше нет spool space в USER.запрос получает spool в teradata

SELECT DISTINCT PARTITION 
    FROM DB.TABLE 
    ORDER BY PARTITION ASC; 

Error:-[Error 2646] [SQLState HY000] No more spool space in USER. 

Но когда я уверен, выполнение он дает мне результаты: -

select * from (
SELECT DISTINCT PARTITION 
    FROM DB."TABLE") x 
    ORDER BY X.PARTITION ASC; 

ответ

3

оптимизатора Teradata обычно проверяет, если DISTINCT можно переписать с помощью GROUP BY (и наоборот).

В вашем запросе 1 это выбрать отчетливое обработки (что перераспределение следует рода) из-за ORDER BY (конечно, это глупо).

Производные таблицы с использованием DISTINCT не будут размотаны, то есть оптимизатор материализует его. Без DISTINCT он применяет агрегированную перезапись, которая делает AMP-локальную агрегацию как 1-й шаг, значительно уменьшая использование катушки.

Если добавить COUNT(*) на # 1 не будет намотать и вернуть полезную информацию :)

С другой стороны, если бы я хотел знать о разделах с данными, которые я бы запрашивать dbc.Stats ...

+0

@dnoeth ... Большое спасибо за вашу ценную информацию. Фактически первый запрос был создан TDCH (соединитель Teradata для hadoop), поэтому я выполнил второй запрос, чтобы проверить, работает ли он или нет. Моя таблица огромна, MVC сжимает один с 240 ГБ данными. Я не могу запрашивать статистику, поскольку запрос генерируется и выполняется TDCH внутренне. Однако я понял, что во втором случае будут проверены первые отдельные разделы, а затем упорядочены, чтобы избежать перераспределения данных, правильно? –

+0

@anwaar_hell: Yep, DISTINCT перераспределяет все строки перед устранением дубликатов, в то время как GROUP BY удаляет дубликаты перед перераспределением. – dnoeth

Смежные вопросы