Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2010, 15:15   #1
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию Ускорить работу БД

Вобщем имеется БД сделанная в Аксесе. Данных в ней набралось несколько тысяч и теперь при запуске программы наблюдаются очень большие тормоза. Думаю из - за этого:
Код:
AdoTable1.Active:=true;
AdoTable2.Active:=true;
//...и так пять тэйбелов
Думаю вообще отказаться от Table и отображать данные только через Query запросами, но тогда возникает вопрос, как правильно добавить данные через запрос (типа INSERT) если в таблице есть автоинкриментное поле, которое к тому же является уникальным полем по которому идёт связь с подчинённой таблицей? Или вообще нужен другой подход? Может даже сменить БД

Последний раз редактировалось SERG1980; 09.11.2010 в 15:18.
SERG1980 вне форума Ответить с цитированием
Старый 09.11.2010, 15:35   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
если в таблице есть автоинкриментное поле, которое к тому же является уникальным полем по которому идёт связь с подчинённой таблицей?
Просто не указывай ее в команде. Ключевые поля как правило не учавствуют в операциях редактирования-добавления-удаления со стороны клиента.
Цитата:
Думаю вообще отказаться от Table и отображать данные только через Query
Нормальный подход, Table тормозит из-за того что получает весь набор. Иногда помогает засунуть его в поток, но лучше пользоваться Query, где прописывать условие отбора, дабы исключить получение всей таблицы.
I'm learning to live...

Последний раз редактировалось mihali4; 09.11.2010 в 16:29.
Stilet вне форума Ответить с цитированием
Старый 09.11.2010, 15:36   #3
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Цитата:
как правильно добавить данные через запрос (типа INSERT) если в таблице есть автоинкриментное поле
В родительскую таблицу значение автоинкрементного поля вообще добавлять не нужно. БД сама его добавит. А в дочернюю записать значение родительской ID.

Помню, в BDE был большой минус - после упаковки таблицы значение автоинкрементного поля перезаписывалось, поэтому не получалось делать связь по автоинкрементным полям. В Аксесе таких проблем нет.
Но я сомневаюсь, что
AdoQuery1.Active:=true;
будет работать намного быстрее, чем
AdoTable1.Active:=true;

У меня на работе в одной программе за годы собрались десятки тысяч счетов.
Я делаю запрос
Код:
select * from....   where data >= date-90
Т.е. выбираю счета только за последние 3 месяца. Этого достаточно. И работает быстро. Ну, и есть секретная кнопка "Показать все". Это на крайний случай если понадобится. Может что-то в этом роде сделать?
_SERGEYX_ вне форума Ответить с цитированием
Старый 09.11.2010, 16:20   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

от Table однозначно отказываться.
Цитата:
выбираю счета только за последние 3 месяца. Этого достаточно. И работает быстро. Ну, и есть секретная кнопка "Показать все". Это на крайний случай если понадобится. Может что-то в этом роде сделать?
ну разумеется. Ни в коем разе не показывать ВСЕ записи. Только те, которые нужны пользователю.
Плюс, по тем полям, которые участвуют в условии выборки Where xxxx = and yyy = ) по xxxx и yyy добавить индексы (ну тут уже с умом надо подходить....)



Цитата:
данные через запрос (типа INSERT) если в таблице есть автоинкриментное поле, которое к тому же является уникальным полем
на SQL нашёл такой подход:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var id : longint;
begin
  ADOQuery1.Close;
  ADOQuery1.SQL.Text := 'insert into YuorBigTable (Тут поля) '+
                   ' values (Тут значения полей) ';
  ADOQuery1.ExecSQL;
  ADOQuery1.SQL.Text := 'SELECT @@IDENTITY ';
  ADOQuery1.Open;
  id := ADOQuery1.fields[0].AsInteger;
  ShowMessage('Добавили запись с кодом: '+ InttoStr(id));
  ADOQuery1.Close;
end;
насколько такой подход надёжен (в случае интенсивной многопользовательской работы, когда все одновременно добавляют записи в одну и ту же таблицу) не знаю!


Цитата:
Может даже сменить БД
Вообще то, это Вам решать.
Хотя, MS Access, как мне кажется - это исключительно однопользовательская локальная картотека ( к тому же не очень производительная и мощная)....
Лучше уже взять MS SQL сервер. (тот же Express бесплатен).

Последний раз редактировалось Serge_Bliznykov; 09.11.2010 в 16:23.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.11.2010, 16:44   #5
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

К сожалению я не силён в других БД. кроме BDE и Аксес.
На счёт просмотра БД с использованием query согласен достаточно отображать последние несколько десятков записей. А вот на счёт добавления записи то тут наверно буду использовать запросы, а иначе если добавлять через тэйбл то всё равно придётся его активировать а это уже = см. пост №1
Юзаю на данный момент AbsoluteDataBase, никто не знает как она?

Последний раз редактировалось SERG1980; 09.11.2010 в 16:49. Причина: .
SERG1980 вне форума Ответить с цитированием
Старый 09.11.2010, 17:01   #6
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Цитата:
К сожалению я не силён в других БД. кроме BDE и Аксес.
А какая разница? В других БД то же самое. Те же методы, те же запросы.
Цитата:
Юзаю на данный момент AbsoluteDataBase, никто не знает как она?
Хорошая СУБД для мелких задач (годится для записных книжек, планировщиков и т.п.).
Для серьезной работы непригодна. При нескольких тысячах записей начнутся жуткие тормоза.
_SERGEYX_ вне форума Ответить с цитированием
Старый 09.11.2010, 17:48   #7
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Всем спасибо за внимание пойду додумывать, но тему не закрываю
SERG1980 вне форума Ответить с цитированием
Старый 09.11.2010, 22:28   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
К сожалению я не силён в других БД. кроме BDE и Аксес.
полностью согласен с мнением _SERGEYX_ (в теме одни Сергеи собрались )
что Access, что MS SQL - разница не принципиальная.
все таблицы и запросы, которые у Вас работают на Access - можно за конечное время перевести на MS SQL. и отказаться от BDE в пользу ADO.
Поверьте мне, MS SQL гораздо эффективнее и мощнее, чем Access!


Цитата:
А вот на счёт добавления записи то тут наверно буду использовать запросы
А тут вообще, однозначно, без всяких "наверное" - только запросами и добавлять!

Последний раз редактировалось Serge_Bliznykov; 09.11.2010 в 22:33.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.11.2010, 22:56   #9
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Поверьте мне, MS SQL гораздо эффективнее и мощнее, чем Access!
А есть у вас какая нибудь базовая лит-ра для работы с MS SQL, что для этого надо? где там создать таблицы, через какие компоненты подключить в делфи. Для меня это пока лес густой
SERG1980 вне форума Ответить с цитированием
Старый 09.11.2010, 23:30   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

так, навскидку:
"SQL Server 2005. Библия пользователя [Пол Нильсен]"
"Transact-SQL [Михаил Фленов]"
"SQL.For.Dummies[2,64.MB_www.netz.ru].rar"
SQL_polnoe_rukovodstvo_www.newshot. ru.rar
"Программирование баз данных Microsoft SQL Server 2005. Базовый курс [Виейра Р.]"
SQL Server 2000. Программирование. (в двух томах)
Кен Хендерсон - Профессиональное руководство по SQL Server: хранимые процедуры, XML,HTML.
"Практическое руководство по SQL [Дж.Боуман, С.Эмерсон, М.Дарновски]"
"SQL Справочник [Клайн]"

С вашего позволения, и наша форумская подборка
http://www.programmersforum.ru/showthread.php?t=1589
Михалыч.


а вообще, когда Вы поставите себе MS SQL сервер. Вместе с ним установится инструмент для обслуживания - Microsoft SQL Server Management Studio (впрочем, её можно скачать с офф.сайти и отдельно).
И там всё просто. Сначала создаёте БАЗУ ДАННЫХ.
в ней создаёте таблицы. Всё визуально и внешне очень похоже на конструкторы MS Access

Последний раз редактировалось mihali4; 09.11.2010 в 23:52.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ускорить работу с БД Poltev86 БД в Delphi 2 25.05.2010 09:46
ускорить работу макроса borik120 Microsoft Office Excel 12 19.01.2010 17:25
Как ускорить работу программы SibBear Общие вопросы Delphi 7 27.03.2009 14:40
помогите ускорить работу программы... Pashtet Паскаль, Turbo Pascal, PascalABC.NET 5 25.11.2008 22:12
Как ускорить работу с сетевой БД Ramires БД в Delphi 3 21.08.2008 12:16