Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Удаление записей прямым запросом к DBF... (число прочтений - 5810 )
Alex_Spb
Junior Member
**
Отсутствует



Сообщений: 43
Местоположение: Санкт-Петербург
Зарегистрирован: 21. Февраля 2008
Пол: Мужской
Удаление записей прямым запросом к DBF...
16. Марта 2008 :: 13:26
Печать  
Добрый день.
Обнаружил такую пренеприятную новость, что прямые запросы на Delete умирают
при определенных размерах файлов.  Нерешительный
Исходные данные :
файл 1SCRDOC - размер 290 Мб (5,5 млн записей).
Хочу удалить порядка 10 % записей.
Комп : 3 Ггц Celeron D , 2 Гб Ram, Обычный IDE винт 7200 rpm., стоит Win XP и MS Ofiice, Fox Pro Ole Db ver 9, 1С++ 2.5.0.1

Текст обработки:
Код
Выбрать все
	База = СоздатьОбъект("OLEDBData");
	Соединение = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + КаталогИБ_+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN=""";
	Рез = База.Соединение(Соединение);
	Запрос = База.СоздатьКоманду();
	ТекстЗапроса = "
	|DELETE    
	|  1SCRDOC
	|FROM
	|  1SCRDOC  as Ссылки
	|WHERE
	|  Ссылки.CHILDDATE BETWEEN :НачДата~~ AND :КонДата~~
	|";


	Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата);
	Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата);  
	Запрос.Отладка(1);
                Уд = Запрос.Выполнить(ТекстЗапроса);

 


Интервал дат ставлю 3 месяца  (когда ставил интервал 1 день тоже не дождался).
В итоге , всё затыкается, и за 10 часов результата дождаться не удалось...
Причём если размер файла 80 Мб всё выполняется за 1 мин.

При этом MS Access удаляет записи  из 1SCRDOC при тех же услових  (размер 290 Мб (5,5 млн записей) за 2-3 минут).
Не могу понять почему тогда 1С - ка затыкается на нём.
Может кто знает в чём проблема ?
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Удаление записей прямым запросом к DBF...
Ответ #1 - 16. Марта 2008 :: 13:39
Печать  
А Access через какой драйвер работает?

Попробуй для начала заменить DELETE на SELECT и посмотреть что он вернет
  
Наверх
ICQ  
IP записан
 
Alex_Spb
Junior Member
**
Отсутствует



Сообщений: 43
Местоположение: Санкт-Петербург
Зарегистрирован: 21. Февраля 2008
Пол: Мужской
Re: Удаление записей прямым запросом к DBF...
Ответ #2 - 16. Марта 2008 :: 13:57
Печать  
Nick писал(а) 16. Марта 2008 :: 13:39:
А Access через какой драйвер работает?

В Access (2007) делаю новую базу,  выбираю связать с источником данных (файл dbase),
выбираю файл dbf. потом делаю запрос на delete.


Nick писал(а) 16. Марта 2008 :: 13:39:
Попробуй для начала не заменить DELETE на SELECT и посмотреть что он вернет

Select возвращает 4000 записей, отрабатывает за 6 секунд.

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



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Удаление записей прямым запросом к DBF...
Ответ #3 - 16. Марта 2008 :: 14:05
Печать  
а попробуй так:

Код
Выбрать все
|DELETE    
|FROM
|  1SCRDOC  as Ссылки
|WHERE
|  Ссылки.CHILDDATE BETWEEN :НачДата~~ AND :КонДата~~  

  
Наверх
ICQ  
IP записан
 
Alex_Spb
Junior Member
**
Отсутствует



Сообщений: 43
Местоположение: Санкт-Петербург
Зарегистрирован: 21. Февраля 2008
Пол: Мужской
Re: Удаление записей прямым запросом к DBF...
Ответ #4 - 16. Марта 2008 :: 14:30
Печать  
Nick писал(а) 16. Марта 2008 :: 14:05:
а попробуй так:

Код
Выбрать все
|DELETE    
|FROM
|  1SCRDOC  as Ссылки
|WHERE
|  Ссылки.CHILDDATE BETWEEN :НачДата~~ AND :КонДата~~  



Выдаёт ошибку синтаксиса.

DELETE    
FROM
 1SCRDOC  as Ссылки
WHERE
 Ссылки.CHILDDATE BETWEEN {d '2005-01-01'} AND {d '2005-03-31'}
Уд = Запрос.Выполнить(ТекстЗапроса);
{E:\1CPP.ERT(49)}: FAILED! ICommandText::Execute(): Syntax error.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Удаление записей прямым запросом к DBF...
Ответ #5 - 16. Марта 2008 :: 14:50
Печать  
Вот такой код в VFP точно работает:

Код
Выбрать все
USE 1SCRDOC  IN 0 ALIAS Ссылки
DELETE FROM  Ссылки   WHERE  Ссылки.CHILDDATE BETWEEN CAST("2005-01-01" as datetime) AND CAST("2005-03-31" as datetime)
 



Вот это тоже отрабатывает без ошибок:
Код
Выбрать все
	ОлеДБКоманда.Выполнить("EXECSCRIPT('USE 1SCRDOC  IN 0 ALIAS Ссылки')");
	ОлеДБКоманда.Выполнить("EXECSCRIPT('DELETE FROM  Ссылки   WHERE  Ссылки.CHILDDATE BETWEEN CAST(""2005-01-01"" as datetime) AND CAST(""2005-03-31"" as datetime)')"); 



Хотя результат не проверял

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



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Удаление записей прямым запросом к DBF...
Ответ #6 - 16. Марта 2008 :: 15:09
Печать  
а вот формат даты должен быть не "2005-01-01" - конвертится в пустую дату, а
"01.01.2005"
хотя это зависит от установки SET DATE
  
Наверх
ICQ  
IP записан
 
Alex_Spb
Junior Member
**
Отсутствует



Сообщений: 43
Местоположение: Санкт-Петербург
Зарегистрирован: 21. Февраля 2008
Пол: Мужской
Re: Удаление записей прямым запросом к DBF...
Ответ #7 - 16. Марта 2008 :: 16:58
Печать  
Nick писал(а) 16. Марта 2008 :: 14:50:
Вот такой код в VFP точно работает:

Вот это тоже отрабатывает без ошибок:
Код
Выбрать все
	ОлеДБКоманда.Выполнить("EXECSCRIPT('USE 1SCRDOC  IN 0 ALIAS Ссылки')");
	ОлеДБКоманда.Выполнить("EXECSCRIPT('DELETE FROM  Ссылки   WHERE  Ссылки.CHILDDATE BETWEEN CAST(""2005-01-01"" as datetime) AND CAST(""2005-03-31"" as datetime)')"); 



Хотя результат не проверял


Попробовал , отрабатывает без ошибок и очень быстро,
но ничего не удаляет.
Ставил потом селект, все данные на месте.
Если в vfp всё работает похоже это какой то глюк 1c++.

Тем не менее спасибо за помощь, буду думать чё делать дальше.


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



Сообщений: 43
Местоположение: Санкт-Петербург
Зарегистрирован: 21. Февраля 2008
Пол: Мужской
Re: Удаление записей прямым запросом к DBF...
Ответ #8 - 16. Марта 2008 :: 16:58
Печать  
Nick писал(а) 16. Марта 2008 :: 15:09:
а вот формат даты должен быть не "2005-01-01" - конвертится в пустую дату, а
"01.01.2005"
хотя это зависит от установки SET DATE

даты тоже переставлял по всякому эффекта никакого.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Удаление записей прямым запросом к DBF...
Ответ #9 - 16. Марта 2008 :: 19:02
Печать  
Попробуй так :
Код
Выбрать все
База = СоздатьОбъект("OLEDBData");
	Соединение = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + КаталогИБ_+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=MACHINE;DSN=""";
	Рез = База.Соединение(Соединение);
	Запрос = База.СоздатьКоманду();
	ТекстЗапроса = "
	|DELETE
	|  Ссылки
	|FROM
	|  1SCRDOC  as Ссылки
	|WHERE
	|  Ссылки.CHILDDATE BETWEEN :НачДата~~ AND :КонДата~~
	|";


	Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата);
	Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата);
		    Уд = Запрос.Выполнить(ТекстЗапроса); 


весь код, включая строку подключения
  
Наверх
 
IP записан
 
Alex_Spb
Junior Member
**
Отсутствует



Сообщений: 43
Местоположение: Санкт-Петербург
Зарегистрирован: 21. Февраля 2008
Пол: Мужской
Re: Удаление записей прямым запросом к DBF...
Ответ #10 - 18. Марта 2008 :: 07:23
Печать  
Да, так всё сработало , удалилось в течение 3 минут  Очень довольный. Спасибо.
Странный синтаксис у фоксового sql.

А можно запросом упаковать таблицу ?

Сделал
Запрос.Выполнить("pack 1SCRDOC"), но не помогло
отработало без ошибки, а таблица не упаковалась.

kiruha писал(а) 16. Марта 2008 :: 19:02:
Попробуй так :
Код
Выбрать все
База = СоздатьОбъект("OLEDBData");
	Соединение = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + КаталогИБ_+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=MACHINE;DSN=""";
	Рез = База.Соединение(Соединение);
	Запрос = База.СоздатьКоманду();
	ТекстЗапроса = "
	|DELETE    
	|  Ссылки
	|FROM
	|  1SCRDOC  as Ссылки
	|WHERE
	|  Ссылки.CHILDDATE BETWEEN :НачДата~~ AND :КонДата~~
	|";


	Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата);
	Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата);  
		    Уд = Запрос.Выполнить(ТекстЗапроса); 


весь код, включая строку подключения

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



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Удаление записей прямым запросом к DBF...
Ответ #11 - 18. Марта 2008 :: 07:30
Печать  
pack работает только в монопольном режиме
ну и возможно Fox не умеет работать с именами таблиц начинающихся с цифр. Используй Use
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Удаление записей прямым запросом к DBF...
Ответ #12 - 18. Марта 2008 :: 07:45
Печать  
kiruha писал(а) 16. Марта 2008 :: 19:02:
Код
Выбрать все
База = СоздатьОбъект("OLEDBData");
	Соединение = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + КаталогИБ_+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=MACHINE;DSN=""";
	Рез = База.Соединение(Соединение);
	Запрос = База.СоздатьКоманду();
	ТекстЗапроса = "
	|DELETE    
	|  Ссылки
	|FROM
	|  1SCRDOC  as Ссылки
	|WHERE
	|  Ссылки.CHILDDATE BETWEEN :НачДата~~ AND :КонДата~~
	|";


	Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата);
	Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата);  
		    Уд = Запрос.Выполнить(ТекстЗапроса); 


весь код, включая строку подключения

Кирилл, пожалуйста, занеси этот код с описанием в ветку ФАК-а по прямым запросам - чтобы не забылось.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Удаление записей прямым запросом к DBF...
Ответ #13 - 18. Марта 2008 :: 08:09
Печать  
artbear писал(а) 18. Марта 2008 :: 07:45:
kiruha писал(а) 16. Марта 2008 :: 19:02:
Код
Выбрать все
База = СоздатьОбъект("OLEDBData");
	Соединение = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + КаталогИБ_+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=MACHINE;DSN=""";
	Рез = База.Соединение(Соединение);
	Запрос = База.СоздатьКоманду();
	ТекстЗапроса = "
	|DELETE    
	|  Ссылки
	|FROM
	|  1SCRDOC  as Ссылки
	|WHERE
	|  Ссылки.CHILDDATE BETWEEN :НачДата~~ AND :КонДата~~
	|";


	Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата);
	Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата);  
		    Уд = Запрос.Выполнить(ТекстЗапроса); 


весь код, включая строку подключения

Кирилл, пожалуйста, занеси этот код с описанием в ветку ФАК-а по прямым запросам - чтобы не забылось.



Да нет тут никакого ФАК-а. Объяснять что  Collating Sequence=MACHINE я уже везде написал где можно.
Народ упорно откуда то берет RUSSIAN.
Когда выборка еще полбеды - ну CDX просто не используется. При Delete же требуется еще и перестройка CDX.
Что касается запроса - также никто не пишет же
Код
Выбрать все
SELECT
SC33.id
FROM SC33 as СпрНом 

- запрос даже выполнится, но покажет ерунду
  
Наверх
 
IP записан
 
Alex_Spb
Junior Member
**
Отсутствует



Сообщений: 43
Местоположение: Санкт-Петербург
Зарегистрирован: 21. Февраля 2008
Пол: Мужской
Re: Удаление записей прямым запросом к DBF...
Ответ #14 - 18. Марта 2008 :: 13:34
Печать  
kiruha писал(а) 18. Марта 2008 :: 08:09:
Да нет тут никакого ФАК-а. Объяснять что  Collating Sequence=MACHINE я уже везде написал где можно.
Народ упорно откуда то берет RUSSIAN.


Я взял из последней версии документации (учебник...)
Цитата:
Для DBF версии рекомендуется использовать объект “ OLEDBData”(для версии 1С++ 2.0.0.0 и выше) следующим образом:

        База = СоздатьОбъект("OLEDBData");

        Соединение = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + КаталогИБ()+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN=""";

А delete писал по аналогии с главой 10, т.е. там (в chm документации) есть неточности.

kiruha писал(а) 18. Марта 2008 :: 08:09:
Что касается запроса - также никто не пишет же
Код
Выбрать все
SELECT
SC33.id
FROM SC33 as СпрНом 

- запрос даже выполнится, но покажет ерунду


В селектах не пишет, но у фокса похоже какой то хитрый (отличный от mssql) синтаксис Delete.
конструкция типа delete from 1scrdoc where ....
почему то не работает.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать