Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];

Вниз

Опять про скорость   Найти похожие ветки 

 
stelius ©   (2004-03-29 15:37) [0]

В целях самообразования хотелось бы узнать что быстрее - заполнять поля ТБД через всевозможные контролы (TDBEdit, TDBMemo, TDBComboBox, и др.) или генерить SQL запрос и выполнять ExecSQL.
Насколько я слышал, динамически сформированный и вставленный в Query SQL медленнее работает, чем SQL сформированный и записанный во время разработки.


 
Domkrat ©   (2004-03-29 15:40) [1]

Быстрее, заполнять в TEdit и генерить SQL запрос и выполнять ExecSQL, но это менее удобно.


 
Reindeer Moss Eater ©   (2004-03-29 15:41) [2]

А откуда SQL сервер узнает на каком этапе запрос сформировался?
В design time или runtime?


 
bushmen ©   (2004-03-29 15:41) [3]

>Насколько я слышал, динамически сформированный и вставленный в >Query SQL медленнее работает, чем SQL сформированный и >записанный во время разработки.

Это так, потому что при динамическом запросе перед его выполнением создается план выполнения каждый раз заново.


 
sniknik ©   (2004-03-29 15:47) [4]

bushmen ©   (29.03.04 15:41) [3]
а нафига запрос каждый раз создавать? задаеш раз перед циклом а дальше только параметры меняй.


 
bushmen ©   (2004-03-29 15:49) [5]

>sniknik ©

Я и не спорю. Только где ты в моем ответе увидел противоречие своим словам? Я просто пояснил, чем отличается динамический от статического запроса.


 
sniknik ©   (2004-03-29 15:57) [6]

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


 
Reindeer Moss Eater ©   (2004-03-29 16:04) [7]

>Насколько я слышал, динамически сформированный и вставленный в >Query SQL медленнее работает, чем SQL сформированный и >записанный во время разработки.

Это так, потому что при динамическом запросе перед его выполнением создается план выполнения каждый раз заново.


Это сто раз не так.
Серверу пофик на то, что текст запроса у вас в дезайн-тайме помещен в DFM. Так же как и на то, что текст его присвоен свойству SQL в рантайм.
Никакой разницы. Ни малейшей.


 
bushmen ©   (2004-03-29 16:10) [8]

>Серверу пофик на то, что текст запроса у вас в дезайн-тайме >помещен в DFM

А где я хоть словом обмолвился о сервере?


 
Reindeer Moss Eater ©   (2004-03-29 16:16) [9]

>Насколько я слышал, динамически сформированный и вставленный в >Query SQL медленнее работает, чем SQL сформированный и >записанный во время разработки.

Это так, потому что при динамическом запросе перед его выполнением создается план выполнения каждый раз заново.

Это сто раз не так.


 
bushmen ©   (2004-03-29 16:20) [10]

Почему же не так, если запрос, сформированный во время разработке находится в состоянии Prepare. А при замене текста запроса он автоматически становится UnPrepare ("When you change the text of a query at runtime, the query is automatically closed and unprepared.") ?


 
Reindeer Moss Eater ©   (2004-03-29 16:26) [11]

А с какого он должен стать препаред если он сформирован в DesignTime и больше никто ничего не делал?

И что помешает этому:
if Not Prepared then Prepare
Для запроса, сформированного динамически?


 
bushmen ©   (2004-03-29 16:31) [12]

>И что помешает этому:
>if Not Prepared then Prepare
>Для запроса, сформированного динамически?

Так, а если у нас цикл? Можно и нужно один раз сформировать запрос перед циклом с параметрами, но вопрос, как я понял, был в том, что генерируется текст запроса именно в цикле.


 
Reindeer Moss Eater ©   (2004-03-29 16:42) [13]

Да хоть сто циклов.

Было сделано заявление, что запросы из dfm выполняются быстрее чем сформированные в рантайме.

Мной было сделано заявление что это чушь.


 
Digitman ©   (2004-03-29 16:47) [14]


> через всевозможные контролы


как это "через" ? что за детсад ?


 
Petr V. Abramov ©   (2004-03-29 16:51) [15]

Если запрос выполняется один раз за время существования компонента TQuery, то, конечно, хоть динамически его формируй, хоть как.
 При выполнении запроса происходит следующее (при работе практически со всеми СУБД):
 1. текст передается клиентской части, она отсылает его на сервер, сервер разбирает его, если все нормально - клиентская часть возвращает Handle. В BDE этому этапу соответсвует Prepare
 2. При помощи вызова соотв. ф-ций клиентской части серверу передаются параметры ( если они есть) Этим ф-иям передается handle, полученный в п.1
 3. Опять же, используя handle, вызывается ф-ция выполнения запроса. Именно на этом этапе сервер начинает сканировать таблицы, искать по индексам, устанавливать блокировки, изменять данные в блоках и т.п.
 4. Если запрос возвращает данные, выполняется выборка (fetch). Причем необязательно выбирается все сразу.
 5. Запрос закрывается, с освобождением ресурсов, связанных с handle, на клиенте, в BDE и на сервере. Неявно это происходит при уничтожении TQuery и смене св-ва SQL.
 План может строиться на этапе 1 или 3
 И этого всего следует, что как запрос формируется - неважно. Важно, насколько Вам удается повторно использовать открытый handle, т.е. - в терминах BDE - prepared запрос.


 
stelius ©   (2004-03-29 17:27) [16]

Thanks 2 all

Как я понял Prepare для запроса выполняется 1 раз - в момент его первого выполнения. И потом, если не менять запрос а только открывать и закрывать Query, то Prepare не выполняется. Так?


 
Petr V. Abramov ©   (2004-03-29 17:30) [17]

> Так?
 Или вызова Prepare, или присваивания параметров


 
Petr V. Abramov ©   (2004-03-29 17:32) [18]

В смысле, при первом вызове Prepare, или первом присваивании параметров


 
Reindeer Moss Eater ©   (2004-03-29 17:33) [19]

Если явного вызова метода Prepare нет, то каждый раз как первый раз


 
Инквезитар   (2004-03-29 22:44) [20]

Да, ув. тов. Стелиус, как уже было справедливо подмечено, разницы между заполнением "через контролы" и с помощью ЭкзекСКУЛЬ никакой нету. :) Скорее всего, первое даже тормознее. Впрочем, если и так, заметить это можно только на процессоре серии 486 и ниже. :D


 
Sergey Masloff   (2004-03-29 23:07) [21]

Petr V. Abramov ©   (29.03.04 16:51) [15]
>Если запрос выполняется один раз за время существования >компонента TQuery, то, конечно, хоть динамически его формируй, >хоть как.
> При выполнении запроса происходит следующее (при работе >практически со всеми СУБД):
> 1. текст передается клиентской части, она отсылает его на >сервер, сервер разбирает его, если все нормально - клиентская >часть возвращает Handle. В BDE этому этапу соответсвует Prepare
Не забывайте что если запрос с параметрами вызывается в цикле то с очень высокой вероятностью он есть в кэше и этап разбора (зачастую самый затратный) не выполняется. Только биндинг параметров что очень нетяжелая операция. Поэтому динамически формируемый текст запросов мастдай параметры-форевер ;-)


 
Sergey13 ©   (2004-03-30 08:48) [22]

Ну давай и я 2 копейки добавлю.

>...что быстрее - заполнять поля ТБД через всевозможные ...
Если задача заполнить абы чем, то быстрее всего наверное нечто вроде
insert into table1 select * from table2
или утилиты импорта/закачки если есть.
Если заполнять надо осмыслено, то и действовать надо тоже осмыслено, а не исходя из установок "через чего".

Вставлять запросом в цикле с параметрами или без тоже не всегда хорошо (но с параметрами конечно лучше 8-). В таком случае стоит подумать над созданием ХП и не таскать все с сервера на клиент и обратно.

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



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.03 c
3-1080623450
viktor
2004-03-30 09:10
2004.04.25
UDF


1-1081250493
Эли
2004-04-06 15:21
2004.04.25
Цвет выделенного текста и шрифта в Memo


1-1081257050
olhovik
2004-04-06 17:10
2004.04.25
Как вставить в .ехе


3-1080506219
Onward
2004-03-29 00:36
2004.04.25
Как раскрыть DBComboBox с данными...


14-1080574261
Igorek
2004-03-29 19:31
2004.04.25
Звуки во время работы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский