По слСдам Highload++ Siberia 2019 β€” 8 Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Oracle

ΠŸΡ€ΠΈΠ²Π΅Ρ‚!

24-25 июня Π² НовосибирскС ΠΏΡ€ΠΎΡˆΠ»Π° конфСрСнция Highload++ Siberia 2019. Наши рСбята Ρ‚ΠΎΠΆΠ΅ Ρ‚Π°ΠΌ Π±Ρ‹Π»ΠΈ Π΄ΠΎΠΊΠ»Π°Π΄ΠΎΠΌ Β«ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π½Ρ‹Π΅ Π±Π°Π·Ρ‹ Oracle (CDB/PDB) ΠΈ ΠΈΡ… практичСскоС использованиС для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ПО», ΠΌΡ‹ Π²Ρ‹Π»ΠΎΠΆΠΈΠΌ Ρ‚Π΅ΠΊΡΡ‚ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ·ΠΆΠ΅. Π‘Ρ‹Π»ΠΎ ΠΊΡ€ΡƒΡ‚ΠΎ, спасибо olegbunin Π·Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡŽ, Π° Ρ‚Π°ΠΊΠΆΠ΅ всСм, ΠΊΡ‚ΠΎ ΠΏΡ€ΠΈΡˆΡ‘Π».

По слСдам Highload++ Siberia 2019 — 8 Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Oracle
Π’ этом постС ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ с Π²Π°ΠΌΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π½Π° нашСм стСндС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ свои знания Π² Oracle. Под ΠΊΠ°Ρ‚ΠΎΠΌ β€” 8 Π·Π°Π΄Π°Ρ‡, Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² ΠΈ объяснСниС.

КакоС максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сиквСнса ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ скрипта?

create sequence s start with 1;
 
select s.currval, s.nextval, s.currval, s.nextval, s.currval
from dual
connect by level <= 5;

  • 1
  • 5
  • 10
  • 25
  • Никакого, Π±ΡƒΠ΄Π΅Ρ‚ ошибка

ΠžΡ‚Π²Π΅Ρ‚Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Oracle (цитируСтся ΠΈΠ· 8.1.6):
Within a single SQL statement, Oracle will increment the sequence only once per row. If a statement contains more than one reference to NEXTVAL for a sequence, Oracle increments the sequence once and returns the same value for all occurrences of NEXTVAL. If a statement contains references to both CURRVAL and NEXTVAL, Oracle increments the sequence and returns the same value for both CURRVAL and NEXTVAL regardless of their order within the statement.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ числу строк, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ 5.

Бколько строк окаТСтся Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ скрипта?

create table t(i integer check (i < 5));
 
create procedure p(p_from integer, p_to integer) as
begin
    for i in p_from .. p_to loop
        insert into t values (i);
    end loop;
end;
/
 
exec p(1, 3);
exec p(4, 6);
exec p(7, 9);

  • 0
  • 3
  • 4
  • 5
  • 6
  • 9

ΠžΡ‚Π²Π΅Ρ‚Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Oracle (цитируСтся ΠΈΠ· 11.2):

Before executing any SQL statement, Oracle marks an implicit savepoint (not available to you). Then, if the statement fails, Oracle rolls it back automatically and returns the applicable error code to SQLCODE in the SQLCA. For example, if an INSERT statement causes an error by trying to insert a duplicate value in a unique index, the statement is rolled back.

Π’Ρ‹Π·ΠΎΠ² Π₯П с ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Ρ‚Π°ΠΊΠΆΠ΅ рассматриваСтся ΠΈ обрабатываСтся ΠΊΠ°ΠΊ single statement. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Π₯П Π±Π»Π°Π³ΠΎΠΏΠΎΠ»ΡƒΡ‡Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, вставив Ρ‚Ρ€ΠΈ записи; Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹Π·ΠΎΠ² Π₯П Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ с ошибкой ΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ‡Π΅Ρ‚Π²Ρ‘Ρ€Ρ‚ΡƒΡŽ запись, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ успСл Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ; Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ² Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ с ошибкой, ΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ записи.

Бколько строк окаТСтся Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ скрипта?

create table t(i integer, constraint i_ch check (i < 3));
 
begin
    insert into t values (1);
    insert into t values (null);
    insert into t values (2);
    insert into t values (null);
    insert into t values (3);
    insert into t values (null);
    insert into t values (4);
    insert into t values (null);
    insert into t values (5);
exception
    when others then
        dbms_output.put_line('Oops!');
end;
/

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

ΠžΡ‚Π²Π΅Ρ‚Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Oracle (цитируСтся ΠΈΠ· 11.2):

A check constraint lets you specify a condition that each row in the table must satisfy. To satisfy the constraint, each row in the table must make the condition either TRUE or unknown (due to a null). When Oracle evaluates a check constraint condition for a particular row, any column names in the condition refer to the column values in that row.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null ΠΏΡ€ΠΎΠΉΠ΄Ρ‘Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ, ΠΈ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ Π±Π»ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 3. ПослС этого Π±Π»ΠΎΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок погасит ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ ΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ останутся Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ строки со значСниями 1, null, 2 ΠΈ снова null.

КакиС ΠΏΠ°Ρ€Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π·Π°ΠΉΠΌΡƒΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΡ‘ΠΌΡ‹ мСста Π² Π±Π»ΠΎΠΊΠ΅?

create table t (
    a char(1 char),
    b char(10 char),
    c char(100 char),
    i number(4),
    j number(14),
    k number(24),
    x varchar2(1 char),
    y varchar2(10 char),
    z varchar2(100 char));
 
insert into t (a, b, i, j, x, y)
    values ('Y', 'Вася', 10, 10, 'Π”', 'Вася');

  • A ΠΈ X
  • B ΠΈ Y
  • C ΠΈ K
  • C ΠΈ Z
  • K ΠΈ Z
  • I ΠΈ J
  • J ΠΈ X
  • ВсС пСрСчислСнныС

ΠžΡ‚Π²Π΅Ρ‚ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Π²Ρ‹Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ (12.1.0.2) ΠΏΠΎ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΡŽ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π² Oracle.

CHAR Data Type
The CHAR data type specifies a fixed-length character string in the database character set. You specify the database character set when you create your database. Oracle ensures that all values stored in a CHAR column have the length specified by size in the selected length semantics. If you insert a value that is shorter than the column length, then Oracle blank-pads the value to column length.

VARCHAR2 Data Type
The VARCHAR2 data type specifies a variable-length character string in the database character set. You specify the database character set when you create your database. Oracle stores a character value in a VARCHAR2 column exactly as you specify it, without any blank-padding, provided the value does not exceed the length of the column.

NUMBER Data Type
The NUMBER data type stores zero as well as positive and negative fixed numbers with absolute values from 1.0 x 10-130 to but not including 1.0 x 10126. If you specify an arithmetic expression whose value has an absolute value greater than or equal to 1.0 x 10126, then Oracle returns an error. Each NUMBER value requires from 1 to 22 bytes. Taking this into account, the column size in bytes for a particular numeric data value NUMBER(p), where p is the precision of a given value, can be calculated using the following formula: ROUND((length(p)+s)/2))+1 where s equals zero if the number is positive, and s equals 1 if the number is negative.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, возьмСм Π²Ρ‹Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ насчСт хранСния Null–значСний.

A null is the absence of a value in a column. Nulls indicate missing, unknown, or inapplicable data. Nulls are stored in the database if they fall between columns with data values. In these cases, they require 1 byte to store the length of the column (zero). Trailing nulls in a row require no storage because a new row header signals that the remaining columns in the previous row are null. For example, if the last three columns of a table are null, then no data is stored for these columns.

Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· этих Π΄Π°Π½Π½Ρ‹Ρ…, строим рассуТдСния. Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² Π‘Π” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° AL32UTF8. Π’ этой ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ русскиС Π±ΡƒΠΊΠ²Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ 2 Π±Π°ΠΉΡ‚Π°.

1) A ΠΈ X, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля a ‘Y’ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 1 Π±Π°ΠΉΡ‚, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля x β€˜Π”β€™ – 2 Π±Π°ΠΉΡ‚Π°
2) B ΠΈ Y, β€˜Π’Π°ΡΡβ€™ Π² b Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ дополнится ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ Π΄ΠΎ 10 символов ΠΈ Π·Π°ΠΉΠΌΡ‘Ρ‚ 14 Π±Π°ΠΉΡ‚, β€˜Π’Π°ΡΡβ€™ Π² d – Π·Π°ΠΉΠΌΠ΅Ρ‚ 8 Π±Π°ΠΉΡ‚.
3) C ΠΈ K. Оба поля ΠΈΠΌΠ΅ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL, послС Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π°Ρ‰ΠΈΠ΅ поля, поэтому Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠΎ 1 Π±Π°ΠΉΡ‚Ρƒ.
4) C ΠΈ Z. Оба поля ΠΈΠΌΠ΅ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL, Π½ΠΎ ΠΏΠΎΠ»Π΅ Z – послСднСС Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅, поэтому мСста Π½Π΅ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ (0 Π±Π°ΠΉΡ‚). ПолС Π‘ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 1 Π±Π°ΠΉΡ‚.
5) K ΠΈ Z. Аналогично ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ ΡΠ»ΡƒΡ‡Π°ΡŽ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΠΎΠ»Π΅ K Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 1 Π±Π°ΠΉΡ‚, Π² Z – 0.
6) I ΠΈ J. Богласно Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, ΠΎΠ±Π° значСния Π·Π°ΠΉΠΌΡƒΡ‚ ΠΏΠΎ 2 Π±Π°ΠΉΡ‚Π°. Π”Π»ΠΈΠ½Ρƒ считаСм ΠΏΠΎ взятой ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹: round( (1 + 0)/2) +1 = 1 + 1 = 2.
7) J ΠΈ X. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΠΎΠ»Π΅ J Π·Π°ΠΉΠΌΠ΅Ρ‚ 2 Π±Π°ΠΉΡ‚, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΠΎΠ»Π΅ X Π·Π°ΠΉΠΌΠ΅Ρ‚ 2 Π±Π°ΠΉΡ‚Π°.

Π˜Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹: Π‘ ΠΈ K, I ΠΈ J, J ΠΈ X.

Каков ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ clustering factor Ρƒ индСкса T_I?

create table t (i integer);
 
insert into t select rownum from dual connect by level <= 10000;
 
create index t_i on t(i);

  • ΠŸΠΎΡ€ΡΠ΄ΠΊΠ° дСсятков
  • ΠŸΠΎΡ€ΡΠ΄ΠΊΠ° сотСн
  • ΠŸΠΎΡ€ΡΠ΄ΠΊΠ° тысяч
  • ΠŸΠΎΡ€ΡΠ΄ΠΊΠ° дСсятков тысяч

ΠžΡ‚Π²Π΅Ρ‚Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Oracle (цитируСтся ΠΈΠ· 12.1):

For a B-tree index, the index clustering factor measures the physical grouping of rows in relation to an index value.

The index clustering factor helps the optimizer decide whether an index scan or full table scan is more efficient for certain queries). A low clustering factor indicates an efficient index scan.

A clustering factor that is close to the number of blocks in a table indicates that the rows are physically ordered in the table blocks by the index key. If the database performs a full table scan, then the database tends to retrieve the rows as they are stored on disk sorted by the index key. A clustering factor that is close to the number of rows indicates that the rows are scattered randomly across the database blocks in relation to the index key. If the database performs a full table scan, then the database would not retrieve rows in any sorted order by this index key.

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π΄Π°Π½Π½Ρ‹Π΅ идСально отсортированы, поэтому clustering factor Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ ΠΈΠ»ΠΈ Π±Π»ΠΈΠ·ΠΎΠΊ ΠΊ количСству занятых Π±Π»ΠΎΠΊΠΎΠ² Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅. Для стандартного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π±Π»ΠΎΠΊΠ° Π² 8 ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ΄ΠΈΠ½ Π±Π»ΠΎΠΊ помСстится порядка тысячи ΡƒΠ·ΠΊΠΈΡ… number Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, поэтому количСство Π±Π»ΠΎΠΊΠΎΠ², ΠΈ ΠΊΠ°ΠΊ слСдствиС clustering factor Π±ΡƒΠ΄Π΅Ρ‚ порядка дСсятков.

ΠŸΡ€ΠΈ ΠΊΠ°ΠΊΠΈΡ… значСниях N ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ скрипт ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ выполнится Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Π‘Π” со стандартными настройками?

create table t (
    a varchar2(N char),
    b varchar2(N char),
    c varchar2(N char),
    d varchar2(N char));
 
create index t_i on t (a, b, c, d);

  • 100
  • 200
  • 400
  • 800
  • 1600
  • 3200
  • 6400

ΠžΡ‚Π²Π΅Ρ‚Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Oracle (цитируСтся ΠΈΠ· 11.2):

Logical Database Limits

Item
Type of Limit
Limit Value

Indexes
Total size of indexed column
75% of the database block size minus some overhead

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, суммарный Ρ€Π°Π·ΠΌΠ΅Ρ€ индСксированных ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅Π²ΠΎΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ 6Кб. Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅Π΅ зависит ΠΎΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ Π±Π°Π·Ρ‹. Для ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ AL32UTF8 ΠΎΠ΄ΠΈΠ½ символ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ максимум 4 Π±Π°ΠΉΡ‚Π°, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² 6 ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚ Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ помСстится ΠΎΠΊΠΎΠ»ΠΎ 1500 символов. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Oracle Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ созданиС индСкса ΠΏΡ€ΠΈ N = 400 (ΠΊΠΎΠ³Π΄Π° Π΄Π»ΠΈΠ½Π° ΠΊΠ»ΡŽΡ‡Π° Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС Π±ΡƒΠ΄Π΅Ρ‚ 1600 символов * 4 Π±Π°ΠΉΡ‚Π° + Π΄Π»ΠΈΠ½Π° rowid), Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ N = 200 (ΠΈ мСньшС) созданиС индСкса ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ INSERT с Ρ…ΠΈΠ½Ρ‚ΠΎΠΌ APPEND ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² direct-Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚, Ссли ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ висит Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€?

  • Π”Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π² direct-Ρ€Π΅ΠΆΠΈΠΌΠ΅, Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ сработаСт ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½
  • Π”Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π² direct-Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π½ΠΎ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚
  • Π”Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π² conventional-Ρ€Π΅ΠΆΠΈΠΌΠ΅, Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ сработаСт ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½
  • Π”Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π² conventional-Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π½ΠΎ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚
  • Π”Π°Π½Π½Ρ‹Π΅ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹, Π±ΡƒΠ΄Π΅Ρ‚ зафиксирована ошибка

ΠžΡ‚Π²Π΅Ρ‚Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, это вопрос большС Π½Π° Π»ΠΎΠ³ΠΈΠΊΡƒ. Для нахоТдСния ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π° я ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» Π±Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ модСль рассуТдСний:

  1. Вставка Π² direct Ρ€Π΅ΠΆΠΈΠΌΠ΅ выполняСтся прямым Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π±Π»ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…, ΠΌΠΈΠΌΠΎ SQL-Π΄Π²ΠΈΠΆΠΊΠ°, Ρ‡Ρ‚ΠΎ ΠΈ обСспСчиваСт Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° вСсьма слоТно, Ссли Π²ΠΎΠΎΠ±Ρ‰Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈ смысла Π² этом Π½Π΅Ρ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ всё Ρ€Π°Π²Π½ΠΎ ΠΊΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½ΠΎ Π·Π°Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΡ‚ вставку.
  2. НСвыполнСниС Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ состояниС Π±Π°Π·Ρ‹ Π² Ρ†Π΅Π»ΠΎΠΌ (Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚Π°Π±Π»ΠΈΡ†) Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ΅ вставлСны эти Π΄Π°Π½Π½Ρ‹Π΅. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΎ ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π² production.
  3. ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, Π²ΠΎΠΎΠ±Ρ‰Π΅ говоря, трактуСтся ΠΊΠ°ΠΊ ошибка. Но здСсь слСдуСт Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ APPEND – Ρ…ΠΈΠ½Ρ‚, Π° общая Π»ΠΎΠ³ΠΈΠΊΠ° Ρ…ΠΈΠ½Ρ‚ΠΎΠ² Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ссли это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ссли ΠΆΠ΅ Π½Π΅Ρ‚ – ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ выполняСтся Π±Π΅Π· ΡƒΡ‡Ρ‘Ρ‚Π° Ρ…ΠΈΠ½Ρ‚Π°.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ – Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ (SQL) Ρ€Π΅ΠΆΠΈΠΌΠ΅, Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ сработаСт.

Богласно Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Oracle (цитируСтся ΠΈΠ· 8.04):

Violations of the restrictions will cause the statement to execute serially, using the conventional insert path, without warnings or error messages. An exception is the restriction on statements accessing the same table more than once in a transaction, which can cause error messages.
For example, if triggers or referential integrity are present on the table, then the APPEND hint will be ignored when you try to use direct-load INSERT (serial or parallel), as well as the PARALLEL hint or clause, if any.

Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ скрипта?

create table t(i integer not null primary key, j integer references t);
 
create trigger t_a_i after insert on t for each row
declare
    pragma autonomous_transaction;
begin
    insert into t values (:new.i + 1, :new.i);
    commit;
end;
/
 
insert into t values (1, null);

  • УспСшноС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
  • Π‘Π±ΠΎΠΉ ΠΈΠ·-Π·Π° синтаксичСской ошибки
  • Ошибка, связанная с Π½Π΅Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ
  • Ошибка, связанная с ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅ΠΌ максимальной влоТСнности Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²
  • Ошибка, связанная с Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ΠΌ внСшнСго ΠΊΠ»ΡŽΡ‡Π°
  • Ошибка, связанная с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ

ΠžΡ‚Π²Π΅Ρ‚Π’Π°Π±Π»ΠΈΡ†Π° ΠΈ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π²ΠΏΠΎΠ»Π½Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈ эта опСрация Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° привСсти ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ. АвтономныС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π² Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹, ΠΈΠ½Π°Ρ‡Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.

ПослС вставки ΠΏΠ΅Ρ€Π²ΠΎΠΉ строки ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ срабатываниС Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ Π±Ρ‹ ΠΊ вставкС Π²Ρ‚ΠΎΡ€ΠΎΠΉ строки, Π² связи с Ρ‡Π΅ΠΌ снова сработал Π±Ρ‹ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€, вставил Π±Ρ‹ Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ строку ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° statement Π½Π΅ ΡƒΠΏΠ°Π» Π±Ρ‹ ΠΈΠ·-Π·Π° ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΡ максимальной влоТСнности Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². Однако, срабатываСт Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΎΠ½ΠΊΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚ выполнСния Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° для ΠΏΠ΅Ρ€Π²ΠΎΠΉ вставлСнной записи Π΅Ρ‰Ρ‘ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ commit. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ Π² Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, пытаСтся Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ строку, ΡΡΡ‹Π»Π°ΡŽΡ‰ΡƒΡŽΡΡ ΠΏΠΎ Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ ΠΊΠ»ΡŽΡ‡Ρƒ Π½Π° Π΅Ρ‰Ρ‘ Π½Π΅ Π·Π°ΠΊΠΎΠΌΠΌΠΈΡ‡Π΅Π½Π½ΡƒΡŽ запись. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ оТиданию (автономная транзакция ΠΆΠ΄Ρ‘Ρ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° основной, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅) ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ основная транзакция ΠΆΠ΄Ρ‘Ρ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½ΠΎΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ послС Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π°. Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ deadlock ΠΈ ΠΊΠ°ΠΊ слСдствиС – автономная транзакция отстрСливаСтся ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅, связанной с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ.

Волько зарСгистрированныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² опросС. Π’ΠΎΠΉΠ΄ΠΈΡ‚Π΅, поТалуйста.

Π‘Π»ΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ?

  • Как Π΄Π²Π° ΠΏΠ°Π»ΡŒΡ†Π°, сразу Ρ€Π΅ΡˆΠΈΠ» всё ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

  • НС особо, ошибся Π² ΠΏΠ°Ρ€Π΅ вопросов.

  • РСшил ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρƒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

  • Π”Π²Π° Ρ€Π°Π·Π° ΡƒΠ³Π°Π΄Π°Π» ΠΎΡ‚Π²Π΅Ρ‚!

  • ΠΠ°ΠΏΠΈΡˆΡƒ Π² коммСнтариях

ΠŸΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π»ΠΈ 14 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π’ΠΎΠ·Π΄Π΅Ρ€ΠΆΠ°Π»ΠΈΡΡŒ 10 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ