Пакетная фиксация на большой операции ВСТАВКИ в собственном SQL?

Вы можете определить поле пользовательской модели, полученное из models.CharField. Это поле может проверять дубликаты значений, игнорируя регистр.

Документация по настраиваемым полям находится здесь http://docs.djangoproject.com/en/dev/howto/custom-model-fields/

Посмотрите на http: / /code.djangoproject.com/browser/django/trunk/django/db/models/fields/files.py для примера того, как создать настраиваемое поле путем создания подкласса существующего поля.

Вы можете использовать модуль citext в PostgreSQL https://www.postgresql.org/docs/current/static/citext.html

Если вы используете этот модуль, Пользовательское поле может определять «db_type» как CITEXT для баз данных PostgreSQL.

Это привело бы к нечувствительному к регистру сравнению уникальных значений в настраиваемом поле.

7
задан Cade Roux 21 October 2009 в 18:11
поделиться

5 ответов

Вы можете разделить данные и вставить их в цикл курсора. Это будет почти то же самое, что и пакетная вставка SSIS. Но работает на вашем сервере.

create cursor ....
select YEAR(DateCol), MONTH(DateCol) from whatever

while ....
    insert into yourtable(...)
    select * from whatever 
    where YEAR(DateCol) = year and MONTH(DateCol) = month
end
5
ответ дан 6 December 2019 в 11:50
поделиться

Имеется ли в представлении ЛЮБОЙ вид уникального идентификатора / ключа-кандидата? Если это так, вы можете выбрать эти строки в рабочую таблицу, используя:

SELECT key_columns INTO dbo.temp FROM dbo.HugeView;

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

Затем вы можете сделать что-то вроде этого, вставив 10 000 строк за раз и резервное копирование журнала между ними:

SET NOCOUNT ON;

DECLARE
    @batchsize INT,
    @ctr INT,
    @rc INT;

SELECT
    @batchsize = 10000,
    @ctr = 0;

WHILE 1 = 1
BEGIN
    WITH x AS
    (
        SELECT key_column, rn = ROW_NUMBER() OVER (ORDER BY key_column)
        FROM dbo.temp
    )
    INSERT dbo.PrimaryTable(a, b, c, etc.)
        SELECT v.a, v.b, v.c, etc.
        FROM x
        INNER JOIN dbo.HugeView AS v
        ON v.key_column = x.key_column
        WHERE x.rn > @batchsize * @ctr
        AND x.rn <= @batchsize * (@ctr + 1);

    IF @@ROWCOUNT = 0
        BREAK;

    BACKUP LOG PrimaryDB TO DISK = 'C:\db.bak' WITH INIT;

    SET @ctr = @ctr + 1;
END

Это все не в моей голове, поэтому не вырезайте / вставляйте / не запускайте, но я думаю, что общая идея есть.

5
ответ дан 6 December 2019 в 11:50
поделиться

Вы знаете, что пикси-пыли не существует.

Не зная подробностей о фактической передаваемой схеме, общее решение будет именно таким, как вы его описали: разделить обработку на несколько вставок и следить за ключом (ами). Это своего рода псевдокод T-SQL:

create table currentKeys (table sysname not null primary key, key sql_variant not null);
go

declare @keysInserted table (key sql_variant);
declare @key sql_variant;
begin transaction
do while (1=1)
begin
    select @key = key from currentKeys where table = '<target>';
    insert into <target> (...)
    output inserted.key into @keysInserted (key)
    select top (<batchsize>) ... from <source>
    where key > @key
    order by key;

    if (0 = @@rowcount)
       break; 

    update currentKeys 
    set key = (select max(key) from @keysInserted)
    where table = '<target>';
    commit;
    delete from @keysInserted;
    set @key = null;
    begin transaction;
end
commit

Будет сложнее, если вы захотите разрешить параллельные пакеты и разделить ключи.

2
ответ дан 6 December 2019 в 11:50
поделиться

Вы можете использовать команду BCP для загрузки данных и использовать параметр Batch Size

http://msdn.microsoft.

1
ответ дан 6 December 2019 в 11:50
поделиться

You можно использовать команду BCP для загрузки данных и использовать параметр размера пакета

http://msdn.microsoft.com/en-us/library/ms162802.aspx

Двухэтапный процесс

  • Данные BCP OUT из Просмотр в текстовых файлах
  • BCP IN данные из текстовых файлов в таблицы с параметром размера пакета
1
ответ дан 6 December 2019 в 11:50
поделиться
Другие вопросы по тегам:

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