Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Не срабатывает более 457 INSERTов в одном запросе (число прочтений - 2084 )
Old_Joe
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Зарегистрирован: 16. Февраля 2010
Не срабатывает более 457 INSERTов в одном запросе
16. Февраля 2010 :: 13:30
Печать  
Текст запроса выглядит так

INSERT INTO __CTest (t1,t2) VALUES (1,'test 1');
INSERT INTO __CTest (t1,t2) VALUES (2,'test 2');
.......
INSERT INTO __CTest (t1,t2) VALUES (457,'test 457');
INSERT INTO __CTest (t1,t2) VALUES (458,'test 458');
INSERT INTO __CTest (t1,t2) VALUES (459,'test 459');

ВыполнитьИнструкцию(текстзапроса) выполняется без ошибок, но в таблицу добавляются только первые 457 записей
Проявляется в том числе на версии 3.0.1.26

В студии данный запрос добавляет все строки
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не срабатывает более 457 INSERTов в одном запросе
Ответ #1 - 16. Февраля 2010 :: 13:34
Печать  
dbf , sql
если sql то какая версия ?
  
Наверх
 
IP записан
 
Old_Joe
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Зарегистрирован: 16. Февраля 2010
Re: Не срабатывает более 457 INSERTов в одном запросе
Ответ #2 - 16. Февраля 2010 :: 13:36
Печать  
SQL 2005
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не срабатывает более 457 INSERTов в одном запросе
Ответ #3 - 16. Февраля 2010 :: 13:58
Печать  
очень все сомнительно
приведи скрипт полностью.
и структуру таблицы и ее индексы
Таблица имеет отношение к таблице 1с или нет ?

также какой sql2005 и какой sp
  
Наверх
 
IP записан
 
Old_Joe
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Зарегистрирован: 16. Февраля 2010
Re: Не срабатывает более 457 INSERTов в одном запросе
Ответ #4 - 16. Февраля 2010 :: 14:15
Печать  
Таблица живйт в одной базе с 1с, в данный момент отношение к 1с косвенное (локализую баги)
SQL 9.00.1399.06 крутится на XP SP3

Таблица без индексов, создана для теста

CREATE TABLE [dbo].[__CTest](
     [t1] [decimal](18, 0) NULL,
     [t2] [nchar](20) COLLATE Cyrillic_General_CI_AS NULL
) ON [PRIMARY]

Код
Выбрать все
Процедура Сформировать()
	Запрос = СоздатьОбъект("ODBCRecordset");
	ММ=1;
	Пока 1=1 Цикл
		ММ=ММ+1;
		Состояние(ММ);
		ТекстЗапроса = "
		|DELETE
		|FROM __CTest
		|";
		ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
		ТекстЗапроса = "";
		Для а=1 По ММ Цикл
			ТекстЗапроса = ТекстЗапроса + "INSERT INTO __CTest (t1,t2) VALUES ("+Строка(а)+",'test "+Строка(а)+"'); "+РазделительСтрок;
		КонецЦикла;
		ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);

		ТекстЗапроса2 = "
		|SELECT *
		|FROM __CTest
		|";
 		ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса2);

 		Если ТЗ.КоличествоСтрок()<>ММ Тогда
 			Сообщить("ММ="+ММ);
 			Сообщить("РЗ="+СтрДлина(ТекстЗапроса));
 			Сообщить("РЗКС="+СтрКоличествоСтрок(ТекстЗапроса));
 			Прервать;
 		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
 



Этод код написал чтобы определить почему некоректно выполняются большие запросы.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не срабатывает более 457 INSERTов в одном запросе
Ответ #5 - 16. Февраля 2010 :: 15:15
Печать  
строка переполняется.
нет никакого смысла загонять все в одну гиганскую строку
надо писать так

Для а=1 По ММ Цикл
     ТекстЗапроса = "INSERT INTO __CTest (t1,t2) VALUES ("+Строка(а)+",'test "+Строка(а)+"');
     ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
КонецЦикла;


  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не срабатывает более 457 INSERTов в одном запросе
Ответ #6 - 16. Февраля 2010 :: 15:20
Печать  
Old_Joe писал(а) 16. Февраля 2010 :: 13:30:
ВыполнитьИнструкцию(текстзапроса) выполняется без ошибок, но в таблицу добавляются только первые 457 записей

А если вписать set nocount on в начало запроса?
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Old_Joe
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Зарегистрирован: 16. Февраля 2010
Re: Не срабатывает более 457 INSERTов в одном запросе
Ответ #7 - 16. Февраля 2010 :: 15:35
Печать  
Нет никакой разницы выполняются запросы вида
INSERT INTO __CTest (t1) VALUES (1);
или
INSERT INTO __CTest (t1,t2) VALUES (1,'test 1');
а также более тяжелые по текстовому содержанию, во всех случаях у меня получается затык после 457 INSERTa

Вы запускали мой код?

Выполнять каждый Insert своим запросом не допустимо, т.к. время выполнения большого запроса сопоставимо с временем выполнения одного малого запроса,(Одновременно работают более 100 пользователей) в результате получаем замедление участка кода во много раз... Ужас

  
Наверх
 
IP записан
 
Old_Joe
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Зарегистрирован: 16. Февраля 2010
Re: Не срабатывает более 457 INSERTов в одном запросе
Ответ #8 - 16. Февраля 2010 :: 15:43
Печать  
berezdetsky писал(а) 16. Февраля 2010 :: 15:20:
А если вписать set nocount on в начало запроса?


Помогло 50 000 инсертов одним запросом прошло...

Огромное спасибо!
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не срабатывает более 457 INSERTов в одном запросе
Ответ #9 - 16. Февраля 2010 :: 15:51
Печать  
Old_Joe писал(а) 16. Февраля 2010 :: 15:35:
Нет никакой разницы выполняются запросы вида
INSERT INTO __CTest (t1) VALUES (1);
или
INSERT INTO __CTest (t1,t2) VALUES (1,'test 1');
а также более тяжелые по текстовому содержанию, во всех случаях у меня получается затык после 457 INSERTa

Вы запускали мой код?

Выполнять каждый Insert своим запросом не допустимо, т.к. время выполнения большого запроса сопоставимо с временем выполнения одного малого запроса,(Одновременно работают более 100 пользователей) в результате получаем замедление участка кода во много раз... Ужас


А строка в 1с бесконечная ?
А пакеты odbc тоже имеют бесконечную длину ?
а длина буферов в odbc
ТАкже можно использовать параметризацию через ТЗ ( сам никогда не писал).

В чем ты хочешь выиграть вообще не понятно сколько строк в минуту вводиться с одного конекта ?





  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Не срабатывает более 457 INSERTов в одном запросе
Ответ #10 - 17. Февраля 2010 :: 05:58
Печать  
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать