2016-12-20 2 views
0

У меня есть четыре таблицы. Каждая таблица имеет только один столбец с 32768 строк, как:Не удалось выделить память: как объединить четыре набора результатов в одну таблицу

|calculated| 
|2.45644534| 
|3.23323567| 
[...] 

Теперь я хочу, чтобы объединить эти четыре результата/таблицы в одну таблицу с четырьмя колоннами, как:

|calc1|calc2|calc3|calc4| 
[values] 

Там нет идентификаторов или что-то еще, чтобы идентифицировать уникальные строки. Это мой запрос:

SELECT A.*, B.*, C.*, D.* 
    FROM 
     (
      SELECT * FROM :REAL_RESULT 
     ) AS A 
    JOIN 
     (
      SELECT * FROM :PHASE_RESULT 
     ) AS B 
    ON 1=1 
    JOIN 
     (
      SELECT * FROM :AMPLITUDE_RESULT 
     ) AS C 
    ON 1=1 [...] 

Теперь сервер бросает эту ошибку:

Error: (dberror) 2048 - column store error: search table error: "TEST"."data::fourier": line 58 col 4 (at pos 1655): [2048] (range 3): column store error: search table error: [9] Memory allocation failed

Что я могу сделать сейчас? Есть ли другие варианты? Благодаря!

+0

Начните с добавления столбцов для использования в качестве идентификаторов .... Это приводит к множеству проблем. 'Просто сделайте это!' ** Сделайте это сейчас! **;) –

+0

@CraigYoung хорошо ... ладно .. это прекрасно работает. Спасибо .. Если вы хотите заработать несколько очков, добавьте это как ответ ... просто сделайте это;) – Tobias

+0

:) Ну, это на самом деле не отвечало на ваш вопрос; рад, что он подтолкнул вас на пути. К сожалению, я сейчас ухожу; поэтому нет. –

ответ

0

то, что вы делаете в своем исходном коде, фактически является крест-соединением на четырех таблицах, каждый из которых содержит 2^15 строк. Размер результата будет содержать 2^60 строк, довольно много петабайт ... Вот почему OOM. Я использовал аналогичный пример, чтобы показать коллегам, что может произойти при объединении больших таблиц с неправильным условием объединения. Кроме того, SQL устанавливается на основе, и ваши строки не имеют никакого естественного порядка.

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

Чистым решением является предложение, предложенное Крейгом. Вероятно, я бы использовал столбец IDENTITY.

0

Если перекрестное соединение не было ваше первоначальное намерение, но вы хотите присоединиться к списку ценностей без фактического условия соединения вы можете попробовать UNION:

SELECT COLUMN,0,0,0 from A 
union all 
SELECT 0,COLUMN,0,0 from B 
union all 
SELECT 0,0,COLUMN,0 from C 
union all 
SELECT 0,0,0,COLUMN from D 

Вывод будет сумма всех записей для них столы.

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