Ускорение запроса

Добрый день.
Есть определенный view в mssql базе. Он выбирает порядка 70.000 записей.
В террасофте при выборе контакта для отправки письма или задачи используется именно этот view, он прогружает всех пользователей и из них уже выбирается нужный.
Может можно как нибудь сделать так, чтобы он прогружался по частям? Потому что так выполнение данной операции занимает иногда до 40 секунд. Спасибо.

Нравится

16 комментариев

Олег, не совсем понятно что и где загружается. Вы загружаете на клиенте 70 К записей? Или накладываете фильтр на view в которой 70 K записей?

У меня есть view в которой 70к записей. Когда я открываю список пользователей в террасофте, то он прогружает мне сразу все 70к записей. А это занимает от 20 до 40 секунд

Олег, можно конкретнее, что значит вы открываете список пользователей в террасофте? Приведите пример кода или даже лучше будет, если вы покажите sql из profiler.

Попробовал решить проблему другим путем, создал в админке новую таблицу, и хочу выбирать данные из нее.
Вопрос, при создании таблицы в админке оно создает в базе таблицу типа table, а мне нужно view. Сам view в sql базе создал, но не знаю как добавить его в админку.

Представление нельзя создать в "админке". Есть хитрость. Создать таблицу с необходимой структурой в конфигурации, но на вопрос "Сохранить в БД?" ответить нет. И в БД создать с таким же именем и структурой представление. После этого ядро будет работать с представлением, "думая" что это таблица.

Спасибо, помогло. Проблема решена, select отрабатывается быстро.
Сделал его не через базу, а создал дополнительный view и выполнил через админку.

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

Вот еще одна запара.... есть строка выбора датасета.

var Dataset = Services.GetNewItemByUSI('ds_ClientEmails');
	var SearchFieldNames = 'Email';
	var SearchFieldName = 'Email';
	var DisplayFieldName = 'Email';
	var KeyFieldName = 'ID';
	var IsReadOnly = false;
	var Result = ShowMultiSelectDataWindow(Dataset, SearchFieldNames, SearchFieldName,
	DisplayFieldName, DisplayFieldValues, KeyFieldName, KeyValues, IsReadOnly)

Мне нужно кроме ds_ClientEmails можно было выбрать еще один датасет.
Если добавить:

var Dataset = Services.GetNewItemByUSI('ds_НовыйДатасет');
	var SearchFieldNames = 'Email';
	var SearchFieldName = 'Email';
	var DisplayFieldName = 'Email';
	var KeyFieldName = 'ID';
	var IsReadOnly = false;
	var Result = ShowMultiSelectDataWindow(Dataset, SearchFieldNames, SearchFieldName,
	DisplayFieldName, DisplayFieldValues, KeyFieldName, KeyValues, IsReadOnly)

То оно открывает окно выбора 2 раза. А мне нужно, чтобы 2я строка появилась.

	if (Result.ModalResult == wmrOK) {
		// Выбираем те, которые не распознались
		MailList =MailParcer.Open();
		while (!MailList.IsEOF){
			if (MailList.Values('MailID')==null){
				ResultString=ResultString+MailList.Values('mail')+';';
			}
			MailList.GotoNext();
		}
		MailList.Close();
		var ResultValues=Result.Attributes('DisplayFieldValues');
		for (i=0;i<ResultValues.Count;i++){
			ResultString=ResultString+ResultValues.Items(i)+';';
		}
		dlData.Dataset.Edit();
		dlData.Dataset.Values(FieldName)=ResultString;
		dlData.Dataset.Post();
	}

Если Вы выбираете из двух датасетов, то два раза окно и открывается. Как же быть иначе?
Что значит "нужно, чтобы 2я строка появилась"? К чему третий фрагмент кода?

Получается что есть комбобокс который выводит спикок датасетов. Мне нужно, чтобы можно было выбрать один из двух, в данный момент есть только одна строка выбора, а нужно, чтобы появилась вторая, для выбора второго датасета.
3 фрагмент кода на всякий случай, может что полезное будет ))

Олег, в окне "Множественный выбор" Вы выбираете необходимые поля датасета, правильно? Каким образом Вы хотите выбирать поля из двух сразу - чтобы в левой части были все поля? В таком случае нужно отдельно дорабатывать.
А о каком комбобоксе выбора датасета Вы говорите?

Мне нужно ерализовать один из двух вариантов:
1. Чтобы можно было выбирать поля из двух сразу
2. Вначале в комбобоксе выбирается датасет, после этого выбираются из него нужные данные.

Обратите внимание на скрипт scr_MultiSelectData. Именно в нем происходит отработка выбора в окне. В частности, функция AddDisplayFields добавляет поля. Посмотрите, пожалуйста. Если возникнут вопросы - давайте будем решать детальнее. В любом случае нужно дорабатывать базовый функционал или писать аналогичное решение с учетом двух датасетов.

Показал, что надо сделать на скриншоте.

var Dataset = Services.GetNewItemByUSI('ds_EmployersEmails');
var SearchFieldNames = 'Email';
var SearchFieldName = 'Email';
var DisplayFieldName = 'Email';
var KeyFieldName = 'ID';
var IsReadOnly = false;
var Result = ShowMultiSelectDataWindow(Dataset, SearchFieldNames, SearchFieldName,
DisplayFieldName, DisplayFieldValues, KeyFieldName, KeyValues, IsReadOnly)

Олег, в скрипте scr_MultiSelectData окна множественного выбора используется один датасет. Он же передается первым параметром при вызове ShowMultiSelectDataWindow. В Вашем случае нужно переделать логику скрипта под совместимость работы с двумя датасетами. Поскольку объем работ достаточно большой, то могу только рекомендовать Вам использовать указанный скрипт, как образец и править его под свои нужды.

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

Показать все комментарии