Создать таблицу из другой, не заполняя ее - PullRequest
1 голос
/ 13 марта 2012

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

Допустим, у нас есть таблица A с миллионами записей, и я хочу создать таблицу B (это не представление, это будет таблица), которая содержит 3 столбца таблицы A с одинаковымиtype.

Я сделал это следующим образом:

CREATE TABLE B AS (
            SELECT column1,column2,column3 from A where 1=0;
        );

Но я действительно обеспокоен работой с производительностью, и я боюсь, что этот метод будет извлекать каждую строку (помнитев таблице столько строк) и проверьте абсурдное условие.

Поэтому у меня следующие вопросы:

  • Проверяется ли условие для каждой строки, или оптимизатор sql отменит егоавтоматически?

  • Есть ли лучший способ сделать это?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 13 марта 2012

Оптимизатор оценит условие во время компиляции и не получит все данные из таблицы только для проверки предиката, который не зависит от извлекаемых данных.

Как правило, вы должныпросто создайте оператор CREATE TABLE, используя соответствующие типы данных, а не создавайте таблицу на основе оператора SELECT.Вы не можете делать такие вещи, как определять ограничения для таблицы, которую вы создаете, с помощью оператора CREATE TABLE AS SELECT, который вам действительно нужен, если это действительно будет постоянная таблица.

Если выдействительно, вы можете использовать процедуру DBMS_METADATA.GET_DDL, чтобы получить DDL для таблицы, а затем вручную изменить этот DDL, чтобы извлечь только то, что вы хотите сохранить.

1 голос
/ 16 августа 2012

В вашем методе нет ничего плохого.Oracle сначала создаст пустую таблицу, а затем попытается заполнить ее.Поскольку критерий where возвращает false, данные не будут выбраны, следовательно, нет проблем с производительностью;Я попробовал это на большом столе 10 мил, без проблем с производительностью.

Мишель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...