Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Grid и set filter
|
|||
|---|---|---|---|
|
#18+
Igor KorolyovТы в упор не прислушиваешься к вопросу ЗАЧЕМ пользователю 150000 записей!Сделай ему удобную форму задания параметров, продумай ЧТО он обычно ищет и КАК - сократи объём выборки до 100 ну максимум до 1000 записей (ессно используя параметризованный View). Потом добавь индексы по полям, входящим в условия отбора (отбираем по дате - делай индекс по дате, отбираем по какому-то коду, возможно связанному с другой таблицей - делай индекс по коду). И будет тебе счастье, будет заполнятся курсор за < 1 секунду! И все будут просто счастливы! А Grid+Filter и Grid+Relation медленная и мучительная смерть :( Вообще-то, пользователь хочет видеть все 650тыс записей, и по ним делать выборки , которые можно редактировать, но поскольку такие проблемы с гридом и фильтром, была идея поделить информацию по годам , что ли . Отсюда и 150тыс записей. Но это была плохая идея. Пока пробую выборки делать во View, и менять датасурс грида с самой таблицы на local view. Идеально было бы воспользоваться советом acrisuin'a , насчет set key . Индекс для выборки создать можно, а вот как использовать Set key range для выборки с разными типами полей непонятно. Точнее в текстовом виде некорректно как-то обрабатываются поля с датами. Или , если index по полям dtoc(data1) + region , то set key range '01.04.2004'+'Советский', '01.05.2004'+'Советский' выбирает информацию за 01.04.2004,01.05.2001, 01.05.2002,01.05.2003,01.05.2004 и не обращает никакого внимания на значение поля region. Или я что-то неправильно делаю?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 12:04 |
|
||
|
Grid и set filter
|
|||
|---|---|---|---|
|
#18+
Не лучше в схеме Информация->Параметры отбора->Выборка->Корректировка->Сохранение, поменять местами 1 и 2 этап? В DE формы помещается VIEW со свойством NoDataOnLoad=.T., а на форме контролы, с помощью которых формируются параметры отбора, после ввода параметров клик по кнопке "Отобрат/Обновить", REQUERY для VIEW и далее по схеме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 12:35 |
|
||
|
Grid и set filter
|
|||
|---|---|---|---|
|
#18+
2AleksMed Нельзя, потому что это будет уже совсем другая форма :) Собственно, задача стоит продержаться до появления новой программы. Поэтому,радикально переделывать процесс, и переучивать пользователей не хочется. Сейчас нужно : показать пользователю все записи что у него есть. А пользователь затем либо просматривает\редактирует(с возможностью отката изменений), либо делает выборку, просматривает ее и потом редактирует ее (раньше использовался фильтр), либо делает выборку для отчета(просто курсор). А сразу заставлять выбирать условие нам не подходит. Может пользователь просто полистать информацию за год-два хочет, а представление с нашей информации только открываться пару минут будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 13:05 |
|
||
|
Grid и set filter
|
|||
|---|---|---|---|
|
#18+
Bege А сразу заставлять выбирать условие нам не подходит. Может пользователь просто полистать информацию за год-два хочет, а представление с нашей информации только открываться пару минут будет. А если это будет начальный период дат например с .... по .... за 9мес., и открываться грид будет очень быстро. А если поковыряться , то можно присобачить на меню по правой кнопке мыши готовые периоды дат (например по 9мес), и будет для пользователя илюзия просмотра всей базы периода. И переучивать никого не надо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 13:43 |
|
||
|
Grid и set filter
|
|||
|---|---|---|---|
|
#18+
2Трехсотый Дело не в периоде. Просто открыть форму , посмотреть и поредактировать - нет проблем, ни со временем открытия, ни с чем либо другим. 4 года так работают, и вполне довольны :) Проблема в гриде. При больших объемах данных он не в состоянии показать нормально отфильтрованные данные(выборка делается по значениям от 1го до 6 полей таблицы, одно из которых - дата).Вот и приходится выкручиваться :) Может кто подскажет, как все-таки пользоваться set key range , если индекс по нескольким полям. Лучше с примером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 14:42 |
|
||
|
Grid и set filter
|
|||
|---|---|---|---|
|
#18+
Ну, для начала, если ты хочешь упорядочивать выборку по составному ключу с датой, то дату надо преобразовать к виду "ГГГГММДД". Специально для этого есть такая функция DTOS() На конце латинская "S". Не надо путать ее с функцией DTOC(). Это не одно и то же. И потом, рассмотри такой вариант как во вложении. Т.е. пользователю изначально открывается пустая формочка (пустой список). Он задает критерии и отображает нужный список. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 15:03 |
|
||
|
Grid и set filter
|
|||
|---|---|---|---|
|
#18+
2ВладимирМ Спасибо за подсказку dtos() :) Но как все-таки написать set key to range правильно, если индекс по dtos(time)+left(region). Устанавливать set key to range '20040101'+'Советский','20040131'+'Cоветский' по дате нормально, а на район - ноль внимания. Как правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 16:13 |
|
||
|
Grid и set filter
|
|||
|---|---|---|---|
|
#18+
В данном случае правильно перестроить индекс сначала по району, а потом по дате. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 18:14 |
|
||
|
Grid и set filter
|
|||
|---|---|---|---|
|
#18+
Только учесть, что имена районов состоят из разного числа буковок, в общем случае ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 18:16 |
|
||
|
Grid и set filter
|
|||
|---|---|---|---|
|
#18+
Bege2Трехсотый Дело не в периоде. Просто открыть форму , посмотреть и поредактировать - нет проблем, ни со временем открытия, ни с чем либо другим. 4 года так работают, и вполне довольны :) Проблема в гриде. При больших объемах данных он не в состоянии показать нормально отфильтрованные данные(выборка делается по значениям от 1го до 6 полей таблицы, одно из которых - дата).Вот и приходится выкручиваться :) Хочется разобраться, видимо я не понял проблему. Грид на форме? При открытии формы сделайте 2 курсора, 1- все 650тыс., 2- только часть (например за какой то период) для отображения в гриде. Все запросы и выборки делаете по 1 курсору., а результат (если он очень большой) разбиваете на части, и показываете в гриде только первую часть, при этом дав пользователю возможность переключаться между частями результирующего курсора?( например как в html <- 1,2,3-> все) Грид при небольших частях данных будет открываться моментально и отображать как надо. Или я опять не правильно понял проблему и все дело в сортировках внутри грида??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 09:47 |
|
||
|
Grid и set filter
|
|||
|---|---|---|---|
|
#18+
Скажу честно - не всё внимательно прочёл, но... 150000 записей (как минимум) действительно нужно пользователю? Что он с ними делает? Просматривает scroll'om? Помните "Хищника"? - "там кто-то есть... и это не человек..." Мой опыт: SET FILTER - может быть довольно неприятная вещь, но он оптимизируем! Я этим часто пользуюсь на довольно больших базах - 800000 записей, 20-30 полей - помогает... Особенно, если лень одолевает... :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 10:00 |
|
||
|
Grid и set filter
|
|||
|---|---|---|---|
|
#18+
Bege2ВладимирМ Спасибо за подсказку dtos() :) Но как все-таки написать set key to range правильно, если индекс по dtos(time)+left(region). Устанавливать set key to range '20040101'+'Советский','20040131'+'Cоветский' по дате нормально, а на район - ноль внимания. Как правильно? Must be Index tag : Код: plaintext 1. 2. 3. 4. 5. cyrilica letters. Andrius ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 10:47 |
|
||
|
Grid и set filter
|
|||
|---|---|---|---|
|
#18+
Трехсотый Грид при небольших частях данных будет открываться моментально и отображать как надо. Или я опять не правильно понял проблему и все дело в сортировках внутри грида??? 2Трехсотый: Проблема в том что надо выборку редактировать. С фильтрами все виснет, а представления открываются долго, а отдельно потом изменения закачивать в основную таблицу муторно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 11:59 |
|
||
|
Grid и set filter
|
|||
|---|---|---|---|
|
#18+
2 Bege авторНо у меня - 24 поля(от 7 до 60 симв) и 600тыс записей (каждый день прибавляется 500-600 записей Стоит обратить внимание на нормализацию. Наличие в оперативной таблице текстового поля района наводит на нехорошие размышления - нужно вынести в отдельную таблицу. И по другим полям тоже пройтись. авторВ данном случае правильно перестроить индекс сначала по району, а потом по дате Вот это скорее всего неправильно. Индекс по дате - самый эффективный (после первичного ключа), если эта дата соответствует временному порядку добавления записей и (как правило) не меняется. Соответственно, велика вероятность того, что большое количество записей с одинаковой датой будут физически находиться в одном/смежных кластерах диска (зависит от дефрагментации конечно). Эффективность работы дисковой подсистемы с учетом кэша возрастает многократно, особенно на больших таблицах. Т.е. совет использовать индекс по dtos() и set key to range очень правильный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 15:35 |
|
||
|
Grid и set filter
|
|||
|---|---|---|---|
|
#18+
Bege Проблема в том что надо выборку редактировать. С фильтрами все виснет, а представления открываются долго, а отдельно потом изменения закачивать в основную таблицу муторно. Мне кажется, Вы чего-то не понимаете: -) Либо пользователь ждет один раз пока откроется Local View, либо он наблюдает постоянные тормоза при перемещении по записям. Угадайте с одного раза, что пользователь предпочтет? Правильно, послать такую программу куда подальше. Тормозов быть вообще не должно -) Local View можно сделать обновляемым. Т.е. изменения внесенные во View автоматически попадут в исходную таблицу. Ничего специально закачивать в основную таблицу не надо. -) Уже неоднократно Вам говорили про то, что необходима оптимизация. Грубо говоря - это создание нескольких индексов по условиям отбора. Индексы ускорят как собственно выборку (открытие Local View), так и работу с фильтром. -) В конце концов, никто не мешает наложить фильтр на собственно Local View. Например, в Local View делается выбор только по дате, а все остальные фильтры накладываются уже на сам Local View (на результат выборки) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 15:43 |
|
||
|
Grid и set filter
|
|||
|---|---|---|---|
|
#18+
Hi XAndy XAndyВот это скорее всего неправильно. Индекс по дате - самый эффективный (после первичного ключа), если эта дата соответствует временному порядку добавления записей и (как правило) не меняется. Соответственно, велика вероятность того, что большое количество записей с одинаковой датой будут физически находиться в одном/смежных кластерах диска (зависит от дефрагментации конечно). Эффективность работы дисковой подсистемы с учетом кэша возрастает многократно, особенно на больших таблицах. Т.е. совет использовать индекс по dtos() и set key to range очень правильный В отрыве от контекста эти соображения верные. Но если вспомним, что хотел Bege ... BegeНо как все-таки написать set key to range правильно, если индекс по dtos(time)+left(region). Устанавливать set key to range '20040101'+'Советский','20040131'+'Cоветский' по дате нормально, а на район - ноль внимания. Как правильно? ... То получим совсем не то, что хочется. Bege хочет по одному району за период. А получается - за период, но районы игнорируются (нельзя сказать, конечно, что совсем игнорируются, но поведение странное). И почему же, интересно? ;-) А если вспомним про сортировку строк? ;-))) Что, запись '20040101'+'Турецкий' не попадет в set key to range '20040101'+'Советский','20040131'+'Cоветский' ??? ;-))))))))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 16:02 |
|
||
|
Grid и set filter
|
|||
|---|---|---|---|
|
#18+
Urri... То получим совсем не то, что хочется. Bege хочет по одному району за период. А получается - за период, но районы игнорируются (нельзя сказать, конечно, что совсем игнорируются, но поведение странное). И почему же, интересно? ;-) А если вспомним про сортировку строк? ;-))) Что, запись '20040101'+'Турецкий' не попадет в set key to range '20040101'+'Советский','20040131'+'Cоветский' ??? ;-))))))))) 2Urri : Вы правы, при такой сортировке все районы попадают в выборку. Конечно же правильнее (спасибо acrisiun!), наоборот, region+dtos(time) . Но полей для выборки шесть, и получается что надо либо создавать индекс каждый раз по выбранным полям (условиям выборки), что невозможно, потому что таблица буферизованная , да и по времени создание индекса не устраивает. Или насоздавать индексов заранее , сколько там получится комбинация из 6ти ? :) Тоже вопрос. 2 XAndy: Нормализация нужна, не спорю, даже по 4 полям можно. Не знаю о чем думали разработчики этой программы, возможно были и у них какие-то резоны. Сейчас просто нет смысла глобально переделывать это приложение, в ближайшее время начнем разработку замены. А пока поддерживаю в рабочем состоянии эту программу. ВладимирММне кажется, Вы чего-то не понимаете: -) Либо пользователь ждет один раз пока откроется Local View, либо он наблюдает постоянные тормоза при перемещении по записям. 2ВладимирМ : Пользователь заходя в форму для редактирования данных может делать сколько угодно выборок. Им так удобно : выбрал какие-то записи - отредактировал, чтоб другие записи даже и не видно было. Индексы есть, и насчет ускорить выборку индексированием я уже написала выше. Видимо, я немного туманно обрисовала проблему сначала, но сейчас-то уже все честно рассказала. Могу эту формочку вывесить, если кому интересно . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 16:49 |
|
||
|
Grid и set filter
|
|||
|---|---|---|---|
|
#18+
Лучше всего, конечно, SELECT. Но чтоб не сильно переделать, предлагаю индексы только по одному полю - всего 6 тегов по всем 6 полям сортировки. Далее SET ORDER TO и далее SET KEY TO по самому отсеивающему записи полю. Ну а оставшиеся условия - далее поставить SET FILTER TO BETWEEN(...) AND BETWEEN(...) AND ... Ну так, примерно. ;-) Фильтр будет оптимизироваться и, на фоне SET KEY TO тормозить не должон. Впрочем, может, условия фильтра будет пытвться оптимизироваться независимо от SET KEY TO. Тогда, несмотря на SET KEY TO, тормоза останутся. Что ж. Тогда убить все оставшиеся 5 тегов кроме того, по которому имеем SET ORDER TO и SET KEY TO. Или не убивать эти теги, но написать в SET FILTER TO BETWEEN(...) AND BETWEEN(...) AND ... NOOPTIMIZE. Предлагаю инициатору темы самому проверить, что в его условиях будет меньше тормозить. Возможно, вариант фильтра без оптимизации окажется гораздо быстрее. ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 18:34 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=32789306&tid=1595375]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
77ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
| others: | 263ms |
| total: | 445ms |

| 0 / 0 |
