powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Что такого хитрого делает INSERT?
18 сообщений из 18, страница 1 из 1
Что такого хитрого делает INSERT?
    #32061672
Пашка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, такая штука. SQL2000, SP2.
Есть Таблица1 (6 млн. строк), один составной индекс (уникальный) и два поля обычные индексы, неуникальные. Все не кластерные.
Есть Таблица2, 500 тыщ строк, которую надо "залить" в таблицу 1. Без индексов. Записи в таблице2 заведомо те, которые отсутствуют в таблице1, т.е. с уникальностью все в порядке. Делаю просто: INSERT таблица1 SELECT * FROM Таблица2.
Пока было 4-5 млн. записей - все вкачивалось нормально, за 15-20 минут.(Я вкачиваю порциями по 500-800 тыс. строк). Перевалив за 6 млн - процедура "встает" и даже за 12 часов - никакого результата. Никаких ошибок. Никакого разрастания temp.db. Пытался посмотреть блокировки ЕМ - он не дает зайти в CurrentActivity. Виснет, приходится снимать. Profiler тоже не помог.
Решил проблему так: из одной таблицы в другую заливаю с помощью DTS, стандартной фичей - все работает быстро и нормально. Но почему INSERT затыкается, очень интересно? Может быть это как-то связано с индексами?...
Проблема решена, но хочется понять, чтобы в будущем не натыкаться..
...
Рейтинг: 0 / 0
Что такого хитрого делает INSERT?
    #32061676
Фотография TBB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, пожалуйста, еще один пример использования составных ключей. Может и не в них дело, конечно, кто знает...

Устал я. Пора уж отключаться, в-сам-деле...

:)
...
Рейтинг: 0 / 0
Что такого хитрого делает INSERT?
    #32061684
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А system operator настроен? Ему никаких ругательств о системных ошибках не приходило? Загляни в журнал - может быть чего там увидишь. Может быть, нет места для расширения файла лога (например).
...
Рейтинг: 0 / 0
Что такого хитрого делает INSERT?
    #32061685
vap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А пробовал BULK INSERT ? Может у вас тригеры тормозят?
...
Рейтинг: 0 / 0
Что такого хитрого делает INSERT?
    #32061697
Пашка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да BULKом то нормально, нет проблем. Триггеров нет и не было. В системном журнале ничего нету, да и когда не может расширить лог - ругается, а не продолжает крутить шестеренки как ни в чем ни бывало...
Надо попробовать дропнуть индексы, сделать INSERT, а потом создать их...
...
Рейтинг: 0 / 0
Что такого хитрого делает INSERT?
    #32061701
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привели бы вы DDL для обоих таблиц, да @@version.
...
Рейтинг: 0 / 0
Что такого хитрого делает INSERT?
    #32061712
Пашка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
CREATE TABLE [dbo].[STROKI_2002] (
	[Sklad_code] [int] NOT NULL ,
	[Type_doc] [tinyint] NOT NULL ,
	[Doc_number] [varchar] ( 10 ) NOT NULL ,
	[Str_number] [smallint] NOT NULL ,
	[Towar_code] [varchar] ( 20 ) NOT NULL ,
	[Kol] [int] NULL ,
	[Sum_fact] [money] NULL ,
	[Sum_zak] [money] NULL ,
	[Sum_uch] [money] NULL ,
	[NSP] [tinyint] NULL ,
	[NDS_zak] [tinyint] NULL ,
	[Card_number] [varchar] ( 20 ) NULL ,
	[Discount] [real] NULL ,
	[NDS_prod] [tinyint] NULL ,
	[Dat] [smalldatetime] NOT NULL ,
	[Partner_code] [int] NULL ,
	[Filial_code] [int] NULL ,
	[Diler_code] [int] NULL ,
	[For_ost] AS (case [Type_doc] when  1  then [Kol] else (((-[Kol]))) end) 
) ON [PRIMARY]
GO

 CREATE  UNIQUE  INDEX [IX_STROKI_2002] ON [dbo].[STROKI_2002]([Type_doc], [Sklad_code], [Dat], [Doc_number], [Str_number]) ON [PRIMARY]
GO

 CREATE  INDEX [IX_STROKI_2002_1] ON [dbo].[STROKI_2002]([Towar_code]) ON [PRIMARY]
GO

 CREATE  INDEX [IX_STROKI_2002_2] ON [dbo].[STROKI_2002]([Partner_code]) ON [PRIMARY]
GO

ALTER TABLE [dbo].[STROKI_2002] ADD 
	CONSTRAINT [FK_STROKI_2002_DOC_TYPE] FOREIGN KEY 
	([Type_doc]) REFERENCES [dbo].[DOC_TYPE] ([Type_doc]),
	CONSTRAINT [FK_STROKI_2002_DOCUMENT] FOREIGN KEY 
	(	[Type_doc],
		[Sklad_code],
		[Dat],
		[Doc_number]
	) REFERENCES [dbo].[DOCUMENT] (
		[Type_doc],
		[Sklad_code],
		[Dat],
		[Doc_number]
	) ON DELETE CASCADE  ON UPDATE CASCADE ,
	CONSTRAINT [FK_STROKI_2002_PARTNER] FOREIGN KEY 	(
		[Partner_code]
	) REFERENCES [dbo].[PARTNER] (
		[Partner_code]
	),
	CONSTRAINT [FK_STROKI_2002_SKLAD] FOREIGN KEY 
	(
		[Sklad_code]
	) REFERENCES [dbo].[SKLAD] (
		[Sklad_code]
	),
	CONSTRAINT [FK_STROKI_2002_TOWAR1] FOREIGN KEY 
	(
		[Towar_code]
	) REFERENCES [dbo].[TOWAR] (
		[Towar_code]
	)
GO

@@version щас не могу, к сожалению, привести, но я пробовал это делать на двух разных серверах - и с циферками 384 (SP1) и с 534 кажется (SP2).
Машины разные, на одной Win2000 Adv Server, на другой Win 2000 Pro.
Вторая таблица делается из первой строчкой Select * from stroki_2002 into таблица2. Т.е. точно такая же но без ключей и индексов.
Щас получше посмотрел на это безобразие. Я подозреваю несколько вещей - много ForeignKey (табличка TOWAR c Primary Key вообще имеет 900 тысяч строк), есть varchar index (Towar). Наверное сложно при закачке котролировать целостность по 4-5 ключам? Но почему до 4 млн работало - а потом бац, вторая смена...
...
Рейтинг: 0 / 0
Что такого хитрого делает INSERT?
    #32061748
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется, что дело в наличии индексов. То, что добавляемые записи не противоречат условию UNIQUE вовсе не означает, что в индексы не нужно перестраиавть. Скрорее всего занят этим
...
Рейтинг: 0 / 0
Что такого хитрого делает INSERT?
    #32061786
Пашка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если дело в индексах - то почему стандартной задачей в DTS копирование одной таблицы в другую проходит быстро и легко? Индексы то надо перестраивать независимо от способа заливки данных - разве нет? И внешние ключи, и все остальное точно так же действует...
Очень долго делается только INSERT'ом...
Вот потому я и спросил - что такого особенного делает INSERT? :)
...
Рейтинг: 0 / 0
Что такого хитрого делает INSERT?
    #32061803
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Загляните в свойства этой БД и посмотрите, какая recovery model для нее назначена. Разница между Bulk insert-ом и просто insert-ом может быть как раз в том, что при bulk insert-ах эти операции не фикисруются в журнале транзакций. ИМХО, у вас проблема именно с журналом транзакций. Или с файлом журнала транзакций. Проверте размер этого файла и свободное место в нем. Проверте, каким образом он будет увеличивать размер (и будет ли), если это файл заполнится. Возможно, у вас просто на диске не хватает места под достаточное увеличение размера файла журнала транзакций. Возможно, у вас прирощение размера файла журнала транзакций происходит очень мелкими порциями. Тогда во время вставки большого количество записей могут происходить, грубо говоря, примерно такие действия:
1. Добавление 100 записей
2. Заполнение всего свободного места в файле журнала транзакций.
3. Увеличение размера файла журнала транзакций (совсем небольшое, чтобы поместились еще 100 записей). Очень дорогостоящая и нудная операция.
4. Goto 1...

Что может быть еще? Помнится, в версии 6.5 размер device можно было увеличивать, но не до бесконечности. Если мне не изменяет память, можно было увеличить размер device не более 16 раз, после чего увеличить размер device уже становится невозможно. Я не нашел каких-либо ограничений на количество увеличений размера файла журнала транзакций для версий 7.0 и 2000. Скорее всего, таких ограничений нет. Но для полной уверенности хотелось бы получить моральную поддержку уважаемых гуру в этом вопросе...
...
Рейтинг: 0 / 0
Что такого хитрого делает INSERT?
    #32061874
Пашка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, наверняка дело в журнале транзакций.
Режим журнала стоит Simple, стоит галочка Auto Shrink, а приращение журнала неограниченное порциями по 10%...
...
Рейтинг: 0 / 0
Что такого хитрого делает INSERT?
    #32062074
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AUtoSrink - ЭТО ОЧЕНЬ ВРЕДНАЯ ШТУКА. Снимите ее нафиг!
...
Рейтинг: 0 / 0
Что такого хитрого делает INSERT?
    #32062412
Пашка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Garya:
А можно в двух словах - почему Auto shrink вредная штука?
Если его отключить - то что изменится в работе?
...
Рейтинг: 0 / 0
Что такого хитрого делает INSERT?
    #32062417
Kilroy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавлю, что BULK здесь также более уместен еще и потому, что индексы будут перестраиваться 1 раз - после
окончания загрузки, тогда как при обычном insert'e индексы
"реагируют" на каждое изменение.
...
Рейтинг: 0 / 0
Что такого хитрого делает INSERT?
    #32062422
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не делаете ли вы все это в одной транзакции?
...
Рейтинг: 0 / 0
Что такого хитрого делает INSERT?
    #32062424
Kilroy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправлюсь. Индексы надо удалить перед загрузкой,
а потом создать. В BOL пишут, что это "generally faster"
...
Рейтинг: 0 / 0
Что такого хитрого делает INSERT?
    #32062468
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А можно в двух словах - почему Auto shrink вредная штука?

Если места на диске хватает, то усечение файла журнала транзакций:
а) вызывает тормоза во время самого этого усечения
б) вызывает тормоза в процессе повторного его увеличения, когда ты вновь запустишь свою необъятную транзакцию
...
Рейтинг: 0 / 0
Что такого хитрого делает INSERT?
    #32064414
Пашка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все хорошо.
Грохаю индексы, запускаю BULK, делаю индексы.
Auto Shrink убрал.
Все работает быстро!
Всем спасибо!
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Что такого хитрого делает INSERT?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]