Как отключить последовательность в оракуле

Когда объекты мусора собраны в python?

В исходном коде для CPython много деталей: http://svn.python.org/view/python/trunk/ Модули / gcmodule.c? Revision = 81029 & amp; view = markup

Каждый раз, когда счетчик ссылок падает до нуля, объект немедленно удаляется.

293 / * Циклический gc Python никогда не должен видеть входящий refcount

294 * of 0: если что-то уменьшилось до 0, оно должно было быть

295 * немедленно освобождено в это время.

blockquote>

Полная коллекция запускается, когда число новых объектов превышает 25% от числа существующих объектов.

87 В дополнение к различным настраиваемым пороговым значениям мы запускаем только полную коллекцию

88, если отношение

89 long_lived_pending / long_lived_total

90 находится выше заданного значения (с привязкой к 25%).

blockquote>

Когда освобождена память?

Я смог вытащить эту информацию .

781 / * Очистить все свободные списки

782 * Все бесплатные списки удаляются во время сбора самого высокого поколения.

783 * Выделено элементы в свободном списке могут содержать занимаемую арену pymalloc.

784 * Удаление бесплатных списков может вернуть память ранее.

785 * /

blockquote>

В соответствии с этим Python может хранить ваш объект в свободном списке для повторной переработки, даже если вы отбросите его refcount на ноль. Я не могу явно найти, когда бесплатный вызов выполняется, чтобы вернуть память в операционную систему, но я полагаю, что это делается всякий раз, когда создается коллекция, и объект не хранится в свободном списке.

Эффект влияет на производительность?

Любой нетривиальный сборщик мусора, о котором я слышал, требует как процессора, так и памяти. Поэтому да, всегда есть влияние на производительность. Вам нужно будет поэкспериментировать и познакомиться с вашим сборщиком мусора.

Программы, требующие оперативной реакции в реальном времени. Я столкнулся с проблемами, поскольку сборщики мусора не дают мне контроля над тем, когда они запускаются или для чего они долго. Некоторые специфические случаи могут вызвать чрезмерное использование памяти, примером может быть умение Python для хранения свободных списков.

0
задан vaibhav 18 January 2019 в 05:51
поделиться

4 ответа

Просто получите все 1000 NEXTVAL в одном запросе, это должно быть быстро.

CREATE SEQUENCE vaibhav_seq;

WITH t(n) AS (
    SELECT 1 FROM DUAL
    UNION ALL
    SELECT n + 1 FROM t
        WHERE n < 1000)
SELECT vaibhav_seq.NEXTVAL FROM t;

Затем вы можете использовать их со своими INSERT утверждениями.

0
ответ дан kmkaplan 18 January 2019 в 05:51
поделиться

Если вас интересует только отправка в базу данных, вам не нужно для извлечения последовательности nextval. Просто используйте его в своем INSERT утверждении:

CREATE TABLE vaibhav (
    id NUMBER PRIMARY KEY,
    data VARCHAR(100)
);
CREATE SEQUENCE vaibhav_seq;

INSERT INTO vaibhav(id, data)
    VALUES (vaibhav_seq.nextval, 'foo');
INSERT INTO vaibhav(id, data)
    VALUES (vaibhav_seq.nextval, 'bar');

SELECT id, data FROM vaibhav;

  ID DATA
---- ----------
   1 foo
   2 bar
0
ответ дан kmkaplan 18 January 2019 в 05:51
поделиться

Ну, я не думаю, что вы можете отключить его. Что вы можете сделать, это создать триггер базы данных, который позаботится о вставке его значения. Вот пример:

SQL> create table test (id number, col varchar2(20));

Table created.

SQL> create sequence seq_test;

Sequence created.

SQL> create or replace trigger trg_bi_test
  2    before insert on test
  3    for each row
  4  begin
  5    :new.id := nvl(:new.id, seq_test.nextval);
  6  end;
  7  /

Trigger created.

SQL> insert into test (col) values ('Little');

1 row created.

SQL> insert into test (col) values ('Foot');

1 row created.

SQL> select * from test;

        ID COL
---------- --------------------
         1 Little
         2 Foot

SQL>

Как видите, вам не нужно сначала извлекать его значение, об этом позаботится база данных. Обратите внимание, что производительность, вероятно, пострадает, если вы загрузите много данных, так как триггер сработает для каждой вставленной строки.

Для пользователей, которые используют «старый» подход (который у вас есть), ничего не меняется:

SQL> insert into test (id, col) values (seq_test.nextval, 'Stack');

1 row created.

SQL> select * from test;

        ID COL
---------- --------------------
         3 Stack
         1 Little
         2 Foot

SQL>

Посмотрите, поможет ли это.

0
ответ дан Littlefoot 18 January 2019 в 05:51
поделиться

Если вы знаете, N, количество записей в SAS, которое вам нужно вставить, вы можете выполнить сквозной запрос, чтобы получить N следующих значений из последовательности.

%let N_SEQ_NEEDED = 1000;

Proc SQL;
  connect to oracle …;
  create table work.sequence_numbers as select * from connection to oracle (
    SELECT 
      ROWNUM n,
      THE_NEEDED_SEQUENCE.nextval sequence_value
    FROM   ( 
      SELECT 1 arbitrary_alias
      FROM   dual
      CONNECT BY LEVEL <= &N_SEQ_NEEDED
    )        
  );

Метод CONNECT BY из http://www.orafaq.com/wiki/Oracle_Row_Generator_Techniques

Не гарантируется последовательная природа N следующих значений вам просто нужно знать, что они уникальны и никогда не повторится в будущем.

Объедините или обновите свой набор данных SAS, назначив полученные значения sequence_values ​​столбцу последовательности в наборе данных, а затем выполните INSERT в Oracle с помощью своего кода SAS.

0
ответ дан Richard 18 January 2019 в 05:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: