|
|
|
Что такого хитрого делает INSERT?
|
|||
|---|---|---|---|
|
#18+
Господа, такая штука. 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 затыкается, очень интересно? Может быть это как-то связано с индексами?... Проблема решена, но хочется понять, чтобы в будущем не натыкаться.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2002, 17:31:08 |
|
||
|
Что такого хитрого делает INSERT?
|
|||
|---|---|---|---|
|
#18+
Вот, пожалуйста, еще один пример использования составных ключей. Может и не в них дело, конечно, кто знает... Устал я. Пора уж отключаться, в-сам-деле... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2002, 17:35:21 |
|
||
|
Что такого хитрого делает INSERT?
|
|||
|---|---|---|---|
|
#18+
А system operator настроен? Ему никаких ругательств о системных ошибках не приходило? Загляни в журнал - может быть чего там увидишь. Может быть, нет места для расширения файла лога (например). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2002, 17:43:58 |
|
||
|
Что такого хитрого делает INSERT?
|
|||
|---|---|---|---|
|
#18+
А пробовал BULK INSERT ? Может у вас тригеры тормозят? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2002, 17:49:37 |
|
||
|
Что такого хитрого делает INSERT?
|
|||
|---|---|---|---|
|
#18+
Да BULKом то нормально, нет проблем. Триггеров нет и не было. В системном журнале ничего нету, да и когда не может расширить лог - ругается, а не продолжает крутить шестеренки как ни в чем ни бывало... Надо попробовать дропнуть индексы, сделать INSERT, а потом создать их... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2002, 18:07:53 |
|
||
|
Что такого хитрого делает INSERT?
|
|||
|---|---|---|---|
|
#18+
Привели бы вы DDL для обоих таблиц, да @@version. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2002, 18:16:06 |
|
||
|
Что такого хитрого делает INSERT?
|
|||
|---|---|---|---|
|
#18+
Код: 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. @@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 млн работало - а потом бац, вторая смена... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2002, 18:39:04 |
|
||
|
Что такого хитрого делает INSERT?
|
|||
|---|---|---|---|
|
#18+
Мне кажется, что дело в наличии индексов. То, что добавляемые записи не противоречат условию UNIQUE вовсе не означает, что в индексы не нужно перестраиавть. Скрорее всего занят этим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2002, 22:38:22 |
|
||
|
Что такого хитрого делает INSERT?
|
|||
|---|---|---|---|
|
#18+
А если дело в индексах - то почему стандартной задачей в DTS копирование одной таблицы в другую проходит быстро и легко? Индексы то надо перестраивать независимо от способа заливки данных - разве нет? И внешние ключи, и все остальное точно так же действует... Очень долго делается только INSERT'ом... Вот потому я и спросил - что такого особенного делает INSERT? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2002, 09:18:44 |
|
||
|
Что такого хитрого делает INSERT?
|
|||
|---|---|---|---|
|
#18+
Загляните в свойства этой БД и посмотрите, какая recovery model для нее назначена. Разница между Bulk insert-ом и просто insert-ом может быть как раз в том, что при bulk insert-ах эти операции не фикисруются в журнале транзакций. ИМХО, у вас проблема именно с журналом транзакций. Или с файлом журнала транзакций. Проверте размер этого файла и свободное место в нем. Проверте, каким образом он будет увеличивать размер (и будет ли), если это файл заполнится. Возможно, у вас просто на диске не хватает места под достаточное увеличение размера файла журнала транзакций. Возможно, у вас прирощение размера файла журнала транзакций происходит очень мелкими порциями. Тогда во время вставки большого количество записей могут происходить, грубо говоря, примерно такие действия: 1. Добавление 100 записей 2. Заполнение всего свободного места в файле журнала транзакций. 3. Увеличение размера файла журнала транзакций (совсем небольшое, чтобы поместились еще 100 записей). Очень дорогостоящая и нудная операция. 4. Goto 1... Что может быть еще? Помнится, в версии 6.5 размер device можно было увеличивать, но не до бесконечности. Если мне не изменяет память, можно было увеличить размер device не более 16 раз, после чего увеличить размер device уже становится невозможно. Я не нашел каких-либо ограничений на количество увеличений размера файла журнала транзакций для версий 7.0 и 2000. Скорее всего, таких ограничений нет. Но для полной уверенности хотелось бы получить моральную поддержку уважаемых гуру в этом вопросе... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2002, 10:20:34 |
|
||
|
Что такого хитрого делает INSERT?
|
|||
|---|---|---|---|
|
#18+
Да, наверняка дело в журнале транзакций. Режим журнала стоит Simple, стоит галочка Auto Shrink, а приращение журнала неограниченное порциями по 10%... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2002, 12:34:23 |
|
||
|
Что такого хитрого делает INSERT?
|
|||
|---|---|---|---|
|
#18+
AUtoSrink - ЭТО ОЧЕНЬ ВРЕДНАЯ ШТУКА. Снимите ее нафиг! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2002, 19:43:12 |
|
||
|
Что такого хитрого делает INSERT?
|
|||
|---|---|---|---|
|
#18+
2Garya: А можно в двух словах - почему Auto shrink вредная штука? Если его отключить - то что изменится в работе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2002, 16:36:31 |
|
||
|
Что такого хитрого делает INSERT?
|
|||
|---|---|---|---|
|
#18+
Добавлю, что BULK здесь также более уместен еще и потому, что индексы будут перестраиваться 1 раз - после окончания загрузки, тогда как при обычном insert'e индексы "реагируют" на каждое изменение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2002, 16:48:38 |
|
||
|
Что такого хитрого делает INSERT?
|
|||
|---|---|---|---|
|
#18+
А не делаете ли вы все это в одной транзакции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2002, 17:04:10 |
|
||
|
Что такого хитрого делает INSERT?
|
|||
|---|---|---|---|
|
#18+
Поправлюсь. Индексы надо удалить перед загрузкой, а потом создать. В BOL пишут, что это "generally faster" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2002, 17:07:15 |
|
||
|
Что такого хитрого делает INSERT?
|
|||
|---|---|---|---|
|
#18+
>А можно в двух словах - почему Auto shrink вредная штука? Если места на диске хватает, то усечение файла журнала транзакций: а) вызывает тормоза во время самого этого усечения б) вызывает тормоза в процессе повторного его увеличения, когда ты вновь запустишь свою необъятную транзакцию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2002, 19:04:47 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32062417&tid=1819109]: |
0ms |
get settings: |
5ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
28ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 296ms |

| 0 / 0 |
