![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Участник клуба
Регистрация: 07.07.2007
Сообщений: 1,518
|
![]()
Добрый день.
Проблема такая. Firebird 1.5. Как я уже писал в одном из постов, есть таблица с пол миллионом записей в которую нужно выполнить около 2-х тысяч сложных агрегатных запросов. Работает очень медленно или вообще виснет. Попробовал сделать представление (view), выбрав из этой таблицы только нужные для дальнейших расчетов записи (отфильтровав их на нужную дату и т.п.). Получилось всего около 8-и тысяч записей. Делаю запросы в этот view. Все работает, но скорость доступа к view та же самая, что и к большой таблице. Попробовал по другому... Создал реальную (временную) таблицу в БД с такой же структурой. Очищаю ее от старых записей, циклично добавляю в нее эти 8 тыс. записей и делаю эти 2 тыс. запросов . Весь расчет вместе с созданием временной таблицы занимает всего 5 секунд. Это меня вполне устраивает. Но совсем не нравится способ реалицации. Я раньше с view не работал, но всегда считал, что это виртуальная таблица в памяти и, следовательно, доступ к ней должен быть гораздо быстрее, чем к физической таблице на диске. Чего я не понимаю? И что делаю не так? Почему запросы к view работают так медленно? |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
Вьюшка каждый раз при обращение к ней делает запрос к физической таблице. Отсюда и проблемы. Гляньте в сторону индексов основной таблицы. Следует учитывать, что увеличение к-ва индексов замедляет редактирование
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#3 | |
Участник клуба
Регистрация: 07.07.2007
Сообщений: 1,518
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#4 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]() Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
![]() |
![]() |
![]() |
#5 |
фрилансер
Форумчанин
Регистрация: 18.07.2008
Сообщений: 107
|
![]()
у меня похожая проблема была,
сделал часть агреганных действий в триггере, за счет того что в триггере уже известна запись которая редактируется и ее не надо искать, работать стало быстрее на порядок
teleprog.net
teleprogramist@gmail.com |
![]() |
![]() |
![]() |
#6 | |
Участник клуба
Регистрация: 07.07.2007
Сообщений: 1,518
|
![]() Цитата:
Нужно сделать отчет по домам (не квартирам, а именно домам). 1. Вытаскиваю distinct-ом все дома (а они лежат в связанной таблице "адреса", отсюда и JOIN появился...) без учета квартир за последний месяц (их получается около 2-х тысяч). 2. Циклом вытаскиваю данные для каждого дома. Отчет делается всего лишь раз в месяц. По другому, вроде, никак. Можно, конечно, сразу при добавлении оплаты за квартиру определять какой это дом и плюсовать сумму к данному дому в какое-то поле или что-нибудь в этом роде... Но это пол программы надо переписать, что не есть для меня хорошо ![]() Последний раз редактировалось _SERGEYX_; 21.02.2012 в 23:50. |
|
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
Ладно. Вот выдернули во временную таблицу дома. Не вижу причин почему нельзя одним запросом выдернуть сразу всю сводную информацию по всем домам. Даже без этой временной таблицы. Покажите хоть примерную структуру таблиц и что получить нужно.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#8 | |
Участник клуба
Регистрация: 07.07.2007
Сообщений: 1,518
|
![]() Цитата:
То есть добавляю во временную таблицу все счета, где (дата = за_последний_месяц) и (оплата > 0) и т.д. Получается всего лишь 8 тысяч записей счетов. А потом циклично по таблице домов делаю запросы в эту временную таблицу. (select sum(...) из счетов где (дом = дому) и т.д.). |
|
![]() |
![]() |
![]() |
#9 | |
фрилансер
Форумчанин
Регистрация: 18.07.2008
Сообщений: 107
|
![]() Цитата:
ну и сделать начальную "иницилизацию" зато в любой момент потом можно сразу актуальные данные посмотреть
teleprog.net
teleprogramist@gmail.com |
|
![]() |
![]() |
![]() |
#10 |
Участник клуба
Регистрация: 07.07.2007
Сообщений: 1,518
|
![]()
Да, наверно, переписать придется много, я этой прогой всего 3-4 дня занимаюсь.
До меня ее кто-то писал явно на скорую руку... А в чужом коде разбираться, сами знаете... проще все с нуля написать. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Представления в Visual FoxPro | Studbgc | Помощь студентам | 0 | 27.12.2011 13:00 |
Форматы представления данных | Alkagolik | Помощь студентам | 0 | 06.02.2011 18:54 |
представления в interbase | Domanoff | БД в Delphi | 1 | 05.04.2010 18:43 |
форматы представления ссылок | ТАНя K | Microsoft Office Excel | 1 | 16.10.2007 08:14 |