В больших таблицах применение приема CREATE TABLE AS SELECT (CTAS) чревато возникновением неприятностей, поскольку Oracle не выполняет фиксации транзакций между операциями вставки и в это время в сегментах отката может закончиться место.Кроме того, эта техника позволяет использовать только типы данных, отличные от LONG.С помощью команды COPY данные из запроса можно копировать в таблицу, находящуюся в той же самой или в удаленной базе данных. Команда COPY позволяет копировать данные всех типов и избегать многих проблем CTAS, поскольку сама предусматривает выполнение фиксации во время копирования данных из исходной таблицы.Синтаксис SQL-команды COPY выглядит следующим образом:
SQL> COPY использование: COPY FROM <db> TO <db> <opt> <table> { (<cols>) } USING <sel> <db> : строка базы данных, например: hr/ваш_пароль@d:chicago-mktg <opt> : одно из следующих ключевых слов: APPEND, CREATE, INSERT или REPLACE <table> : имя целевой таблицы <cols> : разделенный запятыми перечень псевдонимов целевых столбцов <sel> : любой действительный SQL-оператор SELECT SQL>
При отсутствии конструкции FROM или TO используется текущее соединение SQL*Plus. Ключевую роль играет параметр opt, на месте которого может находиться одно из перечисленных ниже ключевых слов.
- APPEND. Указывает, что требуется вставить записи в целевую таблицу и создать эту таблицу, если таковой не существует.
- CREATE. Указывает, что требуется создать целевую таблицу и вставить строки в нее.
- INSERT. Указывает, что требуется вставить строки в существующую таблицу.
- REPLACE. Указывает, что требуется удалить существующую таблицу, воссоздать ее заново и затем загрузить данные в нее.
Конструкция USING <sel> позволяет указывать в запросе те строки и столбцы, которые требуется скопировать из исходной таблицы.
Совет. Если в таблице содержится столбец типа LONG, использовать для ее копирования метод CTAS нельзя, а команду COPY — можно.
В листинге 4.19 показан пример применения команды COPY. Обратите внимание на то, что символ дефиса (-) служит символом продолжения и позволяет разбивать длинные SQL-операторы на несколько строк. Обязательно удостоверьтесь в том, что не забыли поставить символ продолжения, и ни в коем случае не нажимайте клавишу <Enter> после ввода первой строки!
SQL> COPY FROM sysadm/sysadm1@finance1- > CREATE test01 - > USING SELECT * FROM employee; Array fetch/bind size is 15. (arraysize is 15) Will commit when done. (copycommit is 0) Maximum long size is 80. (long is 80) Table TEST01 created. 4954 rows selected from sysadm@finance1 4954 rows inserted into TEST01. 4954 rows committed into TEST01 at DEFAULT HOST connection. SQL>
При необходимости можно повысить скорость выполнения команды COPY за счет увеличения значений таких параметров SQL*Plus, как ARRAYSIZE, COPYCOMMIT и LONG.
Копирование данных из одной таблицы в другую на одном и том же сервере обычно происходит быстрее в случае применения метода CREATE TABLE AS SELECT, а не команды COPY, потому что команда COPY подразумевает копирование данных сначала с сервера в клиентский интерфейс SQL*Plus и только потом снова в базу данных. Очевидно,что это увеличивает накладные расходы и отнимает больше времени, чем копирование данных в рамках одного и того же сервера.