PDA

Просмотр полной версии : 1С 8.3. Тормозит запрос по поиску данных в справочнике с 6 миллионами записей



fox019
24.12.2013, 11:18
Доброго времени суток, Уважаемые!

Подскажите пожалуйста, как можно оптимизировать поиск в справочнике с количеством записи больше 6 миллионов записей:

Платформа: 1С Предприятие 8.3.4.365 (сервер 64b)
СУБД: MS SQL 2008 64b
Железо - 1 сервер для Сервера приложения и СУДБ:
2 x Intel® Xeon® E5-2407 2.2GHz, 4-core, 10MB L3 cache
6 x 4GB PC3-10600E RDIMM ECC
4 x HP 450GB SAS 6G 15000rpm 3.5" Hot Plug MDL HDD
Количество пользователей: более 250 (интенсивных 200)
Канал связи для удаленных пользователей (около 200) - 1Mbs


Конфигурация самописная на управляемом приложении.
Справочник "Контрагенты" содержит более 6 миллионов записей.
Индексы установлены по полям - ИНН, ВидКонтрагента.
Индексы с доп.упорядочиванием - Фамилия, Имя, Отчетство.

Конфигурацией пользовались почти год на платформе 1С 8.2.15.294 (32b).
Штатные средства сильно тормозили при поиске контрагентов.
Написали запрос для поиска (ниже по тексту), которая очень быстро работала на платформе 8.2 все это время.
Несколько недель назад перевели на платформу 8.3.4.317 (32b).
После этого поиск начал сильно тормозить и зависать.
Попробовали все перевести на 64 битный. Тоже не помогло.

ПОДСКАЖИТЕ ПОЖАЛУЙСТА, как можно оптимизировать поиск для платформы 8.3 ИИ

ЗАРАНЕЕ БЛАГОДАРЮ!!!!

Текст запроса:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
СправочникКонтрагенты.Ссы� �ка,
СправочникКонтрагенты.Вер� �ияДанных,
СправочникКонтрагенты.Пом� �ткаУдаления,
СправочникКонтрагенты.Пре� �определенный,
СправочникКонтрагенты.Род� �тель,
СправочникКонтрагенты.Это� �руппа,
СправочникКонтрагенты.Орг� �низация,
СправочникКонтрагенты.Код,
СправочникКонтрагенты.Наи� �енование,
СправочникКонтрагенты.Пол� �оеНаименование,
СправочникКонтрагенты.Фам� �лия,
СправочникКонтрагенты.Имя,
СправочникКонтрагенты.Отч� �ство,
СправочникКонтрагенты.Вид� �онтрагента,
СправочникКонтрагенты.ИНН,
СправочникКонтрагенты.Ком� �ентарий,
СправочникКонтрагенты.Код� �КОНХ,
СправочникКонтрагенты.Дат� �Рождения,
СправочникКонтрагенты.Пол,
СправочникКонтрагенты.НеЯ� �ляетсяРезидентом,
СправочникКонтрагенты.Рег� �он,
СправочникКонтрагенты.ОКО� �Ф,
СправочникКонтрагенты.Стр� �на,
СправочникКонтрагенты.Осн� �внойРасчетныйСчет,
СправочникКонтрагенты.Явл� �етсяПредоставляющимДокум� �нты,
СправочникКонтрагенты.Отв� �тственный
ИЗ
Справочник.Контрагенты КАК СправочникКонтрагенты
ГДЕ
ВЫБОР
КОГДА &ЕстьОтбор ТОГДА
ВЫБОР
КОГДА &ОтбиратьПоВидуКонтрагента = 1
ТОГДА СправочникКонтрагенты.Вид� �онтрагента = &ВидКонтрагентаДляОтбора
ИНАЧЕ ИСТИНА
КОНЕЦ
И
(
ВЫБОР
КОГДА &ОтбиратьПоФамилии = 2
ТОГДА СправочникКонтрагенты.Фам� �лия ПОДОБНО &ФамилияДляОтбора
КОГДА &ОтбиратьПоФамилии = 1
ТОГДА СправочникКонтрагенты.Фам� �лия = &ФамилияДляОтбора
ИНАЧЕ ИСТИНА
КОНЕЦ
ИЛИ
ВЫБОР
КОГДА &ОтбиратьПоФамилии = 2
ТОГДА СправочникКонтрагенты.Наи� �енование ПОДОБНО &ФамилияДляОтбора
КОГДА &ОтбиратьПоФамилии = 1
ТОГДА СправочникКонтрагенты.Наи� �енование = &ФамилияДляОтбора
ИНАЧЕ ИСТИНА
КОНЕЦ
ИЛИ
ВЫБОР
КОГДА &ОтбиратьПоФамилии = 2
ТОГДА СправочникКонтрагенты.Фам� �лия ПОДОБНО &ФамилияДляОтбораЛат
КОГДА &ОтбиратьПоФамилии = 1
ТОГДА СправочникКонтрагенты.Фам� �лия = &ФамилияДляОтбораЛат
ИНАЧЕ ИСТИНА
КОНЕЦ
ИЛИ
ВЫБОР
КОГДА &ОтбиратьПоФамилии = 2
ТОГДА СправочникКонтрагенты.Наи� �енование ПОДОБНО &ФамилияДляОтбораЛат
КОГДА &ОтбиратьПоФамилии = 1
ТОГДА СправочникКонтрагенты.Наи� �енование = &ФамилияДляОтбораЛат
ИНАЧЕ ИСТИНА
КОНЕЦ
)
И
(
ВЫБОР
КОГДА &ОтбиратьПоИмени = 2
ТОГДА СправочникКонтрагенты.Имя ПОДОБНО &ИмяДляОтбора
КОГДА &ОтбиратьПоИмени = 1
ТОГДА СправочникКонтрагенты.Имя = &ИмяДляОтбора
ИНАЧЕ ИСТИНА
КОНЕЦ
ИЛИ
ВЫБОР
КОГДА &ОтбиратьПоИмени = 2
ТОГДА СправочникКонтрагенты.Имя ПОДОБНО &ИмяДляОтбораЛат
КОГДА &ОтбиратьПоИмени = 1
ТОГДА СправочникКонтрагенты.Имя = &ИмяДляОтбораЛат
ИНАЧЕ ИСТИНА
КОНЕЦ
)
И
(
ВЫБОР
КОГДА &ОтбиратьПоОтчеству = 2
ТОГДА СправочникКонтрагенты.Отч� �ство ПОДОБНО &ОтчествоДляОтбора
КОГДА &ОтбиратьПоОтчеству = 1
ТОГДА СправочникКонтрагенты.Имя = &ОтчествоДляОтбора
ИНАЧЕ ИСТИНА
КОНЕЦ
ИЛИ
ВЫБОР
КОГДА &ОтбиратьПоОтчеству = 2
ТОГДА СправочникКонтрагенты.Отч� �ство ПОДОБНО &ОтчествоДляОтбораЛат
КОГДА &ОтбиратьПоОтчеству = 1
ТОГДА СправочникКонтрагенты.Имя = &ОтчествоДляОтбораЛат
ИНАЧЕ ИСТИНА
КОНЕЦ
)
И
ВЫБОР
КОГДА &ОтбиратьПоИНН = 2
ТОГДА СправочникКонтрагенты.ИНН ПОДОБНО &ИННДляОтбора
КОГДА &ОтбиратьПоИНН = 1
ТОГДА СправочникКонтрагенты.ИНН = &ИННДляОтбора
ИНАЧЕ ИСТИНА
КОНЕЦ
ИНАЧЕ
ЛОЖЬ
КОНЕЦ



1151

Текст модуля для отбора:


&НаКлиентеНаСервереБезКонт екста
Функция ИспользоватьОтборСписка(П� �раметрОтбора) Экспорт

Если ТипЗнч(ПараметрОтбора) = Тип("Строка") Тогда
Если ПустаяСтрока(ПараметрОтбо� �а) Тогда
Возврат 0;
Иначе
ПараметрПодобно1 = Найти(ПараметрОтбора, "%");
ПараметрПодобно2 = Найти(ПараметрОтбора, "_");
ПараметрПодобно3 = 0;
Если ПараметрПодобно1+ПараметрП одобно2+ПараметрПодобно3>0 Тогда
Возврат 2;
Иначе
Возврат 1;
КонецЕсли;
КонецЕсли;
ИначеЕсли ЗначениеЗаполнено(Парамет� �Отбора) Тогда
Возврат 1;
Иначе
Возврат 0;
КонецЕсли;

КонецФункции

&НаКлиентеНаСервереБезКонт екста
Процедура УстановитьОтборСписка(Спи� �ок, ПараметрыОтбора)

Список.Параметры.Установит ьЗначениеПараметра("ОтбиратьПоВидуКонтрагента", ИспользоватьОтборСписка(П� �раметрыОтбора["ВидКонтрагента"]));
Список.Параметры.Установит ьЗначениеПараметра("ОтбиратьПоФамилии", ИспользоватьОтборСписка(П� �раметрыОтбора["Фамилия"]));
Список.Параметры.Установит ьЗначениеПараметра("ОтбиратьПоИмени", ИспользоватьОтборСписка(П� �раметрыОтбора["Имя"]));
Список.Параметры.Установит ьЗначениеПараметра("ОтбиратьПоОтчеству", ИспользоватьОтборСписка(П� �раметрыОтбора["Отчество"]));
Список.Параметры.Установит ьЗначениеПараметра("ОтбиратьПоИНН", ИспользоватьОтборСписка(П� �раметрыОтбора["ИНН"]));

Список.Параметры.Установит ьЗначениеПараметра("ВидКонтрагентаДляОтбора", ПараметрыОтбора["ВидКонтрагента"]);
Список.Параметры.Установит ьЗначениеПараметра("ФамилияДляОтбора", ПараметрыОтбора["Фамилия"]);
Список.Параметры.Установит ьЗначениеПараметра("ИмяДляОтбора", ПараметрыОтбора["Имя"]);
Список.Параметры.Установит ьЗначениеПараметра("ОтчествоДляОтбора", ПараметрыОтбора["Отчество"]);
Список.Параметры.Установит ьЗначениеПараметра("ФамилияДляОтбораЛат", ПараметрыОтбора["ФамилияЛат"]);
Список.Параметры.Установит ьЗначениеПараметра("ИмяДляОтбораЛат", ПараметрыОтбора["ИмяЛат"]);
Список.Параметры.Установит ьЗначениеПараметра("ОтчествоДляОтбораЛат", ПараметрыОтбора["ОтчествоЛат"]);
Список.Параметры.Установит ьЗначениеПараметра("ИННДляОтбора", ПараметрыОтбора["ИНН"]);

КонецПроцедуры

&НаСервере
Процедура УстановитьОтбор()

ПараметрыОтбора = Новый Соответствие();
ПараметрыОтбора.Вставить("Фамилия", ФамилияПоиска);
ПараметрыОтбора.Вставить("Имя", ИмяПоиска);
ПараметрыОтбора.Вставить("Отчество", ОтчествоПоиска);
ПараметрыОтбора.Вставить("ФамилияЛат", ФамилияПоискаЛат);
ПараметрыОтбора.Вставить("ИмяЛат", ИмяПоискаЛат);
ПараметрыОтбора.Вставить("ОтчествоЛат", ОтчествоПоискаЛат);
ПараметрыОтбора.Вставить("ИНН", ИННПоиска);
ПараметрыОтбора.Вставить("ВидКонтрагента", ВидКонтрагентаПоиска);
УстановитьОтборСписка(Спи� �ок, ПараметрыОтбора);

КонецПроцедуры


&НаКлиенте
Процедура ФамилияПоискаПриИзменении (Элемент)

ФамилияПоискаЛат = КонвертацияСКиррилицыВЛат иницу(ФамилияПоиска, "рус");

УстановитьОтбор();

КонецПроцедуры

DmitryIV
04.01.2014, 23:25
Эта реализация вообще быстро работать впринципе не может. А на счет 6 млн. записей - это мизер для SQL.
Я так понимаю - это форма списка. Все формы списка в управляемых формах - это урезанная СКД. Вот отсюда и надо отталкиваться.
И ещё не очень понятны все эти конструкции с "ВЫБОР..."