Показать сообщение отдельно
Старый 07.12.2009, 14:05   #59  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,275 / 3476 (122) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Сисой Посмотреть сообщение
В ряде случаев (отбор по критерию "равно") 1С просто решает эту проблему по другому. В языке запросов 1С есть оператор В (IN), который умеет принимать в качестве операнда список объектных значений. Такой запрос автоматически транслируется 1С в объединение кучи одинаковых подзапросов с UNION ALL и подстановкой разных значений в условия сравнения. План запроса один и тот же.
Цитата:
Сообщение от mazzy Посмотреть сообщение
Если честно, то похоже ты вообще не понял о чем речь.
Если кто-то может дать ссылки или объяснить в двух словах (проще, чем в статье), пожалуйста, сделайте это.
Давайте определимся - о чем говорим.
Сисой (как я понимаю) - говорит о том, что если нужно выбрать дискретные данные из таблицы (допустим выбрать 10 клиентов поименно), то 1С поддерживает оператор T-SQL IN и запрос, отсылаемый на сервер принимает вид:

SELECT * FROM CUSTTABLE WHERE ACCOUNTNUM IN ('Клиент1', 'Клиент2', 'Клиент3', ..., 'Клиент 10')

Т.е. вместо того, чтобы слать 10 запросов вида SELECT * FROM CUSTTABLE WHERE ACCOUNTNUM = 'Клиент1' шлется одна вышеприведенная инструкция (это к слову о том, что 1С считает что лучше один большой запрос, чем 10 маленьких).

Но вот мне кажется, что если в коде в 1С последовательно написать строчки:
SELECT * FROM CUSTTABLE WHERE ACCOUNTNUM = 'Клиент1' и
SELECT * FROM CUSTTABLE WHERE ACCOUNTNUM = 'Клиент2'

То в БД уйдет 2 запроса и для каждого запроса будет строиться план.

При этом mazzy говорит о том, что AX (если в коде будут написаны 2 такие же строчки) отправит в БД тоже 2 запроса:
SELECT * FROM CUSTTABLE WHERE ACCOUNTNUM = :p1 и
SELECT * FROM CUSTTABLE WHERE ACCOUNTNUM = :p1

А уже вместо переменной p1 ПОСЛЕ построения плана запроса будет подставлено конкретное значение.
Разница между АХ и 1С тут будет в том, что план запроса в АХ будет строиться только 1 раз, а время, затрачиваемое БД на построение плана запроса и подстановку значения переменной несоизмеримо на больших объемах данных.

Цитата:
Сообщение от mazzy Посмотреть сообщение
за размером temptableтоже надо следить вручную :)
А вот тут кстати - есть "хорошая новость" любителям временных таблиц (это относится к любым системам).
Переливая данные во временную таблицу - мы теряем производительность на больших объемах данных, т.к.
1) Выборки из постоянных таблиц м.б. неполными (например формы в АХ тянут не все записи из таблицы, а только видимые + небольшой хвостик). А переливка во временную таблицу м.б. гораздо большего кол-ва записей, чем отображаемые. Но это больше к АХ относится как мне кажется
2) Помимо размера временной таблицы - никто не говорит про индексы. Переливая из постоянной таблицы данные во временную - мы фактически отказываемся от использования индексов - что естественно отражается на произовдительности на больших объемах данных.

Подчеркну - если во временной таблице - небольшое кол-во данных - то указанные мною ограничения отсутствуют. Но как только во временную таблицу будут переливаться тысячи записей - то ограничения почуствуются
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 07.12.2009 в 14:08.
За это сообщение автора поблагодарили: mazzy (2).