Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Что такого хитрого делает INSERT? / 18 сообщений из 18, страница 1 из 1
24.10.2002, 17:31:08
    #32061672
Пашка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такого хитрого делает INSERT?
Господа, такая штука. 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
24.10.2002, 17:35:21
    #32061676
TBB
TBB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такого хитрого делает INSERT?
Вот, пожалуйста, еще один пример использования составных ключей. Может и не в них дело, конечно, кто знает...

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

:)
...
Рейтинг: 0 / 0
24.10.2002, 17:43:58
    #32061684
Garya
Garya Привилегированный пользователь
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такого хитрого делает INSERT?
А system operator настроен? Ему никаких ругательств о системных ошибках не приходило? Загляни в журнал - может быть чего там увидишь. Может быть, нет места для расширения файла лога (например).
...
Рейтинг: 0 / 0
24.10.2002, 17:49:37
    #32061685
vap
vap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такого хитрого делает INSERT?
А пробовал BULK INSERT ? Может у вас тригеры тормозят?
...
Рейтинг: 0 / 0
24.10.2002, 18:07:53
    #32061697
Пашка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такого хитрого делает INSERT?
Да BULKом то нормально, нет проблем. Триггеров нет и не было. В системном журнале ничего нету, да и когда не может расширить лог - ругается, а не продолжает крутить шестеренки как ни в чем ни бывало...
Надо попробовать дропнуть индексы, сделать INSERT, а потом создать их...
...
Рейтинг: 0 / 0
24.10.2002, 18:16:06
    #32061701
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такого хитрого делает INSERT?
Привели бы вы DDL для обоих таблиц, да @@version.
...
Рейтинг: 0 / 0
24.10.2002, 18:39:04
    #32061712
Пашка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такого хитрого делает INSERT?
Код: 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
24.10.2002, 22:38:22
    #32061748
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такого хитрого делает INSERT?
Мне кажется, что дело в наличии индексов. То, что добавляемые записи не противоречат условию UNIQUE вовсе не означает, что в индексы не нужно перестраиавть. Скрорее всего занят этим
...
Рейтинг: 0 / 0
25.10.2002, 09:18:44
    #32061786
Пашка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такого хитрого делает INSERT?
А если дело в индексах - то почему стандартной задачей в DTS копирование одной таблицы в другую проходит быстро и легко? Индексы то надо перестраивать независимо от способа заливки данных - разве нет? И внешние ключи, и все остальное точно так же действует...
Очень долго делается только INSERT'ом...
Вот потому я и спросил - что такого особенного делает INSERT? :)
...
Рейтинг: 0 / 0
25.10.2002, 10:20:34
    #32061803
Garya
Garya Привилегированный пользователь
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такого хитрого делает INSERT?
Загляните в свойства этой БД и посмотрите, какая 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
25.10.2002, 12:34:23
    #32061874
Пашка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такого хитрого делает INSERT?
Да, наверняка дело в журнале транзакций.
Режим журнала стоит Simple, стоит галочка Auto Shrink, а приращение журнала неограниченное порциями по 10%...
...
Рейтинг: 0 / 0
25.10.2002, 19:43:12
    #32062074
Garya
Garya Привилегированный пользователь
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такого хитрого делает INSERT?
AUtoSrink - ЭТО ОЧЕНЬ ВРЕДНАЯ ШТУКА. Снимите ее нафиг!
...
Рейтинг: 0 / 0
28.10.2002, 16:36:31
    #32062412
Пашка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такого хитрого делает INSERT?
2Garya:
А можно в двух словах - почему Auto shrink вредная штука?
Если его отключить - то что изменится в работе?
...
Рейтинг: 0 / 0
28.10.2002, 16:48:38
    #32062417
Kilroy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такого хитрого делает INSERT?
Добавлю, что BULK здесь также более уместен еще и потому, что индексы будут перестраиваться 1 раз - после
окончания загрузки, тогда как при обычном insert'e индексы
"реагируют" на каждое изменение.
...
Рейтинг: 0 / 0
28.10.2002, 17:04:10
    #32062422
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такого хитрого делает INSERT?
А не делаете ли вы все это в одной транзакции?
...
Рейтинг: 0 / 0
28.10.2002, 17:07:15
    #32062424
Kilroy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такого хитрого делает INSERT?
Поправлюсь. Индексы надо удалить перед загрузкой,
а потом создать. В BOL пишут, что это "generally faster"
...
Рейтинг: 0 / 0
28.10.2002, 19:04:47
    #32062468
Garya
Garya Привилегированный пользователь
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такого хитрого делает INSERT?
>А можно в двух словах - почему Auto shrink вредная штука?

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


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