![]() |
|
Программирование >> Oracle
Глава 8 MY ROLE С у > 10 SYS C002677 P SYSJC002678 U SYS C002679 R 6 rows selected. Для нее создано много требований: шесть. Я экспортирую схему, удаляю таблицу и импортирую снова: tkyte@TKYTE816> host exp userid=tkyte/tkyte owner=tkyte tkyte@tkyte816> drop table T; Table dropped. tkyte@TKYTE816> host imp userid=tkyte/tkyte full=y ignore=y rows=n tkyte@TKYTE816> select constraint name name, constraint type type, search condition 2 from user constraints where table name = T; NAME T SEARCH CONDITION SYS C002680 С Z IS NOT NOLL SYS C002681 С x > 5 MY RULE С у > 10 SYS C002683 P SYS C002684 U SYS C002685 R б rows selected. Пока все выглядит нормально. Предположим, однако, что мы по какой-то причине снова выполняем импорт (например, он частично не удался). При этом мы обнаружим следующее: tkyte@TKYTE816> host imp userid=tkyte/tkyte full=y ignore=y Import: Release 8.1.6.0.0 - Production on Tue Mar 20 15:42:26 2001 (c) Copyright 1999 Oracle Corporation. All rights reserved. Connected to: Oracle8i Enterprise Edition Release 8.1.6.0.0 - Production With the Partitioning option JServer Release 8.1.6.0.0 - Production Export file created by EXPORT:V08.01.06 via conventional path import done in WE8ISO8859P1 character set and WE8ISO8859P1 NCHAR character set . importing TKYTEs objects into TKYTE . . importing table T 0 rows imported IMP-00017: following statement failed with ORACLE error 2264: ALTER TABLE I ADD CONSTRAINT MY RULE CHECK ( у > 10 ) ENABLE NOVALIDAT Импорт и экспорт 441 IMP-00003: ORACLE error 2264 encountered ORA-02264: name already used by an existing constraint IMP-00017: following statement failed with ORACLE error 2261: ALTER TABLE T ADD UNIQUE ( ) USING INDEX PCTFREE 10 INITRANS 2 MAXTRAN S 255 STORAGE (INITIAL 524288) TABLESPACE DATA ENABLE IMP-00003: ORACLE error 2261 encountered ORA-02261: such unique or primary key already exists in the table About to enable constraints... Import terminated successfully with warnings. tkyte@TKYTE816> select constraint name name, constraint type type, search condition 2 from user constraints where table name = T; NAME T SEARCH CONDITION SYS C002680 С Z IS NOT NULL SYS C002681 С x > 5 MY RULE С у > 10 SYS C002683 P SYS C002684 U SYS C002685 R SYS C002686 С x > 5 7 rows selected. Появилось дополнительное требование. На самом деле при каждом повторном импортировании будет добавляться дополнительное требование. Для явно поименованного требования было выдано предупреждение: нельзя дважды создавать требование с одним и тем же именем. А вот не имеющее явно заданного имени требование х > 5 создано снова. Так произошло потому, что сервер сгенерировал для него новое имя. Я знаю случаи, когда выполнялся экспорт на одной базе данных, удалялись данные на другой, и использовался импорт для наполнения структур исходными данными. Со временем накапливались сотни требований проверки для многих столбцов. Производительность начинала падать, и необходимо было выяснить, почему. Причина проста: при каждом копировании данных добавлялся очередной набор требований, делающих те же проверки. Давайте посмотрим, какое влияние может оказать всего сотня избыточных требований: tkyte@TKYTE816> create table t 2 (x int check (x > 5) Table created. tkyte@TKYTE816> declare 2 l start number default dbms utility.get time; 3 begin 4 for i in 1 . . 1000 5 loop 6 insert into t values (10) ; Глава 8 7 end loop; 8 dbms output.put line 9 (round((dbms utility.get time-l st*rt)/100,2) seconds); 10 end; 11 / . 08 seconds PL/SQL procedure successfully completed. tkyte@TKYTE816> begin 2 for i in 1 . . 100 3 loop 4 execute immediate 5 ALTER TABLE TKYTE . T ADD CHECK ( x > 5 ) ENABLE; 6 end loop; 7 end; PL/SQL procedure successfully completed. tkyte@TK:E816> declare 2 l start number default dbms utility.get time; 3 begin 4 for i in 1 . . 1000 5 loop 6 insert into t values (10) ; 7 end loop; 8 dbms output.put line 9 (round((dbms utility.get time-l start)/100,2) seconds); 10 end; 11 / 17 seconds PL/SQL procedure successfully completed. Еще одна веская причина явно задавать имена требований! Поддержка национальных языков (NLS) NLS - это сокращение от National Language Support (поддержка национальных языков). Она позволяет хранить, обрабатывать и получать данные на разн1х языках. Она гарантирует, что утилиты базы данных и сообщения об ошибках, порядок сортировки, форматы представления даты, времени, денежная единица, соглашения по представлению числовых данных и принятый календарь автоматически согласуются с родным языком клиента и форматом. Например, числа в]даются с соответствующим разделителем разрядов и дробной части. В некоторых странах числа должны выдаваться как 999.999.999,99, в других - как 999,999,999.00. Эти особенности необходимо учитывать при использовании утилит экспорта и импорта для переноса данных в среде с различными наборами символов. Существенное значение имеют наборы символов: клиента, с которого запускается ЕХР, и базы данных, из которой данные экспортируются;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |