|
Что быстрее - запрос или выборка по спр-ку ? Ø | ☑ | ||
---|---|---|---|---|
0
mr Gilmor
04.05.06
✎
20:54
|
Надо отобрать элементы спр-ка по опред.условию.
Что быстрее - прогнать цикл по выборке элементов или сделать это запросом ? Для вариантов баз - файл-сервер и терминал. |
|||
1
КонецЦикла
04.05.06
✎
21:01
|
SQL? А вообще-то можно и самому замерить...
|
|||
2
mr Gilmor
04.05.06
✎
21:05
|
(1) Файл-сервер и терминал (два варианта).
К сожалению, некогда замерять. Надежда на то, что кто-то уже когда-то замерил. |
|||
3
mr Gilmor
04.05.06
✎
21:08
|
(1) Файл-сервер и терминал (два варианта).
К сожалению, некогда замерять. Надежда на то, что кто-то уже когда-то замерил. |
|||
4
КонецЦикла
04.05.06
✎
21:08
|
2(2) А то! Канечна... на твоем компе и сетке как раз вчера и меряли :)
|
|||
5
mr Gilmor
04.05.06
✎
21:15
|
(4) Меряли - от головы до хвоста - 100Mbps, от хвоста до головы - 10Mbps.
Как говорится, dual speed. Вопрос не про сетку, а про эску. |
|||
6
Phoenix
04.05.06
✎
21:17
|
ага, замерить время таким образом: Сообщить(ТекущееВремя());
крайне сложно и долго :) |
|||
7
1аС
04.05.06
✎
21:43
|
В любом случае выборка катит веселее.
|
|||
8
mr Gilmor
04.05.06
✎
21:47
|
(7) ??? Мне казалось, что быстрее запрос.
А почему ? Или это эмпирическая данность ? |
|||
9
1аС
04.05.06
✎
21:51
|
Ну хотябы тем , что при грамотной выборке не нужно лопатить порой весь справочник, тогда как запрос берет все а потом сеит.
|
|||
10
mr Gilmor
04.05.06
✎
21:53
|
ага
|
|||
11
Дурочка 1С
04.05.06
✎
22:13
|
>> Надо отобрать элементы спр-ка по опред.условию.
Зачем? |
|||
12
Кросафчег
04.05.06
✎
22:18
|
(11) :)) !!!
|
|||
13
Темный Эльф
04.05.06
✎
22:20
|
Сие о железа зависит. На более слабых машинах выборка вешает проц, а мало оперативки, но работает быстрее запроса, запрос же жрет больше оперативки, мало проц, но на сильных машинах шустрее.
|
|||
14
Берсеркер
04.05.06
✎
22:24
|
(0) Когда делаем перебор, то данные вытягиваем программой, написанной на 1С. А вот когда запросом, то данные вытягиваются кодом, написанным на C++
Что будет быстрее? |
|||
15
Programmer
04.05.06
✎
23:12
|
прямой запрос к SQL по-любому быстрее, а выборка от запроса по скорости не сильно отличается на большой базе (гигов 50 этак)
|
|||
16
VZ
04.05.06
✎
23:23
|
На этот вопрос давно дан ответ докой NS. С показыванием результатов замеров.
Так вот, его резюме: "Выборка бъет запрос". Ветку с подробностями ищите на мисте. |
|||
17
MMF
04.05.06
✎
23:48
|
Тоже мне проблему нашли, взяли да померили. Меня дите в тупик поставило вопросом "Кто сильнее - ниндзя-черепашки или человек-паук", причем надо обосновать.
|
|||
18
pit
04.05.06
✎
23:52
|
(14) Однажды, от нехрен делать, зашел к франчу якобы устраиваться на работу... И был мне задан именно этот вопрос...
Сертифицированный спец (все три сертификата) мой ответ, что выборка быстрее, обсмеял, на что я предложил проверить... После проверки спец сидел, тупо таращив морду лица в монитор - получилось, что я его разложил перед присутствующим клиентом... Финиш наступил через пару минут - с фразой "Понаберут тут лохов с картонками - мне что, их учить, что ли?" покинул помещение... . P.S. Обоснование в пользу запроса было именно как в (14) - запрос выполняется на уровне платформы, а выборка - на прикладном уровне ... |
|||
19
Берсеркер
05.05.06
✎
00:13
|
(16, 18) Мдя... Подвел меня мой опыт на Фоксе ;)
Но все-таки, почему так? Ведь по уму должно быть наоборот! |
|||
20
MMF
05.05.06
✎
00:23
|
(19) те чуваки, которые писали ВыбратьЭлементы() + ПолучитьЭлемент() круче чуваков, которые писали ВыполнитьЗапрос()
А как тебе понравится тот факт, что у системных объектов 1С поиск свойств/методов сделан точно так же как в примерах ВК, т.е. тупым перебором? Или что дихотомический поиск в таблице значений бывает быстрее, чем системное НайтиЗначение |
|||
21
Шурик71
05.05.06
✎
00:27
|
Все зависит от условия.
Например, для условия Лев(Спр.Наименование,4) = "Вася" запрос с условием ("Наименование >= "Вася") и (Наименование < "Васяяяяяяяяя") на большом справочнике порвет выборку как тузик грелку. |
|||
22
Шурик71
05.05.06
✎
00:32
|
(+21) А выборка в немонопольном режиме через XBASE, либо через ADO, а также извраты с НачатьТранзакцию()+Спр.НайтиПоНаименованию() + Спр.Удалить(1)+ ОтменитьТранзакцию() порвут оба способа в 21 еще сильнее :)
|
|||
23
0xFFFFFF
05.05.06
✎
07:31
|
(18)
Чессгря, не понял, с какой такой радости. У меня на СКЛ выборка из справочника запросом (обычным одноэсовым запросом) делается в десятки раз быстрее, чем перебор. Перебор тупо все вешает на пару минут. Что я делаю не так? |
|||
24
ZZZZ
05.05.06
✎
07:49
|
(0)
У меня быстрее по Выборке работает. Все отчеты так построены. |
|||
25
iova
05.05.06
✎
07:55
|
При обсуждении скорости запроса не учитываете то, что при его формировании создаются временные таблицы, соответственно его скорость сильно зависит от того, где хранит 1С временные файлы. В то же время при выбратьЭлементы() происходит только чтение из таблицы. Вывод: запросы можно существенно ускорить, разместив TEMP на RAM диске.
(21) (22) Согласен. |
|||
26
Chai Nic
05.05.06
✎
08:34
|
Во многих случаях запросы ужасно неэффективны, потому что перелопачивают ОГРОМНОЕ число лишней информации. Видел я одну простенькую обработочку, где маааленький запросик получал отгрузку по товарам и по дням с несколькими условиями. Выполнялся он жуткое время, и при этом 1с создавала в temp огромные файлы. Переписал его через выборку - получил ускорение в десятки раз.
ЗЫ И еще, учтите психологический момент. Во время выборки можно что-то выводить в строку статуса, то есть у пользователя не возникает ощущение "зависшей программы". Когда выполняется запрос, он просто тупо вешает 1с на какое-то время, а уже известно из психологии, что пользователь начинает в этом случае нервничать. ИМХЛ: лучше пусть выборка делается 5 минут, при этом сообщая пользователю, на каком этапе находится - чем запрос будет молчаливо выполняться 3 минуты. |
|||
27
Шухер
05.05.06
✎
09:44
|
(19)На фоксе select работает в разы дольше, чем перебор.
сравни с scan, set filt to, repl all. Это ж перебор? (25) Не согласен. Временные Таблицы, (иначе Курсоры) создаются в ОЗУ и в темпы даже могут и не попасть. ИМХО. |
|||
28
iova
05.05.06
✎
09:49
|
(27) Курсоры-шмусоры, в темп советую посмотреть во время выполнения запроса.
|
|||
29
Descriptor
05.05.06
✎
09:52
|
(0) Внесу свои пять копеек. Специально в отладчике гонял код с выборкой и запросом. В большинстве случаев (в подавляющем большинстве) выборка делается быстрее. Иногда - многие разы. Это если без использования приблуд, типа размещения темпа на раме или прямых запросов - эти вещи не сследовал..
|
|||
30
Гуня
05.05.06
✎
10:21
|
По опыту на фоксе(поскольку механизм выборки и запроса на любом языке одинаков, а на фоксе сравнение проводил на 1С нет). Если анализируется одна база, да за один проход, то выборка однозначно.
Если приходится анализировать несколько баз и возможно несколько проходов, то тут приходилось смотреть каждый случай отдельно, бывало, что запрос несколько обгонял выборку, но незначительно. Одно точно скажу, запрос удобнее писать всего одна команда, с сложная выборка бывало 10 строк занимала. Это личные наблюдения. Только для Фокса, но пиши на другом языке и соотношения будут примерно одинаковые. |
|||
31
iova
05.05.06
✎
10:27
|
(30) Если на FP писать запросы к SQL базе, то они быстрее будут в разы летать, особенно это касается запросов с условиями. А если кто иначе думает - пусть пользуется калькулятором электроника, т. к. энергия которую сжирает комп в сто раз ценнее его (в смысле, думающего).
|
|||
32
Гуня
05.05.06
✎
10:45
|
(31)SQL запрос это таже выборка, толко результаты помещаются в отдельную базу с которой потом удобнее работать локально. В этом и состоит преймущество запроса перед выборкой, но на создание зтой базы нужно время, в чем собственно он проигрывает.
|
|||
34
iova
05.05.06
✎
11:05
|
Аффтар любит работать локально?
|
|||
35
iova
05.05.06
✎
11:11
|
+(34) 2 (32)
|
|||
36
Гуня
05.05.06
✎
11:11
|
(34) Перевожу. Локально - имеется ввиду файл созданный запросом размещается на локальной машине, а не в сети.
|
|||
37
iova
05.05.06
✎
11:44
|
(36) Я не про 1С говорю, а про SQL-бд с каким нить FrontEnd. И там локально? Гы-гы-гы.
|
|||
38
Железяка
05.05.06
✎
11:47
|
(34, 37)Оставьте этот жаргон.
|
|||
39
iova
05.05.06
✎
11:55
|
Глубокоуважаемый модератор, искренне прошу извинить меня. В оправдание могу заметить Вам, что на улице пятница, в небе солнышко, а настроение веселое. Просьба незамодерять (34) (37) ввиду наличия в данных постах, некоторого, пусть маленького, но полезного для читателей смысла. Тон оставил.
|
|||
40
Шухер
05.05.06
✎
12:07
|
(28) Проверил, точно в темпе курсор-шмусор появляется. Пробовал ведомость по партии в ТиС формировать. Два файла создаются - dbf+cdx. Оба меняют размер во время выполнения запроса. dbf выросла до 4Мв. В VFP sele * from sc84 никаких темпов не делает, тож проверил.
На скорость не повлияло изменение темповой папки в локальный профиль из WinNT\Temp. В обоих случаях отчет формировался 43сек. |
|||
41
iova
05.05.06
✎
12:19
|
(40) Такое изменение темпа и не повлияет, т. к. количество операций ввода-вывода одно и то-же, а голова у ХДД скачет не между 30 и 550 цилиндром, а между 60 и 550 т. е. экономится маааленько миллисекунд. Изменение будет, если, например, разместить темп на другом винчестере.
|
|||
42
Берсеркер
05.05.06
✎
12:55
|
(27)
>На фоксе select работает в разы дольше, чем перебор. Ты просто не умеешь его готовить ;) Конечно можно придумать вариант когда, это так. Например выборка из одной таблицы 90% строк. Тут и для select лучше индексы выключить Кстати, если запрос по одной таблице поддавался оптимизации по индексам, то select просто делал так сказать view на эту таблицу, то есть выполнялся _мгновенно_ (!) >сравни с scan, set filt to, repl all. Это ж перебор? Оптимальным вариантом выборки из одной таблицы было вытащить select-ом номера строк и затем уже выбрать нужные строки прямым обращением Но вообще-то запрос это выборка из энного количества связанных таблиц, а не фильтрация одной единственной. Да еще с вычилениями по группировкам, да условиям на группировки |
|||
43
Шухер
05.05.06
✎
13:14
|
(42) Уже пива успел накатить? :)
|
|||
44
USSR
05.05.06
✎
13:15
|
(42)На фоксе вообще почти все великолепно работает, и фишек много. Например ZAP просто на низком уровне передвигает конец файла, SELECT * FROM (ttable) просто открывает таблицу в другой области и тд, а запросы шикарно работают, таскал выборки в 1С с помощью его OLEDB провайдера, так все обалденно получается, хотя по многим связкам нет индексов)
А Выборка справочника в 1С это всего делов то, открыть нужный SC и подсунуть его в разыменованном виде, потому и быстро)) |
|||
45
VV
05.05.06
✎
16:25
|
Интересно, все вышесказанное касается только выборки по справочникам - ил по докам тоже?
|
|||
46
smaharbA
05.05.06
✎
17:29
|
Кто быстрее дельфин или верблуд ?
|
|||
47
USSR
05.05.06
✎
17:56
|
(45)У доков в отличие от справочников, есть шапка и табличная часть, и все это хозяйство еще завязано через журнал 1SJOURN, где даты и номера доков. Поэтому ниче общего со справочниками
|
|||
48
fisher
05.05.06
✎
18:04
|
2(0) Этот вопрос периодически поднимается. Его можно уже в FAQ заносить.
На DBF в общем случае выборка отрабатывает несколько быстрее. На SQL - зависит от запроса. Грамотно составленный запрос с простыми условиями на переменные запроса отрабатывает в разы быстрее выборки (потому как отрабатывается на сервере). На больших объемах данных может и в десятки раз быстрее выполняться. Если условия хитрые или через точку, тогда может получиться и наоборот (1С в этом случае может демонстрировать чудеса неоптимальности). |
|||
49
raevsky
06.05.06
✎
07:58
|
(48) +1
У меня есть справочник,в котором около 500 000 записей, запрос(1с-овый) выполняется по нему практически мгновенно, а через выбратьэлементы() это ужос.Ради справедливости стоит отметить, что версия скульная. |
|||
50
raevsky
06.05.06
✎
07:59
|
+естественно имеется ввиду запрос с условиями.
|
|||
51
0xFFFFFF
06.05.06
✎
08:36
|
(49) Видимо, мы с тобой где то тупим, т.к. ответ на вопрос (23) остался без ответа. Либо у нас линейки не достаточно длинные, как у (18). :)
|
|||
52
raevsky
06.05.06
✎
08:55
|
(51) Ещё есть объект "БухгалтерскиеИтоги". На больших объёмах его вобще не дождаться. Приходиться пользовать обычные запросы. А на аттестации по бухии меня дядька пожурил, мол, нехорошо, надо через бухитоги.Пришлось переделывать всё в экстренном порядке.Давно эт было правда....
|
|||
53
fisher
06.05.06
✎
10:13
|
2(52) фигня какая-то... Видно, что с бух-компонентой вы не работаете.
|
|||
54
raevsky
06.05.06
✎
13:31
|
(53) Вы всерьёз полагаете, что незная бухкомпоненты можно аттестацию пройти? А работаем с бухитогами,если обычным запросом это слишком сложно сделать.
|
|||
55
fisher
06.05.06
✎
13:49
|
2(54) После ваших реплик - пожалуй.
Выигрыш у обычного запроса будет, пожалуй, лишь в запросе по проводкам/операциям с условиями. А именно с БУХИТОГАМИ бухзапрос работает и корректнее и быстрее. Я говорю про SQL, за DBF ручаться не могу - давно не работал. |
|||
56
Львенок
06.05.06
✎
13:57
|
Перегонял жутко переделанную бухгалтерию 7.7. из дбф под SQL заметил что SQL с большим объемом класно работает. А если построить красивый запрос, один запрос. Вместо 10 выборок. Тогда обращаясь только к этому запросу аналитика выходит быстро и красиво. Ну а в местах где был вложенный в выборку запрос по выборке... Вставить в таком же ключе запросы к SQL то и будет все медленно медленно... Ну конечно если нужно вывести 5ть строчек тогда запрос быстрее. Может все к месту и времени? Маленькое всегда перерастет в большое потому запрос круче
|
|||
57
raevsky
06.05.06
✎
14:27
|
"А именно с БУХИТОГАМИ бухзапрос работает и корректнее и быстрее".
Вы их ещё и классифицируете? Вот это как по-Вашему БУХИТОГИ или нет? Ит = СоздатьОбъект("БухгалтерскиеИтоги"); Ит.ИспользоватьСубконто(ВидыСубконто.ЗаявлениеВозврат); Если Ит.ВыполнитьЗапрос(ДатаН, Дата2,"22.5.1, 22.5.2",,,, "Проводка") = 0 Тогда Возврат; КонецЕсли; Ит.ВыбратьСубконто(); Пока Ит.ПолучитьСубконто()=1 Цикл Если Ит.Субконто().Договор=ТекущийЭлемент() Тогда Ит.ВыбратьПериоды(); Пока Ит.ПолучитьПериод() = 1 Цикл ............. |
|||
58
raevsky
06.05.06
✎
14:31
|
+ Раньше я тоже активно пользовался бухитогами, но на огромной скульной базе они действительно работают ужасно.
|
|||
59
ecode5
06.05.06
✎
14:46
|
Самый быстрый способ - сложный прямой запрос на 1C++ к SQL серверу на хорошем железе, причем в запросе делается как выборка так и фильтровка, а клиенту перекидывается готовый результат.
Самый тормозной - в файловом режиме на сетке 100Mb при 20 активных подключениях делать запрос 1С на бух итоги с целью получить оборот. Промежуточный вариант: Бух итоги но нацеленные на готовые данные промежуточных итогов: обороты, остатки, без сложных выборок и фильтров, типа получения самих документов. Выборка бьет запрос, если берется 3 элемента из 3000 с поиском по индексированному реквизиту, например: НайтиПоРеквизиту. Народ !!!!!!!! Назовите универсальный алгоритм сортировки, который был бы самым быстрым во всех возможных случаях: пузырьковой сортировки, быстрой сортировки, бинарные .... Банальный перебор всегда медленнее поиска в предварительно подготоволенном массиве: бинарные деревья например. Вывод. Нет смысла сравнивать запрос и программную выборку вообще. Это глупо. Давайте поставим жесткие условия задачи и только тогда начнем рассматривать скорость. Несколько вариантов выборки сделано потому, что ситуации бывают разные :). Это окончательный вердикт. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |