Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.06.2011, 17:16
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию эфиктивность запроса

вопрос теоретический ради интереса
насколько эфективно использовать такой поиск,
Код:
Query.SQL.text:='Select * from Tabl where ID="'+id+'"';
Query.open;
скажем в 10000 записях, не долго обрабатывается?
Ответить с цитированием
  #2  
Старый 25.06.2011, 19:02
lmikle lmikle сейчас на форуме
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Делаешь индекс по ID и будет работать мухой хоть на 1000000 записях.
Ответить с цитированием
  #3  
Старый 25.06.2011, 20:27
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Какая СУБД и на каком сервере? В принципе обывательская БД довольно шустро такое выполнит, да и не думаю, что у тебя там будет более чем легион записей.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #4  
Старый 26.06.2011, 19:22
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
По умолчанию

1) Никаких звездочек в запросах! это лишний подзапрос для сервера что бы получить список полей для таблицы.
2) Делать только через bind переменные. Что бы субд не парсило запрос каждый раз!

как-то так:
Код:
Query.SQL.text:='Select Field1,Field2 from Tabl where ID= :id ';
Query.ParamByName('id').asInteger:=id;
Query.open;
__________________
Последний раз редактировалось Admin, Сегодня в 10:32.
Ответить с цитированием
  #5  
Старый 26.06.2011, 19:54
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

friz
Код:
Query.SQL.text:='Select Field1,Field2 from Tabl where ID= :id ';
Query.ParamByName('id').asInteger:=id;
Query.open;

спасибо за совет
сейчас исправлю все)

Код:
Query.SQL.text:='UPDATE bdbot SET INFObd="'+info+'" where idbd="'+id+'"';
Query.ExecSQL;
а в таких запросах тоже нужно переделать под bind переменные?
БД access,использую компонент TADOQery
так вот тогда по скольким записям поиск не будет превышать 50мсек скажем

lmikle
Цитата:
Делаешь индекс по ID и будет работать мухой хоть на 1000000 записях.
я об этом слышал но не имею представления конкретного, так понимаю если id 5 то искать с 1 по 10000, id 15634 ищем с 10000 по 20000 но конкретнее я не знаю как искать в одной бд так, кроме как разделить на несколько таких бд.

Последний раз редактировалось ALexandr555, 26.06.2011 в 22:10.
Ответить с цитированием
  #6  
Старый 27.06.2011, 18:53
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
По умолчанию

в любом запросе желательно использовать bind переменные, это хороший тон программирования.
__________________
Последний раз редактировалось Admin, Сегодня в 10:32.
Ответить с цитированием
  #7  
Старый 27.06.2011, 19:44
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
Сообщение от lmikle
Делаешь индекс по ID и будет работать мухой хоть на 1000000 записях.
Эээ нет, это ты погорячился. Скорость работы напрямую зависит от того, что тянется таким запросом. Если у вас кроме id, еще 100 полей числовых, то тут lmikle прав, но вот если там строки, а уж не дай боже медиаконтент, то можешь смело идти чайку попить в процессе, может повезет и дождешься результата.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 27.06.2011, 20:23
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Цитата:
Сообщение от Страдалецъ
Эээ нет, это ты погорячился. Скорость работы напрямую зависит от того, что тянется таким запросом. Если у вас кроме id, еще 100 полей числовых, то тут lmikle прав, но вот если там строки, а уж не дай боже медиаконтент, то можешь смело идти чайку попить в процессе, может повезет и дождешься результата.
в основном тянется 1 строковое поле, максимум три
Ответить с цитированием
  #9  
Старый 27.06.2011, 21:22
lmikle lmikle сейчас на форуме
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Страдалецъ
Эээ нет, это ты погорячился. Скорость работы напрямую зависит от того, что тянется таким запросом. Если у вас кроме id, еще 100 полей числовых, то тут lmikle прав, но вот если там строки, а уж не дай боже медиаконтент, то можешь смело идти чайку попить в процессе, может повезет и дождешься результата.

Естественно, время полной отработки будет зависеть от объема вытаскиваемых данных. Но собственно с временем чтения и передачи самих
данных ты все-равно ничего не сделаешь, разве только отложенную загрузку. А вот поиск данных - тут можно поиграть.

Индекс создается в БД и обрабатывается самой СУБД. Тебе для этого ничего делать не надо. См команду SQL CREATE INDEX.
Ответить с цитированием
  #10  
Старый 27.06.2011, 21:44
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

неужели все так просто
CREATE INDEX PIndex
ON таблица (поля)
//хотя синтаксис не тот похоже

а после добавления записи нужно повторно выполнять CREATE INDEX?

Последний раз редактировалось ALexandr555, 27.06.2011 в 22:56.
Ответить с цитированием
  #11  
Старый 28.06.2011, 00:46
lmikle lmikle сейчас на форуме
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

нет, не нужно. индекс создается один раз, потом СУБД сама его поддерживает. Правда тут может быть другая засада. Если таблица очень большая, то при наличии индекса может возникнуть замедлении при вставке записей. Но эту проблему тоже можно решить.
Ответить с цитированием
  #12  
Старый 28.06.2011, 02:35
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Очень большая это какая?) и как решать?
Ответить с цитированием
  #13  
Старый 28.06.2011, 11:43
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Ну заметные замедления при вставке начинаются я думаю в районе 10 млн, но эта цифра тоже зависит от структуры таблицы и сложности ограничений на ее поля, ну и конечно от сервера. Для оракла я думаю это вообще даже не минимальный порог, а вот для постгре очень даже может и раньше наступить, хотя при грамотном создании индексов и этого не должно быть.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 28.06.2011 в 11:45.
Ответить с цитированием
  #14  
Старый 28.06.2011, 13:10
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Прочел что в первом поле (где идет нумерация записей) индекс создается автоматически, правда?
И никто не подскажет синтаксис
нашел такой
но при использовании пишет не верный
Цитата:
CREATE INDEX PIndex
ON таблица (поле)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:01.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter