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

Вниз

быстрее ли SQL чем стандартный перебор всей таблицы   Найти похожие ветки 

 
Relaxxx   (2003-10-13 18:12) [0]

Мастера вот такой вопрос

Есть например таблица с 150 000 записей. нужно например выбрать все записи где дата дольше ДАТА1 и меньше ДАТА2. Мне тут утверждают (помоему это глупо), что если я например напишу на Делфи этот запрос через БДЕ используя компонент Query1, а например другой чел сделает в VisualC++ таким образом получить доступ к таблице используя ODBC или DAO и потом пройля в цикле всю таблицу и проверяя удовлетворяет ли данная запись условию, если да то отобразить в таблице.
Так вот чей метод быстрее, помоему с помощью SQL запроса будет раз 20 быстрее, а проверить сейчас нет времени


 
Vlad   (2003-10-13 18:15) [1]

Пускай этот чел на своем C++ дальше так и работает.
А ты его не слушай. Это не наш метод :)))


 
Relaxxx   (2003-10-13 18:45) [2]

а вообще если серьезно, что быстрее будет??


 
Sandman25   (2003-10-13 18:53) [3]

При переборе всех записей таблицы на клиентскую машину тащится вся таблица.
При использовании SQL на клиентскую машину тащятся только нужные записи.


 
Johnmen   (2003-10-13 18:55) [4]

>...что быстрее будет??

Нужет полный список условий для обоих случаев. И как определяются моменты пуска и стопа секундомера...:)


 
Relaxxx   (2003-10-13 18:56) [5]

тоесть вы хотите сказать что разница небольшая и почти не заметная


 
Sandman25   (2003-10-13 18:57) [6]

тащятся -> тащатся
Ча-ща с буквой "а" :(


 
Delirium   (2003-10-13 19:27) [7]

Для 150 000 записей разница будет колоссальной, практически для любой БД поддерживающей SQL.


 
NikB   (2003-10-14 01:32) [8]

Mojno i ne ponial vopros, no v vopros ne govoritsa o client/server, a esli rech idet ne o client/server, a o local"noi comp - to na Delhi toje ne budut problemi:
"получить доступ к таблице используя !!!BDE!!! и потом пройля в цикле всю таблицу и проверяя удовлетворяет ли данная запись условию, если да то отобразить в таблице"
i tak budet bistree, a esli uslovia (SQL where) bolshie - esche biistree budet v cikle.


 
Е-Моё имя   (2003-10-14 01:38) [9]

имхо SQL движок должен быстрее делать в любом случае


 
Reindeer Moss Eater   (2003-10-14 08:52) [10]

Не в любом случае.


 
Е-Моё имя   (2003-10-14 08:57) [11]

например если движок кривой? ;))


 
Sergey13   (2003-10-14 09:01) [12]

Если присовокупить индекс к запросу, то однозначно быстрее. Если без индекса, то нужно мерять (для локальной БД), но SQL все таки победит, ИМХО. Для серверной БД, SQL однозначно шустрее.


 
Reindeer Moss Eater   (2003-10-14 09:05) [13]

Есть например таблица с 150 000 записей. нужно например выбрать все записи где дата дольше ДАТА1 и меньше ДАТА2.

Если все записи удовлетворяют этому условию, то файл-сервер и клиент-сервер будут работать примерно одинаково


 
DenK_vrtz   (2003-10-14 09:08) [14]

Делал я когда то такой эксперимент, интересно было. Поиск по локальной таблице без индексов.
Искомая запись была где-то в конце списка, записей было порядка 800 (не много!). Так вот сплошной перебор с "отключенными" визуальными компонентами заметно тормозил, а sql-запрос делал все влет.


 
Reindeer Moss Eater   (2003-10-14 09:23) [15]

DenK_vrtz ©

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


 
Anatoly Podgoretsky   (2003-10-14 09:26) [16]

Более чем не достоверен, поскольку поиск идет на локальной машине. Для SQL по копии, для навигационных методов по исходной таблице.


 
DenK_vrtz   (2003-10-14 09:29) [17]

Reindeer Moss Eater ©
Anatoly Podgoretsky ©

но факт остается фактом!


 
Reindeer Moss Eater   (2003-10-14 09:34) [18]

DenK_vrtz

Этот факт говорит лишь об одном: Твой конкретный навигационный код находил нужную запись медленнее чем твой конкретный LocalSQL запрос.


 
DenK_vrtz   (2003-10-14 09:38) [19]

Reindeer Moss Eater, :)


 
Anatoly Podgoretsky   (2003-10-14 10:06) [20]

Это всего лишь означает, что для LocalSQL набор был у тебя в памяти.


 
Izyum   (2003-10-14 10:25) [21]

Если мне память не врет, для настольных баз даже при использовании SQL данные ВСЕ затягиваются в клиентскую память, а потом уже они обрабатываются, так что ощутимой разницы быть не должно. Хотя могу и ошибаться.


 
Reindeer Moss Eater   (2003-10-14 10:29) [22]

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

Память (твоя) здесь ни причем.
Здесь причем здравый смысл.
Если в настольных базах некому обрабатывать данные БД кроме как процессору клиентской машины, то значит ВСЕ эти данные должны быть на локальной машине прежде чем будут обработаны.


 
Izyum   (2003-10-14 10:34) [23]


> Reindeer Moss Eater © (14.10.03 10:29) [22]


Во-во... а посему, TTable лучше использовать. А TQuery токмо для выборок со сложными фильтрами, которые через механизм фильтрации TTable реализовать сложно.


 
Anatoly Podgoretsky   (2003-10-14 11:02) [24]

Механизм фильтрации в БДЕ много можнее возмодностей SQL, есои точнее то ограничением является только фантазия.


 
Vlad   (2003-10-14 11:06) [25]

Relaxxx ©
Спроси у своего товарища, что быстрее
1) SQL запрос по индексу
2) Полный перебор записей, с фетчем на клиента
Интересно, что он ответит :)))


 
KSergey   (2003-10-14 12:33) [26]

Друзья, о чем вы спорите?? Ведь автор не уточнил какая БД имеется в виду!!
Удивлен такой невнимательности.

Автор, ау: какая БД имеется в виду? Только не говорите, что "какая-нибудь, любая", т.к. для "вообще" и ответ один: всяко может повернуться.

PS
А VC++ или дельфи - это вообще отдельная тема обсуждения и уточнения, т.к. не понятно что в каждом конкретном случае будет использоваться для доступа к БД.


 
Vlad   (2003-10-14 12:37) [27]

>KSergey © (14.10.03 12:33) [26]
Зато автор уточнил кол-во записей в БД.
Уверяю, фетч такого кол-ва на клиент с последующей проверкой займет намного больше времени чем SQL запрос по индексу.
Думаю, тут даже тип БД не причем.


 
KSergey   (2003-10-14 13:07) [28]

[27] Vlad © (14.10.03 12:37)
Зато автор уточнил кол-во записей в БД.
Уверяю, фетч такого кол-ва на клиент с последующей проверкой займет намного больше времени чем SQL запрос по индексу.
Думаю, тут даже тип БД не причем.


Замечательно!
А где вообще сказано про "клиентов", "серверов" и т.д.??
Может это база из DBF-файлов прямо на этой же машине лежит под боком, а? Можно подумать на SQL-серверах свет клином сошелся.


 
Vlad   (2003-10-14 13:13) [29]

>потом пройля в цикле всю таблицу и проверяя удовлетворяет ли данная запись условию,
Вот что написал автор.
И причем тут DBF или не DBF ?
Пройти в цикле всю таблицу сколько времени займет ?
А индексированный поиск ?
Естественно учитываем кол-во записей, приведенное автором.


 
MsGuns   (2003-10-14 13:48) [30]

Я так понял, что обсуждаются все же локалки, - в клиент-серверах такой вопрос наивен.
Могу поделиться опытом работы с парадоксом. Выборка (особенно при Update) идет очень долго, если в условиях нет ключей (Primary) или индексов, а одно или более полей в условии имеют длинный симв.формат. В этом случае время выполнения запроса сопоставимо с построчным сравнением всех записей таблицы.
Если же в условиях запроса есть ключевые поля (особенно первичные), то выполняется такой запрос в десятки, а то и сотни раз быстрее. Отсюда вывод - стараться проектировать БД таким образом, чтобы поля, подобные приведенным в сабже датам, включались в первичный ключ или входили в индекс.

Большую роль играет еще такой факт, как сложный запрос, т.е. более чем по одной таблице. В этом случае получается матрица (N*M*P*...), где N - кол-во записей в 1-й таблице, N - 2-й и т.д.
Зависимость продолжительности запроса от размерности этой матрицы отнюдь не линейная и опять же зависит от того, являются ли связующие поля ключевыми.

В общем же случае, конечно, перебор записей менее эффективен. Хотя бы потому, что при нем не используются механизмы ключей и индексов.


 
Vlad   (2003-10-14 14:03) [31]

Кстати,
KSergey © (14.10.03 12:33) [26]
Друзья, о чем вы спорите?? Ведь автор не уточнил какая БД имеется в виду!!
Удивлен такой невнимательности.


Вот из этого я и сделал вывод, что используется клиент-сервер. А именно Оракл.
получить доступ к таблице используя ODBC или DAO и потом...
Это к вопросу о невнимательности.


 
KSergey   (2003-10-14 14:16) [32]

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



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

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

Наверх




Память: 0.52 MB
Время: 0.01 c
14-8589
Max Zyuzin
2003-10-15 14:08
2003.11.03
McAfee pro v7.02


14-8664
VID
2003-10-13 15:17
2003.11.03
ASDSee 6.0, Norton Utilities 2002 6.0


4-8741
Camedia
2003-08-30 00:58
2003.11.03
Получить значения xPos & yPos из lParam...


1-8444
DimaK
2003-10-21 21:37
2003.11.03
Label + &


1-8530
Dysan
2003-10-23 14:19
2003.11.03
Cannot load package inet60 ...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский