ADODB: Прямая запись и другие операции с SQL - таблицами (MS SQL server 2000)

31.10.13

Интеграция - Внешние источники данных

В каком случае имеет смысл прямая запись в SQL – таблицу?
Как ускорить процесс записи в SQL - таблицу?
Запись данных
Архивирование
Статья для новичков (обновленная версия от 23.03.2011)

В каком случае имеет смысл прямая запись в SQL-таблицу?

Когда может понадобиться прямая запись в SQL-таблицу на платформе 1С 8.1?

В нашем случае таблица регистра 1С8.1 использовалась как источник для перекачки данных в другую учетную базу. Некоторое время все работало средствами 1С. Но настал момент, когда процесс записи регистра стал занимать неприлично много времени. При этом все данные в регистре «остро необходимы».

Как ускорить процесс записи в SQL-таблицу

После некоторых мытарств (превзойти 1С в плане оптимизации работы с SQL мне не удалось), встал вопрос об индексации таблицы. В итоге было решено скопировать таблицу регистра в отдельную таблицу и убить все индексы, что в разы ускорило процесс прямой записи.

Далее описана реализация процесса записи в SQL-таблицу без индексов.

Пример ТЗ

Разберем на конкретном примере.

Допустим, что перед нами стоят задачи:

  • Собирать по определенным счетам проводки за период в разрезе организаций (Орг) и сценариев (Сцен), обрабатывать эти данные по известным правилам и записывать данные в таблицу отдельной базы
  • Записи за период по организациям и сценариям должны перезаписываться
  • Необходимо архивировать таблицу в виде копий на дату

 

Полезная литература:

  1. Using Connection Pooling with SQL server
  2. Understanding ADO Transactions with MS SQL Server
  3. Использование библиотеки ADO
  4. Руководство по производительности загрузки данных (SQL server 2005 и SQL server 2008)
  5. Справочник по Transact-SQL (компонент Database Engine)
  6. ADO CreateParameter Metod

 

Реализация

Создание базы

Для создания базы нам потребуется "Enterprise Manager" (рис.1)

Рис 1.

Открыв "Enterprise Manager". позиционируемся на папке "Databases" и щелчком правой кнопки мыши создаем новую базу (рис.2).

Рис 2.

Создаем базу (рис.3).

Рис 3.

Настройка базы изображена на рис.4 и 5

Рис 4.

Рис 5.

(T-SQL:
Create DataBase MyBase
Alter DataBase MyBase SET Recovery Simple
Alter DataBase MyBase SET Auto_Shrink ON)

 

Создание таблицы

Откроем нашу базу, спозициониремся на "Tables" и правой кнопкой мыши - создать новую таблицу (рис. 6)

Рис 6.

Следуя ТЗ, мы имеем "ключевые" поля:

 

  • Период
  • Организация (Орг)
  • Сценарий (Сцен)

 

Остальные поля представим в виде основных типов данных (рис. 7). Типы значений и их длина взяты на примере регистра 1С.

Рис 7.

Таким образом, мы имеем таблицу "MyTable" (рис. 8):

Рис 8.

Для корректной работы пишем Организацию и Сценарий в виде ссылок (рис. 8). Это нам понадобиться в дальнейшем.

(T-SQL:
Create Table MyBase.dbo.MyTable (ПолеПериод DateTime, ПолеОргСсылка binary(16), ПолеСценСсылка binary(16), ПолеСтрока nvarchar(100), ПолеБулево binary(1), ПолеСумма decimal(15,2))

)

 

Форма обработки

Рис 9.

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

 

Сбор и обработка данных

В данном случае этот процесс не представляет интереса. В конечном итоге имеем таблицу значений "таблицаДанных"

 

Очистка таблицы, запись в регистр

Будем использовать следующую схему:

--> НачатьТранзакцию

----> ОчиститьРегистр

----> ЗаписатьРегистр

--> ЗафиксироватьТранзакцию

 

Не буду приводить весь код обработки, остановлюсь лишь на основных моментах.

 

СтрокаКоннекта = "Provider=SQLOLEDB;Password=sdR$543Qr;Persist Security Info=True;User ID= userSQL;Initial Catalog=MyBase;Data Source=serverSQL";

 

 

//Источник получения GUID: Mista.ru

// конец источника

Далее собственные изыскания:


 

Фрагмент кода очистки и записи в регистр:

Необходимо отметить, что в приведенном выше фрагменте кода "FIRM" - Организация, "BASE" - Сценарий, "Entity_Name" - пример строкового значения, "InRep" - булево и "SUMM" - сумма.

 

Архивирование таблиц

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

 

 

SQL ADODB прямая запись insert

См. также

Внешние источники данных Программист Бизнес-аналитик Пользователь Платформа 1С v8.3 Управляемые формы Анализ и прогнозирование Конфигурации 1cv8 Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

28500 руб.

15.11.2022    20661    20    49    

38

Поиск данных Внешние источники данных Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Если вам нужно автоматически генерировать представления (view) к вашей базе данных 1С (есть две версии - для СУБД MS SQL Server и для PostgreSQL) по структуре метаданных 1С, то вам необходима данная обработка. Наш "Генератор View", другими словами - это коннектор к данным 1С для Power BI - незаменимый помощник для бизнес-аналитиков, работающих с базами 1С из Yandex Datalens/Power BI и т.д. Работает для обычных и управляемых форм под 1С 8.3

230000 руб.

31.07.2020    13738    13    48    

25

Внешние источники данных Зарплата Бюджетный учет Программист Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

48000 руб.

24.04.2017    51036    101    165    

89

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    10779    13    8    

14

Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    25040    23    1    

25

Производство готовой продукции (работ, услуг) Внешние источники данных Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

Обработка предназначена для загрузки файлов, выгруженных из системы Базис-мебельщик, в справочник 1С "Спецификации" для последующих процессов учета и диспетчирования полуфабрикатов и изделий.

10200 руб.

24.06.2021    20694    57    53    

35
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. djd.sf 04.02.11 14:14 Сейчас в теме
Советую сделать ввиде статьи, нафига это качать потому, как непонятно, ничего там такого эзотерического нет...одним словом - для новичков.
artbear; jan27; +2 Ответить
2. jan27 733 04.02.11 14:17 Сейчас в теме
(1) учел ваше замечание, сделал пометку в анонсе
3. Ivon 676 04.02.11 14:33 Сейчас в теме
(2). Совет был не в том, чтобы добавить пометку "для новичков", а в том, чтобы переделать обработку в статью.
Добавлено
Да и статья как-то не очень. Куча текста, а зачем - непонятно.
4. jan27 733 04.02.11 14:41 Сейчас в теме
(3) я так полагаю, всем не угодишь одним текста мало, другим много
файл решил оставить на загрузке, добавив пометку в анонсе
5. Ivon 676 04.02.11 14:52 Сейчас в теме
(4). Да всем годить не надо. Если у тебя текст - оформляй как статью. Если конфа, база, компонента, обработка или отчет, тогда прикрепляй соответствующий файл.
6. jan27 733 04.02.11 15:03 Сейчас в теме
(5) спасибо, учту на будущее
Можно я, в виде исключения как тутошний новичек, эту статью оставлю в виде файла? Или таки надо переделать?
7. Ivon 676 04.02.11 15:09 Сейчас в теме
(6). Дело твое, конечно, я же не модератор. Только учитывай то, что те, кому может понадобиться эта информация, по каким-то причинам просто не скачают файл, а значит не узнают что в файле, а это в свою очередь значит, что они не будут иметь возможности понять, что именно это им и нужно.
artbear; jan27; +2 Ответить
8. jan27 733 04.02.11 15:12 Сейчас в теме
(7)Да..., с этой точки зрения я не рассматривал. Тут же ограничение на количество скачиваний. В ближайшее время переделаю.
Styvi; artbear; +2 Ответить
9. Alraune 1505 04.02.11 15:16 Сейчас в теме
Как вариант, можно просто здесь изложить кратко основные положения, а полный текст в файле, если много иллюстраций и сложно все оформлять статьей.
18. jan27 733 04.02.11 16:05 Сейчас в теме
(9) эх вот ведь, так и было изначально...
10. пользователь 04.02.11 15:31
Сообщение было скрыто модератором.
...
11. пользователь 04.02.11 15:37
Сообщение было скрыто модератором.
...
13. пользователь 04.02.11 15:56
Сообщение было скрыто модератором.
...
15. artbear 1563 04.02.11 16:00 Сейчас в теме
(13) Не путай людей - лицензия 1С расходится со статьями соответствующего закона.
ЗЫ КАК МОДЕРАТОР предупреждаю - говорим только по теме этой статьи, считаю разговоры о лицензии для сабжа оффтопиком и буду удалять посты о лицензии.
23. w-divin 04.02.11 16:12 Сейчас в теме
(15) ваше право, но ИМХО когда учите людей (особенно новичков, которым адресована данная статья) стоит предупреждать их о возможных последствиях использования полученных навыков
31. jan27 733 04.02.11 16:31 Сейчас в теме
(23) на мой взгляд в статье четко указано в каких случаях можно это использовать
12. Ish_2 1112 04.02.11 15:39 Сейчас в теме
Лучше переделать. Потренироваться в редактировании и расположении рисунков прямо в тексте .
Сейчас тема не открывается в IE8.

Подход , описанный в статье :
Откажемся от регистра для хранения информации из-за медленной записи
И будем использовать SQl-таблицы.

- представляется глубоко ошибочным.

Для решения таких задач нужно использовать справочник с табличной частью.
Табличная часть справочника - это обычная таблица SQL без индексов.

На всякий случай (про запись в табличную часть справочника) :

"Если менялись только отдельные строки табличной части или добавлялись новые строки, то будут записаны только измененные или добавленные строки." (с) Радченко с.42. "Профессиональная разработка в системе 1сПредприятие8"
Другими словами запись в табличную часть уже оптимизирована.
14. artbear 1563 04.02.11 15:57 Сейчас в теме
(12) Цитата "Табличная часть справочника - это обычная таблица SQL без индексов." неверна.
Цитата из почти официальной статьи на kb.1c.ru
Табличная частьДля всех таблиц, которые предоставляют доступ к табличным частям объектов.

Индекс Условие
Ссылка + Ключ (Кластерный) Всегда.
Реквизит Объект конфигурации включен в критерий отбора через реквизит "Реквизит" табличной части или для реквизита табличной части установлено свойство "Индексировать".
17. Ish_2 1112 04.02.11 16:05 Сейчас в теме
(14) Ты приведи связный текст цитаты (сейчас набор символов), приведи точную ссылку.
Я же подразумеваю прежде всего , что таблиная часть не содержит тех обязательных индексов на измерения в регистре и запись в табличную часть осуществляется значительно быстрее , чем в регистр.
20. artbear 1563 04.02.11 16:09 Сейчас в теме
(17) Вот и писал бы точную фразу, а не подразумевал что-то, что путает :)
С (17) согласен, с (12) нет
22. Ish_2 1112 04.02.11 16:11 Сейчас в теме
(20) Постой я, правда , не знаю какие индексы на табличную часть будут , если ни на один реквизит табличной части не поставлено "Индексировать". Тебе трудно что ли ссылку дать ?
24. пользователь 04.02.11 16:16
Сообщение было скрыто модератором.
...
25. пользователь 04.02.11 16:19
Сообщение было скрыто модератором.
...
28. Ish_2 1112 04.02.11 16:26 Сейчас в теме
(26) Ага , прочитал.
Для справочника с табличной частью и отсутсвием реквизитов в табличной части с признаком Индексировать
индекс будет только один "Ссылка + Ключ (Кластерный)" . Спасибо.
21. artbear 1563 04.02.11 16:11 Сейчас в теме
(17) У меня нет сейчас доступа к этой закрытой части сайта :)
Вот начало статьи (думаю, что этого достаточно)
«« Рубрикатор / Просмотр статьи (ID: 20)

Разделы рубрикатора:
/ Техническая информация / 1С:Предприятие 8.1

Индексы таблиц базы данных
Автор: Рупасов Константин (1С, Москва)

ЗЫ вроде что-то такое еще на ИТС есть.
И в "гроссбухе" на 1000 страниц (название не помню) также эта инфа должна быть
16. jan27 733 04.02.11 16:02 Сейчас в теме
(12) сейчас приемлемо отображается?
19. artbear 1563 04.02.11 16:07 Сейчас в теме
(16) Нет, неверное отображение, последнее,что видно
<!--[endif]--><!--[if !vml]--><!--[endif]-->
27. artbear 1563 04.02.11 16:24 Сейчас в теме
(16) Все также, теперь осталось
<!--[if !vml]--><!--[endif]-->
29. jan27 733 04.02.11 16:30 Сейчас в теме
(27) вроде победил <!--[if !vml]--><!--[endif]-->
33. artbear 1563 04.02.11 16:41 Сейчас в теме
(29) да, с отображением статьи все хорошо.
30. Ish_2 1112 04.02.11 16:30 Сейчас в теме
Сама же статья поучительна тем , что даёт предметный урок "новичкам":
прежде чем изобретать - изучи встроенные возможности платформы 1с.
32. jan27 733 04.02.11 16:41 Сейчас в теме
(30) а какое решение вы бы предложили в ситуации, описанной в статье?
34. Ish_2 1112 04.02.11 16:55 Сейчас в теме
(32) Использовать для хранения таких таблиц справочник с табличной частью.
Такой подход даёт максимально быструю запись , не требует ADO-соединения к внешней базе.
Что по само по себе является большим выигрышем , по сранению с Вашим подходом.
И цель моего выступления была именно в этом.
Конкретный же сценарий обработки таких данных - это отдельный разговор и требует отдельной статьи и со сравнительным анализом. В планах у меня нет такой статьи.
35. tango 545 04.02.11 19:51 Сейчас в теме
(0) Ведь платформа 1С 8.х оптимизирована для работы с SQL!
С этого места по-подробнее, пожалуйста.
cool.vlad4; +1 Ответить
36. jan27 733 07.02.11 09:21 Сейчас в теме
(35) речь о запросах
у вас есть иные данные? Хотелось бы ознакомиться
37. tango 545 07.02.11 09:35 Сейчас в теме
(36) хм... о запросах, да?
ок, что есть "оптимизация" по-вашему и что, соответственно вашему определению "оптимизации", оптимизировано в 8 для работы с запросами?

что касается моего ИМХО, то 1ска просто делает запросы к скл как может :)
в скльном "диалекте" 1С есть некоторые "примочки" типа "через" точку, но назвать это "оптимизацией для скл" я бы не риснул
39. cool.vlad4 2 07.02.11 11:55 Сейчас в теме
Присоединяюсь к (35) . Это, что значит? Если оптимизирована с SQL запросами, по вашеиу тогда зачем люди напрямую обращаются к sql и тогда о чем ваша статья? Ведь бывает что - пусть уж лучше в некоторых случаях связка com-ado, чем 1С запросы. По мне 1С как переводчик, а переводчики не всегда точны. И потом 1С запросы работают с сущностями, с объектами в отличие от SQL, который ни в пень ногой, что там за справочник и какие у него свойства. Потому сравнение запросов 1С и sql, и то что они там как-то оптимизированы весьма и весьма вопрос темный. ...."
PS Что в черном ящике?"(игра что?где?когда?)
40. Ish_2 1112 07.02.11 12:12 Сейчас в теме
(39) Не спеши присоединяться к (35). Этот пост ни о чём , т.е. пальцем в небо.
Лучше думать своей головой.

Первая задача 1с-ника изучить встроенные возможности платформы и эффективно их использовать.
Если кто-то крикнул , что ему не хватает встроенных возможностей платформы в типовых учетных задачах -
в 99.99% случаях он просто не умеет решать задачи.
41. cool.vlad4 2 07.02.11 12:51 Сейчас в теме
(40) Я вообще не о том...я про странные высказывания - то, что 1С 8 оптимизирована с SQL - что это значит? Как, по сравнению с чем и откуда такие сведения.
ЗЫ А первая задача 1С-ника - это руководствоватся первой задачей программиста - быстрый, качественный результат за минимум необходимых средств и действий. Вряд ли 1С-ник, если потребуется один раз сравнить таблицы из базы 1С и из другой базы(тоже на SQL) будет использовать 1С.
38. jan27 733 07.02.11 11:08 Сейчас в теме
(38) а если сравнить с 1С 7.7?
42. tango 545 07.02.11 13:17 Сейчас в теме
(38) а попу с пальцем? то же самое. имхо, сравнивать 77 и 8 - некорректно
http://michael.com.ru/article.aspx?id=6
http://michael.com.ru/article.aspx?id=8
43. tango 545 07.02.11 14:14 Сейчас в теме
вот еще, с чем и как сравнивать, например:
http://gilev.blogspot.com/search/label/axapta
44. romansun 194 09.02.11 19:04 Сейчас в теме
|AND V8_InfoReg1152_1.V8_Fld6853 =


Для новичков всё-таки это круто очень. Не отквоченный кусок в смысле, а вообще прямой доступ к sql. Можно ведь сломать базу с концами..
Если б я увидел новичка, ковыряющего в 1С-ной sql таблице, отправил бы его на галеры :).


По статье - не нашел как новичку определить, что поле "V8_InfoReg1152_1.V8_Fld6853" это именно нужный ему реквизит из нужного ему регистра. Кроме того, если планируется частое обращение к sql, лучше сразу создать view с названиями таблиц и полей по образу и подобию 1С метаданных и не попадать в ситуацию, когда становится мучительно больно от одной перепутанной цифры во всех этих "reg", "fld" и пр.

Наверное, есть уже удобные и простые обработки автоматически создающие view по метаданным 1С?
45. cool.vlad4 2 09.02.11 21:53 Сейчас в теме
(44) Доступ к SQL проходят на втором, третьем курсе института. Те же, кто не учил это в институте - сталкиваются с доступом sql, когда работают с базами даннами. А 1С здесь частный случай.
ЗЫ Обработок создающих view куча
46. cool.vlad4 2 09.02.11 22:07 Сейчас в теме
(44) Чего-то найти не могу...проще самому наверное написать скрипт - CREATE VIEW DBO.Справочник_Траляля
ЗЫ на работе у меня точно такая штука есть
47. jan27 733 09.02.11 23:39 Сейчас в теме
(44) хватит придираться ))))
забыл поменять V8_InfoReg1152_1.V8_Fld6853 на MyTable.ПолеСценСсылка )))))

так на всякий случай, это таблица не 1с, а всего-лишь её копия: V8_ и _1 должны вам что-то говорить
48. jan27 733 10.02.11 09:40 Сейчас в теме
(44) Для определения поля и самой таблицы http://infostart.ru/public/14635/ в помощь
49. romansun 194 10.02.11 11:33 Сейчас в теме
(48)
Я искренне восхищен интергратором и объемом проделанной работы,.. но стараюсь по возможности обходится программами с меньшим количеством кнопок и окон :).

http://infostart.ru/public/19821/ - вот эта очень нравится.
50. jan27 733 10.02.11 14:08 Сейчас в теме
(49) спасибо за ссылочку, простенько и со вкусом
51. speshuric 1338 13.02.11 11:50 Сейчас в теме
1. А почему Вопрос() в транзакции? Да, я понимаю, что нет ни repeatable read, ни holdlock, ни serializable, но всё равно как-то криво.
2. CONVERT(DateTime,'"+Формат(НачалоДня(ДатаНач), "ДФ = ""YYYY.MM.dd HH:mm:ss""")+"' ) не совсем правильно. В соответствии с http://msdn.microsoft.com/en-us/library/ms190234%28SQL.90%29.aspx лучше исльзовать формат { ts '1998-05-02 01:23:56.123' } или { ts '1998-05-02 01:23:56' }
3. Много мелких неаккуратностей: использование "Conn.Execute("BEGIN TRANSACTION");" (а вдруг используется connection pooling?), нигде явно не указаны блокировки (то ли есть уверенность, что режимы по умолчнию подходят, то ли нет понимания темы), не указываются режимы исполнения ADO (т.е. зачем-то получаются рекордсеты при операциях DML), не используются параметры запросов (возможно, запросы бы ускорились) и многое другое
52. jan27 733 14.02.11 05:19 Сейчас в теме
(51) 1.- посоветуйте, как было бы лучше?
3. можно узнать подробнее о connection pooling?
если вас не затруднит, хотелось бы раскрытия темы по всему 3 пункту
53. speshuric 1338 14.02.11 21:28 Сейчас в теме
по первому пункту отвечу сегодня, по третьему завтра или чуть позже.
Тут момент такой, что управлять транзакциями с клиента - суть зло. Иногда необходимое зло, но всё равно возникает лишний момент, который надо постоянно учитывать. В данном случае - какая разница где начата транзакция в 1С или в АДО, если внутри транзакции работа сервера приостанавливается чтобы спросить у пользователя: "уверен?". Пользователь может несколько секунд думать, а если выполнение транзакции предполагает какую-то блокировку, то все будут ждать. Плюс автоматом манипулирование транзакциями на клиенте означает, что транзакцию нужно обеспечить в 2 системах (иначе прощай целостность данных). Плюс есть интересная специфика, если используется уровень изоляции readcommited snapshot. В данном-то случае всё относительно гладко - по умолчанию используется уровень изоляции readcommited и блокировка снимается сразу после завершения чтения запроса (тем более, что sysobjects в MS SQL 2005 и выше лишь представление над системными таблицами, и его использование, кстати, желательно исключать, заменяя на INFORMATION_SCHEMA.TABLES).
Еще сразу можно добить, что вообще говоря есть случаи (connection pooling), когда каждая из последовательных команд не гарантирует, что выполнится в одном и том же соединении, но опять же в данном случае, это к счастью не так.

Завтра допишу про остальное.

PS: ой, не заметил, что там в цикле с транзакцией и вопросом "drop table". Тогда вопросу() нет оправдания - блокировки будут накладываться Sch-M и до конца транзакции.
54. cool.vlad4 2 15.02.11 00:02 Сейчас в теме
Зачем надо знать, что таблица есть или нет. Поставте галку - перезаписывать или нет заранее. Затем есть такая вещь как NamedParameters. Ну и в качестве примера произвольный текст
|;
|SET ANSI_WARNINGS ON
|;
|SET NOCOUNT ON
|;
|SET ANSI_NULLS ON
|;
|if exists (select * from sysobjects where Чего там надо ) drop table какую надо
И здесь же сразу можно создать table.
Рекордсеты в этом случае излишне. Серверу, чтобы выполнять операции dml действительно не нужны.
locktype же - ну все зависит от ситуации. Если применительно к данной статье, то не думаю что стоит заморачиватся с connection pooling.
55. speshuric 1338 16.02.11 23:36 Сейчас в теме
Я не потерялся, просто немного загружен.
Итак. Про мелочи.
Про моё (не только моё) отношение к управлению транзакциями с клиента я основное сказал. Но есть еще момент. Посылая "BEGIN TRANSACTION" впрямую на сервер мы не учитываем, что некоторые провайдеры (ну и MS SQL тоже, но не в ADO, а в ADO.NET) могут работать в режиме пула соединений. Это прекрасно, что клиент быстро поднимает соединение из пула, вместо "долгого" ожидания создания соединения, но этот механизм сложнее. И глючнее. Т.е. "BEGIN TRANSACTION" гипотетически может уйти не в том соединении, что остальные запросы и "COMMIT", хоть и не в таком тривиальном случае. Нет, конечно, это обычно фиксится (разарботчиком драйвера), но зачем искать грабли, когда у соединения есть методы BeginTrans, CommitTrans и RollbackTrans?

Совсем не понятна конструкция
Conn.Open();
Conn.Execute("BEGIN TRANSACTION");
Conn.Execute(СтрокаЗапроса);
CONN.EXECUTE("COMMIT TRANSACTION");
Зачем такие пляски с транзакциями? Нужна транзакция - впихни в запрос. Только если использовать несколько команд в одном запросе, то стоит вначале вставлять "SET NOCOUNT ON;". На самом деле от транзакции тут только лишнее прыгание от 1С в ADO, поэтому проще убрать.

Странное замечание "Следует упомянуть, что для записи в таблицу SQL должны быть права владельца таблицы.". Я могу догадываться, что имелось ввиду (например то, что данному логину предлагается сопоставить пользователя БД со схемой dbo по умолчанию), но право же - неочевидно. Лучше приведите скрипты создания таблиц и логинов - это будет однозначно.

Неаккуратная работа со скобками в куске:
|CONVERT(DateTime,'"+Формат(стр.Период), "ДФ = ""YYYY.MM.dd HH:mm:ss""")+"' ), // и кошерно и работает
|"+ ПолучитьGUIDПоУникальномуИдентификатору( стр.Орг.УникальныйИдентификатор()+",
|"+ ПолучитьGUIDПоУникальномуИдентификатору( стр.Сцен.УникальныйИдентификатор()+",
Если вам пофигу, что пишете, то как "новичок" сможет разобраться в ваших черновиках?

За что вы СокрЛП на строку натравили? Он же её пообкусает. Ладно справа покусает (там многие кусают и не видно), но ведь и слева покусает!

Странно, что транзакции используются, но при перезаписи (как бы единая операция) удаление происходит в одной транзакции, а вставка в другой. Нипанятна.

Drop table в транзакции в цикле с вопросом, как я писал выше - это ваще жесть. По сути - совершенно однопользовательское решение.

Нужность "архивирования" на этих объёмах тоже вызывает большие сомнения. На таблицах объёмом до 100 ГБ в год кластерного индекса по дате зачастую хватает по уши. А дальше можно использовать секционирование.

Запрос к sysobjects идёт без ограничения типов объектов. А вдруг будет процедура с таким именем?

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

Дальше. У метода Execute соединения и команды вообще-то есть параметры, которые являются битовой маской CommandTypeEnum и ExecuteOptionEnum. В частности есть параметр "adExecuteNoRecords", который рекомендуется для выполнения запросов от которых не ожидается результат. Кстати, для читабельности рекомендую использовать конструкции типа
ExecuteOptionEnum = Новый Структура ("adAsyncExecute, adAsyncFetch, adAsyncFetchNonBlocking, adExecuteNoRecords, adExecuteStream, adOptionUnspecified", 16, 32, 64, 128, 1024, -1);
так можно сделать код очень читаемым и переносимым с VBS.

Пример работы с параметрами можно найти тут. Вкратце, плюсы: принципиальная невозможность SQL injection, не нужно думать о представлении констант (чисел, дат), однократная компиляция запроса сервером, экономия сетевого трафика. Минус мне известен один: для некоторых типов для очень простых запросов (в частности инсерт узкую в таблицу без индексов) из-за медленной работы на стыке 1С и COM быстрее в 1С собрать нужный скрипт (но тоже надо уметь) и отправить его на сервер.

Блокировочные хинты. По умолчанию MS SQL использует уровень изоляции READ COMMITTED и блокировку по записям (по возможности) с дальнейшей эскалацией по количеству блокировок. Это в целом удобно, но не в случае массовой загрузки. В случае массовой загрузки для экономии памяти лучше заблокировать таблицу целиком до конца транзакции.

Ну а вообще, если интересует производительная загрузка данных, то лучше чутка подтянуть теорию, чтоб воплотить её в практике. А если хочется сделать пример для новичков, а не суперперегрузки то этот пример должен быть безукоризненно красив в своей простоте: он должен быть в едином стиле написания (а не то Conn, то CONN), он должен быть целостным и выполняемым, он должен быть правильным не только с точки зрения новичка, но и с точки зрения нормального программера.
nick_krsk; KatyariK; Belomor; jan27; romansun; artbear; cool.vlad4; +7 Ответить
56. artbear 1563 17.02.11 07:31 Сейчас в теме
(55) Прекрасный ответ и рекомендации.
57. cool.vlad4 2 17.02.11 16:13 Сейчас в теме
(56) Это да.
(0) Еще если интересно - почитайте(мне вот эта статья понравилась) Руководство по производительности загрузки данных Вообще блог Гилева рекомендую.
58. speshuric 1338 17.02.11 20:07 Сейчас в теме
(57) Это не Гилёвская статья. Ссылку на оригинал я дал. Но в целом руководство зачетнейшее.
59. cool.vlad4 2 17.02.11 21:10 Сейчас в теме
(58) Сорри, не заметил...вы прям мои мысли читаете :D ...но такие ссылки не стыдно баянить ;)
60. jan27 733 15.03.11 12:40 Сейчас в теме
61. Ёпрст 1065 24.03.11 10:01 Сейчас в теме
Лучше всё же пример для 2005/2008 скуля написать, там и инсерт в табличке поприятнее слеплен, да и еще много вкусностей
62. integragirl 20.02.13 15:16 Сейчас в теме
Полезная статья, как раз начинаю ковырять эту тему, пригодилось Ваши функции ;)
Респект автору!
63. Styvi 6 19.08.13 10:48 Сейчас в теме
И статья полезная, и обсуждение полезнейшее... Всем спасибо, зачёт автору, благодарности продвинутым комментаторам...
64. kiruha 388 08.11.13 11:54 Сейчас в теме
INsert в цикле на больших объемах как ведет ?
Если в запросе разом писать по 10 строк в таблицу - будет ли прирост производительности ?
65. kiruha 388 08.11.13 11:56 Сейчас в теме
И вместо знаков вопроса можно именновые параметры ? Что то в 1С не взлетело (
66. jan27 733 06.12.13 16:37 Сейчас в теме
(65)что не взлетело в 1С со знаками вопроса? все взлетает
68. kiruha 388 06.12.13 17:59 Сейчас в теме
(66)
Со знаками да, конечно.
Вопрос был про именованные параметры.
69. jan27 733 09.12.13 10:42 Сейчас в теме
(68) я на знаках вопроса остановился
67. jan27 733 06.12.13 16:38 Сейчас в теме
Оставьте свое сообщение