Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: set transaction snapshot table stability: не понимаю поведение сессий при DML

hi all.

Сначала - пример с INSERT'ами, три сеанса:

session #1
SQL> recreate table test(id int constraint test_pk primary key);
SQL> commit;
SQL> set transaction snapshot table stability;
SQL> insert into test values(1);
SQL> -- возвращается в подсказку

session #2
SQL> commit; set transaction snapshot table stability;
SQL> insert into test values(2);
-- висит, и это для TIL = table stability - правильно

session #3
SQL> commit; set transaction snapshot table stability;
SQL> insert into test values(3);
-- тоже висит

session #1
SQL> COMMIT;

session #2: возвращается в "SQL>" подсказку, т.е. ВЫПОЛНИЛА свой инсерт
session #3: висит

session #2: commit;
session #3: возвращается в "SQL>" подсказку, т.е. тоже ВЫПОЛНИЛА свой инсерт.

бНОПНЯ-1. А почему, соб-сно, сеансы 2 и 3 не обломались ? Ведь когда таблица была уже изменена транзакцией сеанса-1 (пусть еще и не закоммиченной), никакие другие транзакции с TIL = table stability *не* должны иметь возможности вносить изменения в эту таблицу.
гласит:
langref30.pdf страница 431
... после старта такой транзакции в других клиентских транзакциях невозможно выполнение изменений ни в каких таблицах этой базы данных. Все такие попытки в параллельных процессах приведут
к исключениям базы данных


Теперь - пример с UPDATE, тоже три сеанса (в предположении, что в таблице уже есть три строки, с id = 1, 2 & 3.

session #1
SQL> commit;
SQL> set transaction snapshot table stability;
SQL> update test set id=-id where abs(id)=1;
SQL>

session #2
SQL> commit;
SQL> set transaction snapshot table stability;
SQL> update test set id=-id where abs(id)=2;
-- висит...

session #3
SQL> commit;
SQL> set transaction snapshot table stability;
SQL> update test set id=-id where abs(id)=3;
-- висит...

session #1
SQL> ROLLBACK;

session #2
-- немедленно получает... облом:
Statement failed, SQLSTATE = 40001
deadlock
-Acquire lock for relation (TEST) failed

SQL>

session #3
-- по прежнему висит, ожидая результата транзакции в сеансе #2.

бНОПНЯ-2. Почему сеанс-2 получил облом после того, как сеанс-1 отменил свою транзакцию ?
Ответ:
kdv
Вопрос этот сложный, как минимум, процитирую себя...

8 лет назад пытался в этом разобраться, да так и не довел до конца - .
Там сошлись, что статья не совсем верна, но уже не помню, в чем именно :)
Вопрос: ERROR 1114 (HY000): The table 'table2' is full - почему?

Сервер 5.7.11 на Windows 2003. InnoDB, innodb_file_per_table. Свободного места (NTFS) - ну просто завались.

Есть БД по имени db. В ней - таблица db.table1 на 19 гБайт.
Нужно создать таблицу-копию table2 в БД test.

Выполняем
CREATE TABLE test.table2 AS SELECT * FROM db.table1;
В ответ получаем
ERROR 1114 (HY000): The table 'table2' is full

Если же выполнить
CREATE TABLE test.table2 LIKE db.table1;
INSERT INTO test.table2 SELECT * FROM db.table1;

то всё проходит нормально.

WTF? Чего нехватает для прямого копирования?
manual
InnoDB reports this error when the system tablespace runs out of free space. Reconfigure the system tablespace to add a new data file.
ничего к пониманию не добавляет - ибо innodb_file_per_table, под новую таблицу создаётся и новый tablespace.
Ответ:
miksoft
internal_tmp_disk_storage_engine какое значение имеет?

InnoDB

miksoft
tmp_table_size, случаем, не ограничен на уровне 4 Гбайт ?

64M
Но временная таблица не используется.

miksoft
когда нет явно указанного PK

Исходная таблица не имеет индексов. И поле внутреннего номера в ней, несомненно, имеется.
Вопрос: CREATE TABLE

Вот цитата из документации к access 2007:
-- Multiple-field constraint:

CONSTRAINT name     {PRIMARY KEY (primary1[, primary2 [,]]) |     UNIQUE (unique1[, unique2 [,]]) |     NOT NULL (notnull1[, notnull2 [,]]) |     FOREIGN KEY [NO INDEX] (ref1[, ref2 [,]]) REFERENCES foreigntable [(foreignfield1 [, foreignfield2 [,]])]     [ON UPDATE CASCADE | SET NULL]     [ON DELETE CASCADE | SET NULL]}


Вот мой DDL:
CREATE TABLE PeriodicData (
	rowId COUNTER CONSTRAINT Ct_rowid PRIMARY KEY,
	theChild INTEGER,
	calcYear SMALLINT,
	CONSTRAINT Ct_nonul NOT NULL (theChild, calcYear)
);


При попытке сохранить запрос выделяет слово NOT и выдает следующее:
Microsoft Access
Ошибка синтаксиса в предложении CONSTRAINT. (NOT)


Что я делаю не так?
Ответ:
nrmBeginner
9041,

То же самое.
По-моему, там просто ошибка для Multiple-field constraint. Должны были указать CONSTRAINT ... NOT NULL только для Single-field constraint.
Просто даже не понятно, что это за ограничение на несколько полей, и чем оно будет отличатся от двух ограничений на два поля ("в стиле" Single-field constraint)
Для Single-field constraint - работает
    sSQL = "CREATE TABLE PeriodicData1 ( " & _
    "rowId COUNTER CONSTRAINT Ct_rowid PRIMARY KEY, " & _
    "theChild INTEGER CONSTRAINT Ct_theChild NOT NULL , " & _
    "calcYear SMALLINT CONSTRAINT Ct_calcYear NOT NULL  " & _
    ");"
    CurrentProject.Connection.Execute sSQL
Вопрос: update error "can't update table in stored function/trigger"

Добрый день, подскажите пожалуйста, разбираюсь в чужой программе и необходимо дописать запрос.
UPDATE image t0 LEFT JOIN user_active_count t1 ON t0.user_id=t1.user_id SET t0.rating=t0.rating-(t1.rating*0.001) 

Хочу в таблице image уменьшить значение в поле reating, в зависимости от рейтинга пользователя из таблицы user_active_count.
Вылезает ошибка
автор
can't update table in stored function/trigger because it is already used by statement which invoked this stores function/trigger

Получается что мешает какой то тригер, только как определить какой, их в базе не мало, возможно у меня запрос просто некоректно собран
Ответ:
miksoft
darlov
Я может не ясно выразился, почему все молчат?
Действительно, не все ясно. Да и праздники - многих нет, мне лень :)

Что за триггер? И зачем в запросе LEFT, хотя случай t1.rating IS NULL вы никак не обрабатываете.

Тригер по update таблицы image
LEFT - присоединяю к таблице image рейтинг пользователя, он есть у всех, не может быть NULL
Вопрос: insert в memory table

Добрий день.

Есть таблица:
CREATE TABLE `poiskserver`.`mon_results_help_1` (
  `company` INT(6) NOT NULL,
  `kgip_type` INT(6) NOT NULL,
  `kgip` INT(11) NOT NULL,
  `b_company` INT(6) NOT NULL,
  `m_ins` DATETIME NOT NULL,
   INDEX `common` USING BTREE (`company` ASC, `kgip_type` ASC, `kgip` ASC, `b_company` ASC))
   ENGINE = MEMORY;


В нее вставляется 3328500 записей, через такой запрос:

INSERT INTO mon_results_help_1 (company, kgip_type, kgip, b_company, m_ins)
  ( SELECT SQL_NO_CACHE a.company,
           a.kgip_type,
           a.kgip,
           b.company AS b_company,
           b.dt_action AS m_ins
   FROM poiskserver.kgips a
   JOIN poiskserver.kgips b ON a.kgip_type=b.kgip_type
   AND a.kgip=b.kgip
   WHERE a.company<>b.company
     AND a.removed=0
     AND b.removed=0) 


Время исполнения 24с
Причем почти все время идет на INSERT а не на SELECT

Если все зделать через OUTFILE, LOAD DATA INFILE:
SELECT SQL_NO_CACHE a.company,
           a.kgip_type,
           a.kgip,
           b.company AS b_company,
           b.dt_action AS m_ins
   FROM poiskserver.kgips a
   JOIN poiskserver.kgips b ON a.kgip_type=b.kgip_type
   AND a.kgip=b.kgip
   WHERE a.company<>b.company
     AND a.removed=0
     AND b.removed=0
   INTO OUTFILE 'D:\mon_results_help_1';

LOAD DATA INFILE 'D:\mon_results_help_1' INTO TABLE mon_results_help_1;

Все ровно время будет 24с
Этого я не понимаю, ведь время на запись на и считывание с диска должно бить по идее больше?
Это первое...
Второе, как максимально ускорить вставку в таблицу?
Ответ:
denis111111
Если делать только выборку, без вставки, то время что-то 0.012с
miksoft
Похоже, что вы измерили не время SELECT, а время выдачи первых записей.
Вопрос: проблема с external table

Добрый день! Уважаемые форумчане, нужна Ваша помощь. Совсем недавно потребовалось использовать external table для загрузки данных из xml файла. перелазил кучу форумов и сайтов, разобрался что к чему. но проблема в том что данные не загружаются, таблица открывается пустой... Подскажите в чем дело. Привожу код.

содержимое XML файла:

<?xml version="1.0" encoding="windows-1251"?>
<DATAPACKET Version="2.0">
  <METADATA>
    <FIELDS>
      <FIELD attrname="DOCUMENTID" fieldtype="r8"/>
      <FIELD attrname="AMOUNT" fieldtype="r8"/>
      <FIELD WIDTH="32" attrname="DOCUMENTNO" fieldtype="string"/>
      <FIELD WIDTH="6" attrname="DOCUMENTDATE" fieldtype="string"/>
      <FIELD WIDTH="28" attrname="ACCOUNTNO" fieldtype="string"/>
      <FIELD WIDTH="34" attrname="CORRACCOUNTNO" fieldtype="string"/>
      <FIELD WIDTH="105" attrname="CORRSNAME" fieldtype="string"/>
      <FIELD attrname="OPERATIONTYPE" fieldtype="r8"/>
      <FIELD WIDTH="3" attrname="CURRENCYID" fieldtype="string"/>
      <FIELD WIDTH="29" attrname="TREZACCOUNTNO" fieldtype="string"/>
      <FIELD WIDTH="29" attrname="CORRTREZACCOUNTNO" fieldtype="string"/>
      <FIELD WIDTH="4" attrname="SUBDIVISIONCODE" fieldtype="string"/>
      <FIELD WIDTH="4" attrname="CORRSUBDIVISIONCODE" fieldtype="string"/>
      <FIELD WIDTH="14" attrname="FISCALCODE" fieldtype="string"/>
      <FIELD attrname="SUMMAEQ" fieldtype="r8"/>
      <FIELD WIDTH="6" attrname="POSTINGDATE" fieldtype="string"/>
      <FIELD WIDTH="210" attrname="DETAILSOFPAYMENT" fieldtype="string"/>
      <FIELD WIDTH="12" attrname="BIC_A" fieldtype="string"/>
      <FIELD WIDTH="14" attrname="CORRFISCALCODE" fieldtype="string"/>
      <FIELD WIDTH="11" attrname="BIC_B" fieldtype="string"/>
      <FIELD WIDTH="105" attrname="SNAME" fieldtype="string"/>
      <FIELD WIDTH="3" attrname="TRANSACTIONCODE" fieldtype="string"/>
    </FIELDS>
    <PARAMS LCID="0"/>
  </METADATA>
  <ROWDATA>
    <ROW ACCOUNTNO="222400144444444/498" AMOUNT="10000"
      BIC_A="FTMDMD2X735" BIC_B="FTMDMD2X735"
      CORRACCOUNTNO="149670102195161/498" CORRFISCALCODE="87654321"
      CORRSNAME="TESTARE FCP PJ" CURRENCYID="MDL"
      DETAILSOFPAYMENT="Achitarea creditului eliberat ca test in baza ordinului nr. 96 din 26/09/2014  "
      DOCUMENTDATE="140930" DOCUMENTID="4262" DOCUMENTNO="2"
      FISCALCODE="87654321" OPERATIONTYPE="0" POSTINGDATE="140930"
      SNAME="&quot;TESTARE FCP PJ&quot;" SUMMAEQ="10000" TRANSACTIONCODE="001"/>
  </ROWDATA>
  <CHUNKCOUNT>
    0
  </CHUNKCOUNT>
  <CHUNKNUM>
    1
  </CHUNKNUM>
  <LASTCHUNK>
    true
  </LASTCHUNK>
</DATAPACKET>


код моей таблицы :

CREATE   TABLE tab_xmll1(
                             ROWDATA VARCHAR2(2000)
                            )
  ORGANIZATION EXTERNAL(
                        TYPE ORACLE_LOADER
                        DEFAULT DIRECTORY FINCOM
                        ACCESS PARAMETERS(
                                          RECORDS DELIMITED BY "</ROWDATA>"
                                          FIELDS MISSING FIELD VALUES ARE NULL
                                                (
                                                ROWDATA  char(2000) enclosed by "<ROWDATA>" and "</ROWDATA>"
                                                                                                )
                                         )
                        LOCATION ('demo1.xml')
                       )
  PARALLEL
  REJECT LIMIT UNLIMITED
/ 
Ответ:
bakalim
подскажите как извлечь данные в таблицу из такого файла?

with t as
(select xmltype('<?xml version="1.0" encoding="windows-1251"?>
<DATAPACKET Version="2.0">
  <METADATA>
    <FIELDS>
      <FIELD attrname="DOCUMENTID" fieldtype="r8"/>
      <FIELD attrname="AMOUNT" fieldtype="r8"/>
      <FIELD WIDTH="32" attrname="DOCUMENTNO" fieldtype="string"/>
      <FIELD WIDTH="6" attrname="DOCUMENTDATE" fieldtype="string"/>
      <FIELD WIDTH="28" attrname="ACCOUNTNO" fieldtype="string"/>
      <FIELD WIDTH="34" attrname="CORRACCOUNTNO" fieldtype="string"/>
      <FIELD WIDTH="105" attrname="CORRSNAME" fieldtype="string"/>
      <FIELD attrname="OPERATIONTYPE" fieldtype="r8"/>
      <FIELD WIDTH="3" attrname="CURRENCYID" fieldtype="string"/>
      <FIELD WIDTH="29" attrname="TREZACCOUNTNO" fieldtype="string"/>
      <FIELD WIDTH="29" attrname="CORRTREZACCOUNTNO" fieldtype="string"/>
      <FIELD WIDTH="4" attrname="SUBDIVISIONCODE" fieldtype="string"/>
      <FIELD WIDTH="4" attrname="CORRSUBDIVISIONCODE" fieldtype="string"/>
      <FIELD WIDTH="14" attrname="FISCALCODE" fieldtype="string"/>
      <FIELD attrname="SUMMAEQ" fieldtype="r8"/>
      <FIELD WIDTH="6" attrname="POSTINGDATE" fieldtype="string"/>
      <FIELD WIDTH="210" attrname="DETAILSOFPAYMENT" fieldtype="string"/>
      <FIELD WIDTH="12" attrname="BIC_A" fieldtype="string"/>
      <FIELD WIDTH="14" attrname="CORRFISCALCODE" fieldtype="string"/>
      <FIELD WIDTH="11" attrname="BIC_B" fieldtype="string"/>
      <FIELD WIDTH="105" attrname="SNAME" fieldtype="string"/>
      <FIELD WIDTH="3" attrname="TRANSACTIONCODE" fieldtype="string"/>
    </FIELDS>
    <PARAMS LCID="0"/>
  </METADATA>
  <ROWDATA>
    <ROW ACCOUNTNO="222400144444444/498" AMOUNT="10000"
      BIC_A="FTMDMD2X735" BIC_B="FTMDMD2X735"
      CORRACCOUNTNO="149670102195161/498" CORRFISCALCODE="87654321"
      CORRSNAME="TESTARE FCP PJ" CURRENCYID="MDL"
      DETAILSOFPAYMENT="Achitarea creditului eliberat ca test in baza ordinului nr. 96 din 26/09/2014  "
      DOCUMENTDATE="140930" DOCUMENTID="4262" DOCUMENTNO="2"
      FISCALCODE="87654321" OPERATIONTYPE="0" POSTINGDATE="140930"
      SNAME="&quot;TESTARE FCP PJ&quot;" SUMMAEQ="10000" TRANSACTIONCODE="001"/>
  </ROWDATA>
  <CHUNKCOUNT>
    0
  </CHUNKCOUNT>
  <CHUNKNUM>
    1
  </CHUNKNUM>
  <LASTCHUNK>
    true
  </LASTCHUNK>
</DATAPACKET>') cd from dual)
select rowdata 
 from t,
      xmltable('DATAPACKET/ROWDATA'
                passing cd
                columns rowdata xmltype path '*')

только подозреваю что тебе нужны аттрибуты ROWDATA
Вопрос: А чем replicate-do-table отличается от replicate-wild-do-table?

А чем replicate-do-table отличается от replicate-wild-do-table?
Ответ: wild здесь - это от wildcard. Шаблон навроде % в like , а поведение такое же совершенно.

А раз вы не понимаете как это работает, то не поймете почему в некоторых случаях изменения мистически пропадают. Таких тем на форуме очень много было.
Поэтому для начала стоит попытаться вообще не использовать никаких фильтров репликации, а сделать в ненужных таблицах alter table .. engine=blackhole.
Вопрос: empty table

Приветы! Подскажите куда посмотреть?
DB 11.2.0.3
Есть две одинаковые (по структуре) пустые таблицы:
desc t1;               
---------------------------------------------
COL1                          DATE
COL2                          VARCHAR2(1000 BYTE)
COL3                          VARCHAR2(25 BYTE)

explain plan for 
select * from t1;
select * from table(dbms_xplan.display);
--------------------------------------------------------------------------------------
| Id  | Operation         | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |                  |     1 |   525 |  9078   (1)| 00:01:49 |
|   1 |  TABLE ACCESS FULL| SYNC_ERROR_MONTH |     1 |   525 |  9078   (1)| 00:01:49 |
--------------------------------------------------------------------------------------

explain plan for 
select * from t2;
select * from table(dbms_xplan.display);
---------------------------------------------------------------------------------------
| Id  | Operation         | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |                   |     1 |   525 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| SYNC_ERROR_MONTH2 |     1 |   525 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------------------

"Пересбор" статистики изменений не даёт, только если пересоздать таблицу или удалить-восстановить столбец (проверено на другой аналогичной машине, с полной копией БД)?
Ответ:
mRdUKE
Elic
RTFM

+ dbms_stats.gather_table_stats

Собирать статистику после truncate плохая примета
Вопрос: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой

Люди добрые, подскажите пожалуйста, почему возникает ошибка identifier 'TEST1' must be declared ? Ведь таблица создана.

DECLARE
	TYPE vtab IS TABLE OF NUMBER;
	varr vtab;
BEGIN
	EXECUTE IMMEDIATE 'CRE
ATE TABLE test1 (id1 INTEGER)';
    SELECT id1 BULK COLLECT INTO varr FROM test1; -- ошибка 
	EXECUTE IMMEDIATE 'DROP TABLE test1';
END;
Ответ:
mcureenab
Что касается изменения таблиц в процессе эксплуатации, то это нормальное явление. Бизнес хочет доработок сразу, а не в очередном релизе.
внерелизные изменения допустимы, когда от простоя всех трех внутренних пользователей отсутствие прибыли компании не меняется.

mcureenab
проще поля в таблицу добавить и в "динамическом" коде поддержать.
ага, и добавлять поля тоже в "динамическом". какую прощету дает заворачивание скрипта в строковый литерал? Если это изменение функционала, тем более внежданное==не протестированное, шансы наткнуться на возможные ошибки в строковых литералах откладываются на момент, когда все уже забыли, когда, что и зачем добавляли.
Вопрос: Изменение объектного типа для nested table

Добрый день!

Есть таблица
create or replace type ttt_p_o
as 
	object (
		id 				number(11),
		amount				number(5)
	);
create or replace type ttt_p_t as table of ttt_p_o;

create table ttt (
  id                number(5),
  name              varchar2(10 char),
  sp	            ttt_p_t
) 
nested table sp store as ttt_p_nt;

insert into ttt values(1, 'aaa', ttt_p_t(ttt_p_o(1, 2)));
insert into ttt values(2, 'bbb', ttt_p_t(ttt_p_o(2, 1), ttt_p_o(3, 2)));

select * from ttt;


Как можно теперь изменить тип ttt_p_o, например, хочу добавить еще одно поле
create or replace type ttt_p_o
as 
	object (
		id 				number(11),
		amount				number(5),
		is_something			number(1)
	);


Заранее благодарен за любую помощь!
Ответ:
особенности национальной ООПы
Это автору топика или мне? На соответствующий раздел OR-developers guide я и сам намекнул. Но для осознания глубины предложил способ, наиболее илюстрирующий возможные последствия использования ООП в РСУБД.


А кому-же ещё? Не знаю про какую глубину ты намекаешь но предложенный тобой способ это самая обыкновенная кувалда. И никаких последствий использования ООП я тут не вижу.

SY.