|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
Добрый день. Меньше слов, больше дела. Помогите отладить схему создаваемого view, чтобы в колонках отображались правильные цифры. Вот к примеру, по задумке в столбце sGopher в первой строке должно светиться 1, а светится 4, то есть, "WHERE Our_Bool = 1" просто игнорируется. В столбце sGold оно должно посчитать сумму Gold только в тех строках, где Our_Bool = 1, а по факту - считает по всем строкам, опять же условия игнорируются. В столбце sOur всегда считает правильно, вот это меня вводит просто в ступор - наверное, там просто нет условий, чтобы их игнорировать. Пример базы - во вложениях, DDL для создания VIEW - вот. Заранее спасибо. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2017, 06:42 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
veretragna, Код: sql 1.
а это вообще документированная конструкция? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2017, 09:41 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
pit_alex, Код: sql 1. 2. 3.
Может как то так? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2017, 09:44 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
pit_alex, Вообще эту конструкцию Код: sql 1.
я видел в туториалах на просторах, правда, в другом контексте. Она точно работает, если сделать вот так: (вырезка из изначальной схемы) Код: sql 1. 2.
Но в таком варианте оно слишком медленно работает, и чем больше база, тем медленнее работает. Поэтому я решил переделать запрос и использовать INNER JOIN, так работает почти мгновенно, но с такими приколами. Ваш вариант может сработать, если выйдет, отпишусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2017, 18:22 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
Заработало. Правда, без толку - все равно, чем больше база, тем медленнее работает выборка. Может, и с этим поможете? Этот view используется для построения списка в виртуальном listview в десктопном приложении. Вот такой view получился: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Так вот. Для извлечения данных в список используется такая конструкция: Код: sql 1. 2.
"ORDER BY", сдается мне, и замедляет сортировку на больших базах. Можно ли как-то оптимизировать выборку на скорость? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2017, 21:00 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
veretragna"ORDER BY", сдается мне, и замедляет сортировку на больших базах. Можно ли как-то оптимизировать выборку на скорость?Конечно можно! Убери ее нафиг и никогда больше не используй ORDER BY. Сортировать надо на клиенте, а не в sql. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2017, 22:28 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
White Owl, слабо представляю себе, как это сделать в клиенте. Виртуальный listview, около 100к записей, которые надо отсортировать по любой из колонок. Варианта два: или грузить это все в память и сортировать там, или нафиг сортировку вообще ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2017, 23:31 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
Сортировка виртуального listview - это вообще задачка не из легких, и усугубляется тем, что ЯП скриптовой. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2017, 23:35 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
veretragnaWhite Owl, слабо представляю себе, как это сделать в клиенте. Виртуальный listview, около 100к записей, которые надо отсортировать по любой из колонок. Варианта два: или грузить это все в память и сортировать там, или нафиг сортировку вообщеДа, грузить в память. Нет, не надо грузить в память 100К записей, нет на свете человека который сможет прочить 100К строк на экране. Человек способен осознать максимум пару десятков строк. Для б о льших объемов - агрегаты и аналитика. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2017, 00:41 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
White Owl, приведите, будьте добры, пример, который выведет на экран 20 строчек: элементы с индексом от 10000 до 10020, отсортированных по sGold в общей массе. Виртуальный listview выдает вместе с сообщением WM_NOTIFY LVN_ODCACHEHINT только начальный и конечный индекс элементов, для которых надо извлечь данные. Колонку сортировки держим в уме, получая его от события WM_NOTIFY LVN_COLUMNCLICK. "Для больших объемов - агрегаты и аналитика." - это слишком расплывчатая рекомендация. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2017, 02:22 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
veretragnaWhite Owl, приведите, будьте добры, пример, который выведет на экран 20 строчек: элементы с индексом от 10000 до 10020, Код: sql 1.
veretragna отсортированных по sGold в общей массе.Это задача для listview. veretragna Виртуальный listview выдает вместе с сообщением WM_NOTIFY LVN_ODCACHEHINT только начальный и конечный индекс элементов, для которых надо извлечь данные. Колонку сортировки держим в уме, получая его от события WM_NOTIFY LVN_COLUMNCLICK.Что это за "виртуальный listview"? Да еще и выдающий системные виндовые события??? Ты вообще на каком языке пишешь клиента? С каким фреймворком? В общем, читать тут: https://en.wikipedia.org/wiki/Model–view–presenter Данные читаются из БД на уровне модели, сортируются на уровне представления. veretragna "Для больших объемов - агрегаты и аналитика." - это слишком расплывчатая рекомендация.Будет конкретный вопрос о том, что нужно от большого объема - дам более конкретный совет. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2017, 19:09 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
White Owl, что такое virtual listview (из MSDN) . То, что Вы говорите - это задача listview только тогда, если сам listview умеет сортировать данные. Listview в виртуальном режиме ничего не сортирует, а только отправляет родительскому окну сообщение LVN_ODCACHEHINT с адресом начального и конечного элемента, которые надо извлечь в память, и LVN_GETDISPINFOW, если элемент надо отрисовать. Все остальное - забота самой программы, а не контроля. Насчет языка: да какая разница? Приложение десктопное под винду, язык скриптовой, GUI нарисован на чистом WinAPI. авторБудет конкретный вопрос о том, что нужно от большого объема - дам более конкретный совет. Задача описана в ходе треда. Есть у нас view: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
В результате может быть от нескольких тысяч до 100 тысяч строк. Нужно извлечь, например, 20 строк с индексом от 10000 до 10020 с учетом сортировки. Но с такой формой VIEW чем больше база, тем медленнее работает выборка. Как добиться скорости? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2017, 20:34 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
Если Вам удобнее выражать мысли в С++, я легко пойму. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2017, 20:36 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
К слову, в результате активного гугления узнал, что во взрослых БД эта задача решается созданием индекса на VIEW. SQLite, к сожалению, не позволяет индексировать VIEW. Как вариант - можно пожертвовать памятью и создать вместо VIEW третью полностью индексированную таблицу, но база разрастется, естественно. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2017, 20:40 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
veretragna, White Owl прав, вам необходимо ограничить запрос условием, так как 100К записей пользователю не нужно. Создавать третью таблицу это конечно да но тогда придется замарачиваться с триггерами для постоянного обновления данных в этой таблице ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2017, 08:28 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
White OwlveretragnaWhite Owl, приведите, будьте добры, пример, который выведет на экран 20 строчек: элементы с индексом от 10000 до 10020, Код: sql 1.
Этот запрос неверный и естественно он будет работать быстро. Для клиента стоит задача сначала отсортировать все 100к по полю X и уже потом вырезать страницу на 20 записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2017, 10:44 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
PPA, а почему нельзя сразу взять 20 записей если известен критерий для поля X? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2017, 12:02 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
pit_alex, Пользователю нужна сортировка выборки в 100к по атрибуту (которому он кликнул) и только потом локация на нужную страницу. для реализации на клиенте - нужен полный фетч всех данных на сервере это требует вложенного order by такого вида: select rownum as n,.* from ( .... order by x ) where n>=10000 and n<=10020 частные случаи возможно и можно оптимизировать но в общем случае.... расскажи если знаешь как это сделать - интересно посмотреть на решение ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2017, 13:14 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
PPA, Если задача взять определенное количество записей с..по из отсортированного списка, тогда конечно без ORDER BY никак. Можно уйти от View, создать индексы и работать с самим запросом из приложения. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2017, 15:18 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
veretragnaТо, что Вы говорите - это задача listview только тогда, если сам listview умеет сортировать данные.Не верно. View - ничего не сортирует и ничего не хранит. Оно только отображает то, что ему отдал presenter. Грубо говоря: Model - читает из базы данные и хранит все данные в памяти при нужде подчитывая из базы или записывая обратно, Presenter - решает какие строки у Model запрашивать, а View - только рисует на экране то что выдает Presenter. veretragna Listview в виртуальном режиме ничего не сортирует, а только отправляет родительскому окну сообщение LVN_ODCACHEHINT с адресом начального и конечного элемента, которые надо извлечь в память, и LVN_GETDISPINFOW, если элемент надо отрисовать. Все остальное - забота самой программы, а не контроля.Ну вообще-то это и есть "контроль". MVP это вариация MVC... veretragnaНасчет языка: да какая разница? Приложение десктопное под винду, язык скриптовой, GUI нарисован на чистом WinAPI.Вот в чистом WinAPI и проблема - он сам по себе достаточно замороченный и многобуквенный. Вмешивать туда еще и работу с БД.... Можно конечно, но это уже явно не задача для форумных постов. Это задача для полноценного рабочего дня (длинной в несколько месяцев минимум). Поэтому, я тебе очень сильно рекомендую забить на WinAPI и перейти на что-нибудь достаточно выскоуровневое чтобы не париться с ручной обработкой WM сигналов. veretragnaВ результате может быть от нескольких тысяч до 100 тысяч строк. Нужно извлечь, например, 20 строк с индексом от 10000 до 10020 с учетом сортировки. Но с такой формой VIEW чем больше база, тем медленнее работает выборка. Как добиться скорости?Ну я уже говорил что "извлечь 100 тысяч строк" это бессмысленно. Никто не будет читать эти 100 строк, ни с экрана, ни с бумаги. Человек на самом деле хочет или сумму, или среднее, или количество... Чтобы извлечь "20 строк с индексом от 10000 до 10020 с учетом сортировки", тебе нужно решить два вопроса: 1) По какому критерию ты сортируешь? У тебя в таблице какое-то поле есть? Или формула по нескольким полям? 2) Ты знаешь чем "нужные" 20 строк отличаются от "не нужных"? По какому условию, перебирая отсортированную таблицу ты решаешь "пока не интересно, пока не интересно.... о! Вот эти строки уже интересны. А дальше опять не интересно". Вот как только ты смог ответить на эти два простых вопроса, то у тебя сразу появляется запрос вида: Код: sql 1.
И никаких сортировок не нужно. Model формирует подобный запрос на основе GUI формы с кнопочками и переключателями и вытягивает данные из БД, Presenter решает в каком порядке отдавать данные на просмотр, а View уже рисует на экране. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2017, 19:10 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
pit_alexPPA, Если задача взять определенное количество записей с..по из отсортированного списка, тогда конечно без ORDER BY никак. Можно уйти от View, создать индексы и работать с самим запросом из приложения.Ну с чего это вдруг "никак". ORDER BY он всегда по какому-то полю таблицы делается (или комбинации полей). Ну и что тебя останавливает просто добавить в запрос критерий "от и до" по этому самому полю? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2017, 19:12 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
White Owl Ну и что тебя останавливает просто добавить в запрос критерий "от и до" по этому самому полю? Проблема в том что иногда нужно оценить эти "от" и "до" и они заранее не известны. Никогда не открывали в GUI большую таблицу первый раз? при старте она содержит 100К записей и ты начинаешь разбираться c этим "мусором" Чтобы узнать доступные значения в колонке x можно сделать операции 1. group by/ distinct + отметить галками интересные значения (так работает популярная функция фильтрации в экселе) 2. order by по x + дать возможность быстро полистать "простыню" страниц. Вероятно стоит задача реализовать в GUI второй вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2017, 22:30 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
White OwlПоэтому, я тебе очень сильно рекомендую забить на WinAPI и перейти на что-нибудь достаточно выскоуровневое чтобы не париться с ручной обработкой WM сигналов. До этого отлично справлялся, работаю годами, привык. Но допустим, я перешел на высокоуровневую обертку типа wxWidgets. Как это мне поможет работать с виртуальным режимом listview? Обычный режим listview не подходит, потому что в обычном режиме отрисовка 7000 элементов (маленькая тестовая база) одним махом занимает 3 секунды на слабеньком ноутбуке типа моего переносного. А если записей 100к или 1кк? Только виртуальный режим позволяет держать в списке от 10к элементов и не упасть по скорости. White OwlЧтобы извлечь "20 строк с индексом от 10000 до 10020 с учетом сортировки", тебе нужно решить два вопроса: 1) По какому критерию ты сортируешь? У тебя в таблице какое-то поле есть? Или формула по нескольким полям? 2) Ты знаешь чем "нужные" 20 строк отличаются от "не нужных"? По какому условию, перебирая отсортированную таблицу ты решаешь "пока не интересно, пока не интересно.... о! Вот эти строки уже интересны. А дальше опять не интересно". Вот как только ты смог ответить на эти два простых вопроса, то у тебя сразу появляется запрос вида: Код: sql 1.
И никаких сортировок не нужно. Мне нужно, чтобы в любой момент времени я мог посмотреть , например, 20 записей с максимальным или минимальным sGold, sGopher, sLoss или других значений в любой колонке. Для того сортировка и делается, PPA совершенно правильно говорит. White Owl, почему вы всячески увиливаете от прямо заданного вопроса: как добиться скорости? Не нужны мне Model-View-Presenter на маленьком проекте всего в 150кб чисто моего кода, хватит их сюда пихать по теме и без темы. Они не решают проблему скорости, а просто описывают модель связи разных компонентов программы. Не знаете - так и скажите. Думаю, средствами SQLite данная задача неразрешима, если задействовать View. Лучше всего выглядит выход с третьей таблицей и триггерами на автообновление этой таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2017, 23:13 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
PPAWhite Owl Ну и что тебя останавливает просто добавить в запрос критерий "от и до" по этому самому полю? Проблема в том что иногда нужно оценить эти "от" и "до" и они заранее не известны.Не правда. Они всегда заранее известны хотя бы в духе "записи за вчера или неделю назад". Не надо путать разработчика и юзера. Юзер почти никогда не может объяснить разработчику что ему нужно, но в своих данных юзер ориентируется очень хорошо. PPA2. order by по x + дать возможность быстро полистать "простыню" страниц.И в чем смысл для юзера в таком листании? Ну вот представь себе бухгалетра, который получает на экран 100К платежек и она начинает эти 100К листать. Зачем она это делает? Твои варианты? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2017, 21:05 |
|
Отладка view с вложенными select-колонками
|
|||
---|---|---|---|
#18+
veretragnaДо этого отлично справлялся, работаю годами, привык. Но допустим, я перешел на высокоуровневую обертку типа wxWidgets. Как это мне поможет работать с виртуальным режимом listview? Обычный режим listview не подходит, потому что в обычном режиме отрисовка 7000 элементов (маленькая тестовая база) одним махом занимает 3 секунды на слабеньком ноутбуке типа моего переносного. А если записей 100к или 1кк? Только виртуальный режим позволяет держать в списке от 10к элементов и не упасть по скорости.Вот как раз по этому, я и советую перейти на что-то выскоуровневое, потому что там это "упасть по скорости отрисовки из-за объема" уже решено. Использовать системный виджет от виндов это конечно круто и хардкорно, но в 2017-ом году - это не оправдано экономически. Любую программу можно написать на ассемблере, но нужно ли быть настолько крутым? veretragnaМне нужно, чтобы в любой момент времени я мог посмотреть , например, 20 записей с максимальным или минимальным sGold, sGopher, sLoss или других значений в любой колонке.Ну это пожалуй единственный случай когда ORDER BY (в паре с индексом) может помочь: Код: sql 1.
veretragnaWhite Owl, почему вы всячески увиливаете от прямо заданного вопроса: как добиться скорости? Не нужны мне Model-View-Presenter на маленьком проекте всего в 150кб чисто моего кода, хватит их сюда пихать по теме и без темы. Они не решают проблему скорости, а просто описывают модель связи разных компонентов программы. Не знаете - так и скажите. Если ты не веришь в решение, это не означает что оно не верное. И вообще, тебе не кажется что оценивать скорость работы с данными по объему кода слегка странновато? Итоговое время обработки данных зависит не от объема твоего кода, а от объема данных с которыми твой код работает и алгоритмов по которым твой код работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2017, 21:34 |
|
|
start [/forum/topic.php?fid=54&msg=39386517&tid=2008539]: |
0ms |
get settings: |
11ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 256ms |
total: | 389ms |
0 / 0 |