![]() |
|
Модераторы: skyboy |
![]()
|
|
| Majestio |
|
||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 19.12.2010 Репутация: нет Всего: нет |
Исходные данные:
Есть четыре таблицы - Clients, RubricaNames, Rubricator, Points2Rubrica
Где: Clients - карточки клиентов RubricaNames - заведенные пользователем рубрикаторы Rubricator - значения рубрикаторов Points2Rubrica - таблица привязок значений рубрикаторов к карточкам клиентов Задача: вывести плоскую таблицу, в каждой записи которой есть Id, FamilyId из карточки и 12 полей - привязанных значений рубрикатора (или 0, если привязки нет), а так же 1 или 0, в зависимости от "совершеннолетия". Пока решил следующим запросом:
Но быстродействие как-то немного сомнительно. 1000 записей обрабатывается в районе 14 секунд. Как считаете, есть куда оптимизировать? И если "да", покажите пожалуйста куда копать. А еще бы лучше на примере 2 рубрикаторов. Это сообщение отредактировал(а) Majestio - 12.8.2014, 14:53 |
||||||||||
|
|||||||||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
СУБД?
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Majestio |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 19.12.2010 Репутация: нет Всего: нет |
||||
|
||||
| tzirechnoy |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 2 Всего: 16 |
1) Да, 14ms на запись -- это много.
2) Но не так, чтобы дофига много. Два оборота диска на 7200. 3) Но, в любом случае, если хорошо подумать -- то можно меньшэ. Конечно, в обычном случае всё сложно -- поскольку дажэ если в points2rubrica закэшыровано всё, кроме листьев индэкса (это реалистичное предположэние, впрочем, если Вы скажэте, какой размер базы и что за жэлезо -- то обусждать это можно будет предметнее), то у нас два обращения -- к листу индэкса и к записи в таблицэ. Но во-первых, в среднем от диска ждут, что он сможэт дойти до нужного места за пол-оборота, во-вторых, некоторый процэнт points2rubrica тожэ можэт быть закэшырован -- так что можно добивать где-то двукратного ускорения без спецыальных операцый вроде прогрева кэша, засасывания в память, перехода на index-only read или покупки SSD. 4) Непонятен смысл двух уровней -- rubricator+rubricanames. Но, в любом случае, если там по 50 записей в каждой таблицэ, то это не важно. 5) Какие индэксы и ключи? Ну, банальное: points2rubrica должно иметь (point, system) BTREE, а clients -- дату, видимо, тожэ BTREE. |
|||
|
||||
| Majestio |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 19.12.2010 Репутация: нет Всего: нет |
Пробую с left join'ами пока. Еще соображаю че к чему. Плодятся NULL - но все отсекать нельзя, ибо если ни одной привязки нет, хотя бы одна запись со всеми NULL быть дожна.
Железо на серваке пока "обнять и плакать". Pentium 3, RAM 128Мb, FreeBSD 9.0 урезанная "по самое нихачю", HDD 12Gb. Пока держит 10 рабочих мест более-менее. После релиза проекта сядет на Core i3, RAM 16Gb, SATA2 или 3 в RAID-0. Замеры делал на FreeBSD под виртуальной машиной с примерно последним оборудованием. Смысл "двух уровней -- rubricator+rubricanames" в том, что rubricanames - хранит названия создаваемых пользователем (вернее админом) рубрикаторов и их ID. rubricator - хранит сами значения рубрикаторов (привязывязка rubricanames.Id = rubricator.GroupId) Индексы и ключи не указывал в посте. По всем Id и связанными полями. |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Majestio |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 19.12.2010 Репутация: нет Всего: нет |
||||
|
||||
| Majestio |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 19.12.2010 Репутация: нет Всего: нет |
Удалость ускорить в 7 раз, багодаря наводке Влада.
Сейчас исполняется 2 сек вместо 14 на 1048 записях.
Для функционирования этого хозайства пришлось во FreeBSD установить порт:
Зарегать расширение:
Ну вот как бы и все. Для меня вопрос решен. Если есть какие замечания - буду только рад! Akina, еще раз большое спасибо! |
||||||
|
|||||||
| tzirechnoy |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 2 Всего: 16 |
Вам мало, что вы еврей? © анекдот Ну, серьёзно, с замерами и так проблем вагон -- зачем ещё виртуалку присобачивать?
Это достаточно маловероятно. По идее -- планы запросов отличаться не должны. Ищите в другом месте. Например, если там всего 1000 записей -- то, очевидно, разница между "из кэша" и "с диска" будет на несколько порядков. |
||||
|
|||||
| Majestio |
|
||||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 19.12.2010 Репутация: нет Всего: нет |
Выхода нет. Комп один, а различного барахла разработчика - валом. Разнес все по виртуалкам и не жужжу. Все есть в бэкапах. Завалил Фрю - поднял, Мак лег - тем же макаром. Под венду пишу - сидя под Gentoo Linux, имея 4 тулчейна win 32/64 linux 32/64 ... так же под виртуалкой). На хостовой машине тока Far, M$ Офис и FireFox. Вощем - так уютнее, гемора с основной системой нет.
Комменты дать не могу - тупо гонял в Navicat'е запросы - там время засекается. Склонен доверять увиденному, да и субъективно по ожиданию - заметно.
Ничче не понял! Гонял разные выборки - 100, 400, 800, 1000 записей. "В семь раз" - везде работали. |
||||||||||||
|
|||||||||||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Ага... в первоначальном варианте - 11 коррелированных подзапросов, в окончательном ни одного, а планы должны быть одинаковые? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Просто любопытствую, во что преобразовывает crosstab? В смысле что ему эквивалентно/с чем это можно сравнить? Группировка? -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Это эмуляция pivot query из готового линейного набора данных. Ну или сводная таблица Экселя. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
По индексам(составным) должны бы весьма ништяково отшарохать. Временами, для частных случаяев кореляхами удавлось аггрегаху перефорсить Добавлено через 1 минуту и 10 секунд
это понятно. Просто интересно что лежит в основе. Возможно я не прав, но у меня есть предполоежние, что функция в своих недрах динамически преобразует запрос в нативный синтаксис -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Если учесть, что запрос, подготавливающий данные, передаётся функции как литерал, а не как набор данных - вполне может быть. Хотя я думаю, что crosstab() просто выполняет функции фронт-энда, сливая серверу переданный ей запрос и самостоятельно парсит текст обёртки, обрабатывая выхлоп. Либо,что мне кажется ещё более вероятным, заворачивает поток данных от внутреннего запроса обратно на сервер, делая вид, что это внешний forward-only набор данных от linked-сервера - то есть выполняет внешний и внутренний запросы раздельно, связывая им входы-выходы. Может, даже формируя для этого отдельные connections... хотя вот это уже вряд ли. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |