![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как индексировать по значениям Look-Up-полей? [D7, MSSQL]
Aleksandr © (2004-01-15 13:44:00)
В таблице есть поле типа fkLookUp тз другой таблицы. При попытке создать IndexDef на это поле и задать таблице IndexName этого IndexDef"a ругается на неверный индекс поля. Как-то вообще можно делать сортировку по ResultField"ам LookUp"ов?
VAleksey (2004-01-19 12:24:00) [1]
Тебе в пункте [1] бал дан верный и абсолютно полный ответ :-)).
А тормоза при таком подходе не удивительны. Было бы удивительно если бы их не было.
Aleksandr (2004-01-19 11:22:00) [2]
Вот, кстати, истчо вопрос. Тормоза присутствуют при работе через провайдера. А есть способ получить "снимок" с лукапного источника, минуя провайдера? В том плане, чтобы делать "снимок", сохранять в файл, а из файла уже через другой источник получать готовые файлы?
Aleksandr (2004-01-16 17:48:00) [3]
Да уж... спасибо за участие в сем безуспешном предприятии... :( Придется, похоже, вернуться к БДЕ.
Vlad (2004-01-16 17:15:00) [4]
> Aleksandr © (16.01.04 16:31) [34]
У тебя CDS источник и CDS приемник как я понимаю физически на разных машинах находятся, т.е. один на клиенте, другой в каком нибудь RemoteDataModule на сервере?
Если так, то попробуй на сервере ввести еще один ClientDataSet и через провайдер подключить к источнику, грузить данные с лукап-полями в него, а из него уже на клиента. Больше мыслей никаких нет :(
Aleksandr (2004-01-16 16:31:00) [5]
Увы. Тормоза те же. Интересно, а можно ли как-то на самом сервере получить "снимок" результирующего набора источника наподобие того, который получит приемник. Чтобы сравнить, с какой скоростью он на сервере получится. Может, выгоднее окажется просто готовый стрим передать при таком раскладе.
Aleksandr (2004-01-16 16:08:00) [6]
Хорошая мысль. Счас попробую. Я пытался сделать несколько иной вариант: на приемнике сделать лукапы и добавить калькулируемые (internalcalc, просто calculated сортировать не дает) поля, равные лукапам. На такие калькулируемые поля он при попытке сортировать не ругается, и даже чего-то пытается сортировать, но сортирует как-то не то. То есть совсем по непонятному принципу.
Vlad (2004-01-16 15:40:00) [7]
> Aleksandr © (16.01.04 14:40) [31]
Нда... непонятно.
А не пробовал, Calculated-поля грузит нормально ? Просто шальная мысль посетила сделать calculated поле равное лукапному, и в приемнике грузить вместо лукапного - calculated
Aleksandr (2004-01-16 14:40:00) [8]
Гм. Со временем все в порядке. Я же написал уже, что, получив данные, CDS-приемник отключается от источника и переходит на независимое существование. Подключение к источнику происходит вручную, то есть исключено, что приемник при скроллинге автоматом будет что-то докачивать из источника - все таблицы работают только с файлом. В файлах данные полные.
Vlad (2004-01-16 13:50:00) [9]
> Если LookUp формируется CDS-приемником из нескольких CDS-источников,
> то тоже очень быстро (правда, скроллинг по Grid почему-то
> медленнее).
> А если LookUp формируется на CDS-источнике и CDS-приемник
> получает их в виде обычных полей, то загрузка идет неимоверно
> долго
Все это наводит на мысли, что ClientDataSet"ы все-таки загружают данные не сразу все, а порциями.
Попробуй провести эксперимент. Источник - без лукап полей (загрузка д. б. быстрая). После открытия источника сделай ClientDataSet.Last;
ClientDataSet.First;
Что будет со временем ?
Aleksandr (2004-01-16 13:35:00) [10]
2 Vlad © :
Совершенно верно. Механизм такой - приемник получает данные, сохраняет их в файл, отключается от источника, загружает файл и далее все скроллинги/фильтрации/сортировки идут через файл. В случае обновления данных операция повторяется.
Если источник не имеет LookUp, то загрузка происходит быстро. Если LookUp формируется CDS-приемником из нескольких CDS-источников, то тоже очень быстро (правда, скроллинг по Grid почему-то медленнее). А если LookUp формируется на CDS-источнике и CDS-приемник получает их в виде обычных полей, то загрузка идет неимоверно долго. При том, что просто открытие CDS-источника все так же быстрое.
Vlad (2004-01-16 13:29:00) [11]
Т.е. у тебя 2 ClientDataSet.
1- CDS - источник, откуда провайдер берет данные(FetchOnDemand=false)
2- CDS - приемник, куда перегружает (FetchOnDemand=false)
т.е. загрузка данных в оба ClientDataSet происходит полностью.
Если источник не имеет лукап полей, то загрузка происходит быстро.
Если источник имеет лукап поля, то загрузка происходит медленно.
Я верно понял ?
Aleksandr (2004-01-16 13:16:00) [12]
2 Vlad © :
Компонент TDataSetProvider берет из TClientDataSet"a. То есть у ClientDataSet есть имя файла и более ничего.
Vlad (2004-01-16 13:06:00) [13]
> Aleksandr © (16.01.04 12:52) [25]
> 2 Vlad ©:
> У меня FetchOnDemand итак стоит false. Поэтому уверен.
Откуда провайдер берет данные (какой компонент ?)
Aleksandr (2004-01-16 12:52:00) [14]
2 Vlad ©:
У меня FetchOnDemand итак стоит false. Поэтому уверен.
2 ibSkeart ©:
Это все о чем? К файловому Датасету запрос не сделаешь.
JibSkeart (2004-01-16 12:49:00) [15]
Я это обощел так сказать
запросом вывел аля лукап поля и сортирую по ним ,
НО в таком варианте будут проблемы с редактированием ,
особенно если юзаешь join ...
Vlad (2004-01-16 12:44:00) [16]
> у меня файловый ClientDataSet с LookUp"ами (кстати, открывается
> очень быстро)
Ты уверен что при этом "быстром" открытии в ClientDataSet попадают вседанные, а не только видимые в гриде ? :-)
Для проверки поставь FetchOnDemand = false и открой ClientDataSet
(что будет со скоростью закачки ?)
Vlad (2004-01-16 12:43:00) [17]
> у меня файловый ClientDataSet с LookUp"ами (кстати, открывается
> очень быстро)
Ты уверен что при этом "быстром" открытии в ClientDataSet попадают вседанные, а не только видимые в гриде ? :-)
Для проверки поставь FetchOnDemand = false и открой ClientDataSet
Academic (2004-01-16 12:41:00) [18]
Идея есть, но не проверял.
Что если отслеживать события на датасете и
когда прошел дропдаун переприсваивать индекс, а после выбора значения возвращать обратно. (может это глупость)
Aleksandr (2004-01-16 12:37:00) [19]
2 Плохиш_:
В смысле? Я сделал по Вашему совету: на сервере данных у меня файловый ClientDataSet с LookUp"ами (кстати, открывается очень быстро), к нему прицеплен провайдер, а на клиенте, в свою очередь, ClientDataSet, берущий данные через этого провайдера. В нем поля выглядят уже как fkData и сортируются очень быстро. Пик на одном единственном этапе - когда клиентский ClientdataSet эти данные закачивает - почему-то разница с просто открытием LookUpной таблицы и тем более просто таблицы совершенно кардинальная :(.
Плохиш_ (2004-01-16 12:10:00) [20]
>Aleksandr © (15.01.04 15:34) [12]
> В общем, проблема не в коде, а в том, чтобы заставить сортироваться
> LookUp"ы. И, что очень плохо, Ваш совет не прокатывает,
> потому что таблица может периодически работать без провайдеров,
> из файлов, поэтому все лукапы должны быть на ClientDataSet.
Ну сделай для отображения ещё один ClientDataSet