Вы можете определить поле пользовательской модели, полученное из 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.
Это привело бы к нечувствительному к регистру сравнению уникальных значений в настраиваемом поле.
Вы можете разделить данные и вставить их в цикл курсора. Это будет почти то же самое, что и пакетная вставка 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
Имеется ли в представлении ЛЮБОЙ вид уникального идентификатора / ключа-кандидата? Если это так, вы можете выбрать эти строки в рабочую таблицу, используя:
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
Это все не в моей голове, поэтому не вырезайте / вставляйте / не запускайте, но я думаю, что общая идея есть.
Вы знаете, что пикси-пыли не существует.
Не зная подробностей о фактической передаваемой схеме, общее решение будет именно таким, как вы его описали: разделить обработку на несколько вставок и следить за ключом (ами). Это своего рода псевдокод 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
Будет сложнее, если вы захотите разрешить параллельные пакеты и разделить ключи.
Вы можете использовать команду BCP для загрузки данных и использовать параметр Batch Size
You можно использовать команду BCP для загрузки данных и использовать параметр размера пакета
http://msdn.microsoft.com/en-us/library/ms162802.aspx
Двухэтапный процесс