Имя: Пароль:
1C
1С v8
ADODB и скорость вставки...
0 ДенисЧ
 
18.07.12
11:29
Простой код...

стрЗАпрос = "";
Для Каждого стрНомераРазмеров из тзНомераРазмеров Цикл
   стрЗАпрос = стрЗапрос + "INSERT INTO #UNR values(" + стрНомераРазмеров.УникальныйНомерРазмера + ", " + Формат(стрНомераРазмеров.ИдЗаказа, "ЧГ=0") + ")" + Символы.ВК;
КонецЦикла;
Если НЕ ПустаяСтрока(стрЗапрос) Тогда
   _1с.Execute(стрЗапрос);
КонецЕсли;

Здесь _1с - объект типа ADODB.Connection

Этот цикел и вставка занимают до 30% времени работы процедуры...
Можно тут что-то ускорить?

Таблица #UNR создана как
CREATE TABLE #UNR (UN INTEGER, ID_ZAK INTEGER)
1 shuhard
 
18.07.12
11:31
(0) можешь через рекордсет и батч попробовать - не факт, что поможет

можешь через булк грузить, но уже в обход ADODB
2 ДенисЧ
 
18.07.12
11:33
плёхо... :-(

А другой вопрос :-)
Есть 1с-запрос типа
Выбрать Что-то
ПОМЕСТИТЬ ВремТам
Из Откуда-ТО

Как узнать имя скуль-временной таблицы ВремТаб? Можно будет извернуться через это...
Особенно плохо, что идут кроссерверные вставки...
3 fisher
 
18.07.12
11:34
(0) Сколько из них занимает цикл, а сколько вставка?
4 shuhard
 
18.07.12
11:35
(2) грузи средствами сиквела, т.е. через DTS,
нафиг 1С приплетать ?
5 ДенисЧ
 
18.07.12
11:36
(3) цикл - 5%, вставка - 38% по последним замерам
(4) а откуда DTS возьмёт результат 1с-запроса? :-)
6 ДенисЧ
 
18.07.12
11:37
bulk тоже не проходит, как я понимаю, ибо хочет файл... А в файл я дольше писать буду :-)
7 fisher
 
18.07.12
11:39
(5) А INSERT разве вставкой только одной строки ограничен? Может, если избавиться от пакета запросов - быстрее будет?
8 shuhard
 
18.07.12
11:39
(6) зато булк не попадает в журнал транзакций, и часто выгрузить в файл и загрузить булком в сотни раз ускоряет процесс
9 Fragster
 
гуру
18.07.12
11:39
инсерт в 90% поддерживает вставку нескольких строк за раз
10 ДенисЧ
 
18.07.12
11:42
(7) Покажи примерчик...
(8) А как мне результат 1сзапроса в файл одним куском выгрузить? :-) Кроме того, у меня база и так в симпле...
11 ДенисЧ
 
18.07.12
11:44
хм... Нашёл, как несколько строк вставить... Попробую сейчас...
12 fisher
 
18.07.12
11:45
(10) Ну, в MS SQL, например, есть такой вариант синтаксиса:

INSERT INTO MyBooks
  SELECT title_id, title, type
  FROM titles
  WHERE type = 'mod_cook'
13 Fragster
 
гуру
18.07.12
11:45
(11) единственное, есть ограничение на размер запроса...
14 ДенисЧ
 
18.07.12
11:50
(12) insert select я знаю, отсюда и вопрос (2) возник...
(13) А сколько его там?
15 fisher
 
18.07.12
11:52
(14) Ну дык в insert select ты же можешь извернуться через from объединение строк.
16 Kreont
 
18.07.12
11:52
где то в районе 1000 строк (ограничивается как то в кб.длины текста запроса, но я так на глаз ставлю пачками по 1000 строк и всегда влазит:)
17 ДенисЧ
 
18.07.12
11:54
хм...

IF EXISTS(SELECT ID FROM tempdb..sysobjects WHERE ID = OBJECT_ID('tempdb..#UNR', 'U'))
   DROP TABLE #UNR
go
CREATE TABLE #UNR (UN INTEGER, ID_ZAK INTEGER)
go
INSERT INTO #UNR values
(2509117  , 610817),
(2509118  , 610817),
(2509119  , 610817),
(2509120  , 610817)


в результате..
  Msg 102, Level 15, State 1, Line 2
  Неправильный синтаксис около ",".

Какой уровень совместимости базы ей нужен?
18 ДенисЧ
 
18.07.12
11:54
(15) select from откуда я буду делать, если у меня временная 1с-таблица? :-)
19 shuhard
 
18.07.12
11:57
(18) попробуй цикл в 1С оставить как есть
писать через рекордсет, а не Insert
и записывать рекордсет через UpdateBatch
Do Until rstTitles.EOF
       If Trim(rstTitles!Type) = "self_help" Then
           rstTitles!Type = "psychology"
       End If
       rstTitles.MoveNext
   Loop
   rstTitles.UpdateBatch
20 Fragster
 
гуру
18.07.12
11:58
(14) вроде два метра
21 fisher
 
18.07.12
11:59
(17) Через values кажись только одну строку можно вставить.
(18) select from подзапрос, динамически составленный в твоем сабжевом цикле
Типа
(SELECT 1, 2
UNION ALL
SELECT 3, 5
UNION ALL
....)
22 Fragster
 
гуру
18.07.12
12:01
а на том конце что (мсскуль, мускуль, постгре, оракля?)
23 Fragster
 
гуру
18.07.12
12:02
http://msdn.microsoft.com/ru-ru/library/ms174335.aspx говорит, что можно без селекта
24 Fragster
 
гуру
18.07.12
12:02
VALUES

   Позволяет использовать один или несколько списков вставляемых значений данных. Для каждого столбца в column_list, если этот параметр указан или присутствует в таблице, должно быть одно значение. Список значений должен быть заключен в скобки.

   Если значения в списке идут в порядке, отличном от порядка следования столбцов в таблице, или не для каждого столбца таблицы определено значение, то необходимо использовать аргумент column_list для явного указания столбца, в котором хранится каждое входное значение.

   Можно использовать конструктор строк Transact-SQL (также называемый конструктором табличных значений), позволяющий указать несколько строк в одной инструкции INSERT. Этот конструктор строк состоит из одного предложения VALUES со списками из нескольких значений, заключенными в круглые скобки и разделенными запятыми. Дополнительные сведения см. в разделе Конструктор табличных значений (Transact-SQL).
25 Fragster
 
гуру
18.07.12
12:03
INSERT INTO dbo.MyProducts (Name, ListPrice)
VALUES ('Helmet', 25.50),
      ('Wheel', 30.00),
      (SELECT Name, ListPrice FROM Production.Product WHERE ProductID = 720);
26 fisher
 
18.07.12
12:07
(24) Тогда compatibility надо явно выше 2000 сиквела ставить. В 2000 сиквеле такой синтаксис values еще не поддерживался.
27 Fragster
 
гуру
18.07.12
12:09
(26) может там вообще mYsql
28 fisher
 
18.07.12
12:11
Чуйка, что таки MS
29 fisher
 
18.07.12
12:16
(28) + Уж больно характерная строчка
IF EXISTS(SELECT ID FROM tempdb..sysobjects WHERE ID = OBJECT_ID('tempdb..#UNR', 'U'))
30 ДенисЧ
 
18.07.12
12:24
(22) mssql
31 ДенисЧ
 
18.07.12
12:25
(24) *ля...
32 ДенисЧ
 
18.07.12
12:25
буду переписывать... Перенося запросы на другой сервер :-((((
33 ДенисЧ
 
18.07.12
12:28
а переписывать много...

Всем спасибо за компанию...
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший