Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Поиск в массиве (TABLE OF)

Приветствую!

Есть идеи, как организовать поиск в массиве (Oracle 9.2) ?

Итак, имею тип
CREATE OR REPLACE TYPE type_int_arr AS TABLE OF INTEGER;


И есть PIPELINED функция, которая возвращает коллекцию type_int_arr
FUNCTION GetBadCustomersIDs RETURN type_int_arr PIPELINED;



Далее собираюсь многократно в цикле в процедуре кроме всего прочего проверять, не принадлежит ли ID к коллекции, полученной из GetBadCustomersIDs. В принципе, можно было бы выгрузить коллекцию во временную таблицу и уже её дергать с помошью SQL, но может есть какие-то другие способы?

Буду благодарен за советы.
Ответ: спасибо
Вопрос: Корректный перевод "table-like array"

Заранее прошу прощение у администрации, не знала куда написать вопрос. Но, думаю, на этом форуме достаточно грамотных специалистов, которые смогут мне помочь
Нужно перевести:
Returns a single value from a database table-like array or range using a SQL-like query.

Возвращает значение из массива или диапазона в виде таблицы по методу, похожему на SQL.

Перевод дословный,но меня просто морально убивают "table-like array". Какие ещё табличные массивы?
"Представление таблицы в языках программирования называется массивом" (из гугла)

Масло масляное, на мой взгляд. Насколько разумно и корректно оставить просто "из массива или диапазона"

Метод, похожий на Sql запрос тоже чуть-чуть смущает
Ответ:
Alina9I
Перевод дословный,но меня просто морально убивают "table-like array". Какие ещё табличные массивы?
"Представление таблицы в языках программирования называется массивом" (из гугла)

Возможно, имеется ввиду двумерный массив ("database table"-like).
Вопрос: SQL индекс по элементам массива

Класс event содержит список объектов класса user и индекс по ELEMENTS.
+ Класс user
Class User.user Extends %Persistent SqlTableName UserTable ]
{

Index uniqueIdx On name [ IdKeyPrimaryKeyUnique ];

Property name As %String ReadOnly ];

Method %OnNew(name As %StringAs %Status PrivateServerOnly = 1 ]
{
  
Set i%name = $G(name)
  
Quit $$$OK
}

ClassMethod get(name As %StringAs %String
{
  
Quit:..uniqueIdxExists(namename
  
Set obj = ..%New(name)
  
If $IsObject(obj{
    
Set sc obj.%Save()
    
Quit:$$$ISOK(scobj.%Id()
  
}
  
Quit ""
}

}
+ Класс event
Class User.event Extends (%Persistent%Populate)
{

Index usersIdx On users(ELEMENTS);

Property name As %String(POPSPEC "City()");

Property users As list Of User.user(POPSPEC "##class(User.user).get(##class(%PopulateUtils).Name()):100:Integer(1,100)");

}
Зная user.%Id() необходимо найти event.name:
SELECT %NOLOCK name
FROM event
WHERE FOR SOME %ELEMENT(users) (%VALUE 'Sorenson,Stavros P.')
План запроса (относительная стоимость = 1232):
Read index map SQLUser.event.usersIdx, using the given %EXACT(Subvalue(users)), and looping on ID.
For each row:
    Read master map SQLUser.event.IDKEY, using the given idkey value.
    Output the row.
Индекс используется, всё работает быстро.
Переделаем users в массив.
+ Класс event2
Class User.event2 Extends (%Persistent%Populate)
{

Index usersIdx On users(ELEMENTS);

Property name As %String(POPSPEC "City()");

Property users As array Of User.user(POPSPEC "##class(User.user).get(##class(%PopulateUtils).Name()):100:Integer(1,100)");

}
Зная user.%Id() необходимо найти event.name и ключ в массиве, по которому записан user.
Т.к. users это массив, поля users в таблице event2 нет, зато есть таблица event2_users:
SELECT %NOLOCK event2->nameelement_key
FROM event2_users
WHERE users 'Sorenson,Stavros P.'
План запроса (относительная стоимость = 49132):
Read master map SQLUser.event2_users.IDKEY, looping on event2 and element_key.
For each row:
    Read master map SQLUser.event2.IDKEY, using the given idkey value, generating a row padded with nulls if none found.
    Output the row.
Индекс не используется. Объявить индекс для таблицы event2_users возможности нет.
Единственное что мне удалось придумать, это костыль вызов SqlProc:
ClassMethod getEventsByUser(user As %StringAs %List SqlName GetEventsSqlProc ]
{
  
Set result ""
  
Set key $O(^User.event2I("usersIdx",user,""))
  
While key'="" {
    
Set result result_$LB(key)
    
Set key $O(^User.event2I("usersIdx",user,key))
  
}
  
Quit result
}
SELECT %NOLOCK event2->nameelement_key
FROM event2_users
WHERE users 'Sorenson,Stavros P.'
AND u.event2 %INLIST GetEvents('Sorenson,Stavros P.')
План запроса (относительная стоимость = 733.28):
Read master map SQLUser.event2_users.IDKEY, looping on event2 (with a given set of values) and element_key.
For each row:
    Read master map SQLUser.event2.IDKEY, using the given idkey value, generating a row padded with nulls if none found.
    Output the row.

Как должен выглядеть SQL запрос к таблице events2, который будет использовать индекс usersIdx?
Ответ:
Petr0vi4444
Спасибо, такое решение подходит. Правда получается, что данные хранятся дважды
Есть .
Вопрос: Как сменить тип блокировки при ALTER TABLE?

Есть таблица в 15 гб, 2 млн записей,в нее иногда приходится добавлять колонки. При добавлении колонок таблица блокируется. Соответственно сессия у 15 клиентов, которые сидят постоянно подвисает. Я прочитал в документации, что можно как-то сменить блокировку. цитата
автор
ALTER TABLE меняет определение существующей таблицы. Несколько её разновидностей описаны ниже. Заметьте, что для разных разновидностей могут требоваться разные уровни блокировок. Если явно не отмечено другое, требуется блокировка ACCESS EXCLUSIVE.

чуть ниже я ничего не нашел, нашел только режимы блокировки Не понятно что с ними делать.
Вот у меня вопрос. Есть запрос:
ALTER TABLE distributors ADD COLUMN address varchar(30);
Как его переписать так, чтобы клиенты могли работать с таблицей на селект и инсерт, одновременно с добавлением новой колонки в эту таблицу?
Ответ: Спасибо Alexius так и поступлю.
Maxim Boguk, да архитектура у меня не очень. Я в качестве обучения БД и лазарус взял себе более менее реальный проект у которого из плюсов только что обработка большого массива данных и мастерю в нем чо то. Например, в день идет около 150 тысяч операций записи. Селектов раза в три больше. Удаляется тысяч 60-80. ХЗ мало это или нет.
Так как денег там нет, чисто хобби - для меня нормально там иногда добавить колонку или убрать колонку. На сайте 2 калеки, переживут. Помогите мне, пожалуйста, если время есть
зы
хотелось бы писать в postgresql на чистом С, но пока я так не умею :(
Вопрос: 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, а время выдачи первых записей.
Вопрос: oracle 12 LOAD TABLE CONVENTIONAL

вот это работает 50 минут

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production              
PL/SQL Release 12.1.0.2.0 - Production                                                    
CORE    12.1.0.2.0      Production                                                                
TNS for Linux: Version 12.1.0.2.0 - Production                                            
NLSRTL Version 12.1.0.2.0 - Production                                               
 

insert into reg_export_data2  select *  from EMIAS_LLO.reg_export_data@pak;
530 rows created.


Execution Plan
----------------------------------------------------------
Plan hash value: 1788691278


| Id  | Operation                            | Name                    | Rows |  Bytes | Cost (%CPU)| Time      | Inst   |IN-OUT|
|   0 | INSERT STATEMENT              |                             |   530  |   109K|   542    (0)   | 00:00:01|         |          |
|   1 |  LOAD TABLE CONVENTIONAL | REG_EXPORT_DATA2 |         |          |                   |             |         |          |
|   2 |   REMOTE                            | REG_EXPORT_DATA  |   530 |    109K|   542   (0)    | 00:00:01|   PAK |  R->S |



Remote SQL Information (identified by operation id):
----------------------------------------------------

   2 - SELECT /*+ OPAQUE_TRANSFORM */ID","FILE_NAME","TYPE_CODE","FILE_DATA","VISIBLE","CONTENT_SIZE","CONTENT_HASH","FILE_SIZE","FILE_HASH","CTIME" FROM "EMIAS_LLO"."REG_EXPORT_DATA"
       "REG_EXPORT_DATA" (accessing 'PAK' )
Statistics
----------------------------------------------------------
        183  recursive calls
          0  db block gets
         51  consistent gets
          8  physical reads
          0  redo size
        904  bytes sent via SQL*Net to client
        551  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          8  sorts (memory)
          0  sorts (disk)
          5  rows processed


  


а вот это 50 секунд

select * from v$version;
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for Linux: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production


Execution Plan
----------------------------------------------------------
Plan hash value: 1788691278



| Id  | Operation        | Name            | Rows  | Bytes | Cost (%CPU)| Time   | Inst   |IN-OUT|

----------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT |                 |   530 |   109K|   542   (0)| 00:00:04 |        |      |
|   1 |  REMOTE          | REG_EXPORT_DATA |   530 |   109K|   542   (0)| 00:00:04 |    PAK | R->S |



Remote SQL Information (identified by operation id):
----------------------------------------------------

   1 - SELECT /*+ OPAQUE_TRANSFORM */ "ID","FILE_NAME","TYPE_CODE","FILE_DATA","VISIBLE","CONTENT_SIZE","CONTENT_HASH","FILE_SIZE","FILE_HASH","CTIME" FROM
       "EMIAS_LLO"."REG_EXPORT_DATA" "REG_EXPORT_DATA" (accessing 'PAK' )



Statistics
----------------------------------------------------------
     134451  recursive calls
     125851  db block gets
     523679  consistent gets
       1088  physical reads
  222932200  redo size
        821  bytes sent via SQL*Net to client
        762  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
       2216  sorts (memory)
          0  sorts (disk)
        530  rows processed



разница только в версии базы. манипуляции с хинтами картины не улучшили...
прошу соображения аксакалов
Ответ:
Rinka777
  SQL*Net message from dblink                   544        4.57         73.77
  SQL*Net more data from dblink               24057        6.07       1981.83
ну теперь более-менее понятно откуда начинать: начните с анализа сетевых проблем и со статистик выполнения запроса на удаленной базе.