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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.05.2013, 11:53
childeroland childeroland вне форума
Прохожий
 
Регистрация: 15.04.2013
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Индексы при использовании компонентов Query

Здравствуйте, может мне кто-нибудь доступным языком объяснить, как использовать индексные файлы для таблиц (скажем .dbf), если для доступа к данным используются компоненты query?

Есть у меня задача: из более чем 300 тыс. записей в таблице .dbf выбрать те, которые не повторяются (в моей таблице есть дубли) и перенести их, скажем, в текстовый файлик. Если запись уже были ранее, и я нашёл дубль, то, их в файлик не помещать. Логику всего этого безобразия я вроде как придумал, использую два компонента ApolloQuery и вроде всё хорошо, но работает программа жутко медленно. Умом я понимаю, что для таких операций таблица должна быть проиндексирована. Допустим, у меня есть индексные файлы. В компонентах TTable есть свойство IndexName и что-то там ещё про индексы, в принципе, можно указать, я так понимаю, по какому полю идут индексы и, видимо, таким образом, прикрутить индексные файлы к задаче, но как поступать, если используются компоненты query? Надо ли как-то указывать, что файл таблицы имеет индекс? Если да, то как? Интернет пестрить теорией про индексы, базы данных и пр., но ответа на свой вопрос я так и не нашёл. Помогите советом
Ответить с цитированием
  #2  
Старый 07.05.2013, 16:14
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

а если попробовать вот такой запрос вместо 2х твоих
Код:
SELECT t1.id, t1.name
FROM tablitsa t1
WHERE
  (SELECT COUNT(t2.id)
  FROM tablitsa t2
  WHERE t2.name = t1.name) = 1
запрос вернет записи которые по полю name имеют только 1 запись
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #3  
Старый 17.05.2013, 12:32
childeroland childeroland вне форума
Прохожий
 
Регистрация: 15.04.2013
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Yurk@
а если попробовать вот такой запрос вместо 2х твоих
Код:
SELECT t1.id, t1.name
FROM tablitsa t1
WHERE
  (SELECT COUNT(t2.id)
  FROM tablitsa t2
  WHERE t2.name = t1.name) = 1
запрос вернет записи которые по полю name имеют только 1 запись

Я, конечно, попробую, вопрос, правда, заключался не в этом, а в том, как использовать индексы при работе с query... И меня осенило, что скорее всего ни как, ибо query используется в основном для создания клиент-серверных приложений, следовательно, всю работу с таблицами, в том числе и открытие и использование индексных файлов, берёт на себя СУБД. А у меня таблица локальная и запросы SQL сильно тормозят обработку, так что я переделал программу под использование Apollo Table
Ответить с цитированием
  #4  
Старый 17.05.2013, 13:26
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

При запросе драйвер доступа к БД будет смотреть на имеющиеся индексы к таблице. Насколько я помню, для DBF логика такая - если никакой сортировки не задано, то будет использован PK-индекс или при отсутствии такового первый из имеющихся индексов. Если сортировка имеет место быть, то используется индекс по полю в сортировке. А вот если используется для сортировки какое-то сложное выражения я уже не помню как он поступает.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
childeroland (10.06.2013)
  #5  
Старый 10.06.2013, 14:47
childeroland childeroland вне форума
Прохожий
 
Регистрация: 15.04.2013
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Насколько я помню, для DBF логика такая - если никакой сортировки не задано
Имеется в виду сортировка ключевым словом Order By?
Ответить с цитированием
  #6  
Старый 10.06.2013, 17:21
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,048
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Yurk@
а если попробовать вот такой запрос вместо 2х твоих
Код:
SELECT t1.id, t1.name
FROM tablitsa t1
WHERE
  (SELECT COUNT(t2.id)
  FROM tablitsa t2
  WHERE t2.name = t1.name) = 1
запрос вернет записи которые по полю name имеют только 1 запись

совсем обалдел??? Как ты думаешь, сколько такой корелирующий запрос будет выполняться? Вообще, для этого в SQL есть специальное ключевое слово - distinct.

Запрос
Код:
select distinct f1, f2, f3, ...
from t
вернет список уникальный комбинаций значений в указанных полях.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter