C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

стр.: (2) < 1 [2] >
как лучше выводить огромный ровсет?
olegenty
Отправлено: 15.07.2005, 13:58


Ветеран

Группа: Модератор
Сообщений: 2412



2 Gedeon — стоят, просмотр плана некорректно отображает о них информацию. неединыжды это наблюдал. пишет 0%, но убираешь функции и в разы увеличивается быстродействие.
Tertium
Отправлено: 15.07.2005, 14:05


Машинист паровоза

Группа: Почетный участник
Сообщений: 192



2olegenty: то есть 2 по 3 LTRIM(RTRIM(STR(datepart(…)))) — просто вынести в функцию и делать select my_get_date(...) 'дата', my_get_time(...) 'время', .... ? Пробовал, не то. Не совсем понял, как вывнести в функцию? Выборка в данном случае — полный кортеж. Боюсь никакой вынос тут не поможет. А инлайновое LTRIM-RTRIM-STR-datepart у меня выполняется быстрее (не намного, конечно) чем вызовы функции, хотя это и не выходит за пределы погрешности.
2Gedeon: ну что я могу сказать. smile.gif видимо у нас совсем разные SQL-движки smile.gif Значит, не оптимизирован 4 сп SQL сервер под win2k3... Сдаюсь, других вариантов у меня нет. Код я весь привёл.
У меня если откомментарить преобразования времени, то с case вместо 11 секунд запрос занимает 1 мин 49 сек. Вот вам и ничего не стоят...
Gedeon
Отправлено: 15.07.2005, 15:13


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (olegenty @ 15/07/2005, 13:58)
2 Gedeon — стоят, просмотр плана некорректно отображает о них информацию. неединыжды это наблюдал. пишет 0%, но убираешь функции и в разы увеличивается быстродействие.

Вообще-то да, проверил, 10000 записей

case
610
153 — без

Связ. табл.
950
830 — без

Интересное явление, на связанных таблицах разницы почти нет.
Gedeon
Отправлено: 15.07.2005, 15:20


Ветеран

Группа: Модератор
Сообщений: 1742



И еще по поводу желания юзером выбрать все и вся, закройте ему эту возможность со стороны интерфейса, будет пыхтеть, обьясните, что это для сервера вредно. Был у нас на работе случай, у моего коллеги в программе одна барышня нашла дыру в интерфейсе и очень полюбляла вот так все выгрести это приводило к падению оракла 8. Когда это выяснили и дыру закрыли про оракл забыли, а так уже собирались переставлять, потому что он падал, как проститутка.
Tertium
Отправлено: 15.07.2005, 15:49


Машинист паровоза

Группа: Почетный участник
Сообщений: 192



2Gedeon
Вот видите, результаты уже ближе к моим:)
Кстати, чем вы считаете милисекунды?

а что, DBGrid разве разом выполняет селект? Сложилось впечатление всётки (и как бы я сам делал) селект у dbgrid происходит с первой видимой на экране минус страница до последней видимой на экране плюс страница — и так при каждом передвижении ползунка, по мере надобности обращаясь к базе.

Потому что иначе не объснить, как это 1млн записей так легко просматривать в dbgrid smile.gif

Отредактировано Tertium — 15/07/2005, 16:00
** olegenty
Отправлено: 15.07.2005, 16:09


Не зарегистрирован







йопрст! так всё же зависит от курсора! ты на клиентском курсоре ни в жисть так не сможешь — годы пройдут, своп опухнет, пока вся мегаштука запией влетит на клиента!
при этом, использовать серверные курсоры — хуже нет. рискни-ка в распределённой системе на блокировочнике ими воспользоваться... тебя уволят на вторую секунду, после того, как все потребители разорвут контракты с твоей конторой!
Tertium
Отправлено: 15.07.2005, 16:58


Машинист паровоза

Группа: Почетный участник
Сообщений: 192



ктонть мне может объяснить в конце концов, как работает DBGrid?...

и ешё вопрос. в mysql есть такая фигня — limit n,m — работает как top n, но отдаёт записи не с начала, а с некоторой позиции m по полному ровсету. Я понимаю, что всё это можно смоделировать разными условиями в where, но чисто с использованием служебных слов типа top есть способ сделать limit 1000,2000 , например ?

Отредактировано Tertium — 15/07/2005, 21:15
olegenty
Отправлено: 18.07.2005, 10:23


Ветеран

Группа: Модератор
Сообщений: 2412



это есть на SQL.RU, точно помню. но это не есть гуд, поскольку работает на открытом серверном курсоре, а для MSSQL это вредно.

кроме того, DBGrid тут не при чём, всем ведает DataSet, а DBGrid только отображает.
AVC
Отправлено: 18.07.2005, 11:31


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

ктонть мне может объяснить в конце концов, как работает DBGrid?...

DBGrid отображает набор данных (dataset, rowset, курсор) столько строк, сколько получено в настоящий момент на клентское приложение. Так что все зависит от нд.
Если курсор "клентский", то сначала "вытягиваются" все записи на клиента а затем показываются в гриде. В ADO для этого есть специальное свойство а вообще, это можно легко имитировать для любого нд командой ds->Last() сразу после открытия. В этом случае сразу после получения всех данных связь можно разорвать.
Если курсор "серверные" (по моим наблюдениям так себя ведет BDE-ODBC и DOA), то при открытии набора данных он запрашивает у сервера столько строк, сколько ему нужно для работы (или указано в свойствах нд). В случае с сеткой — столько, сколько видно на экране. При смешении по курсору назад (к началу) — используются строки, запомненные на клиенте, а при смещении вперед (к концу) происходит запрос новой порции строк. За поддержание открытого курсора отвечает сервер и, следовательно, связь с сервером должна быть активной.

QUOTE

но чисто с использованием служебных слов типа top есть способ сделать limit 1000,2000 , например ?

Если сервер поддерживает нумерацию строк в нд то элементарно при помощи вложенного select.

Отредактировано AVC — 18/07/2005, 10:34
Tertium
Отправлено: 18.07.2005, 12:40


Машинист паровоза

Группа: Почетный участник
Сообщений: 192



блин, да, я имел ввиду не саму таблицу конечно. Датасет. Пардон, не точно выразил мысль.

Короче так не бывает, потому что так не бывает никогда?smile.gif
То есть всё сводится к тому, что ПОЛЬЗОВАТЕЛЮ НИКОГДА НЕЛЬЗЯ ОТДАВАТЬ ВСЁ и мелкомягкий субд сделан с подковыркой. Не могу понять, почему нельзя было всётки реализовать нормальную возможность — limit(n,m) — без всяких там вложенных запросов? Так чтобы это было не "вредно для MSSQL". Ведь используется же MSSQL для веб-разработок. А там многое на этом лимите построено.
Неудобно юзеру иногда руками вводить временные рамки для просмотра базы. Ну, это как стрелки на часах. Электронные вроде есть, но людям удобнее на стрелочных, полуэмпирически время определять, по расположению стрелок. Так и здесь, проглядел, полистал, ага, вот, нашёл.
QUOTE
Если сервер поддерживает нумерацию строк в нд то элементарно при помощи вложенного select.


Поясните, пожалуйста. Сервер MSSQL — поддерживает он нумерацию строк в ровсете? Если да, то каким вложенным селектом взять limit(1000,2000)?

Отредактировано Tertium — 18/07/2005, 21:38
Tertium
Отправлено: 21.07.2005, 02:54


Машинист паровоза

Группа: Почетный участник
Сообщений: 192



Если ответа ни у кого нет, то тему можно закрывать. Хотя так и не ясно, как же лучше выводить большй ровсет, если НАДО. Тот вариант, с запросом с сих до сих, когда сколько видно на странице, столько берётся с сервера — имхо оптимальный, но как универсально реализовать limit(сих,сих) для любого запроса?
olegenty
Отправлено: 21.07.2005, 06:51


Ветеран

Группа: Модератор
Сообщений: 2412



лентяй! на ссылку:
http://www.sql.ru/faq/faq_topic.aspx?fid=105
Tertium
Отправлено: 21.07.2005, 09:48


Машинист паровоза

Группа: Почетный участник
Сообщений: 192



Спасибо за ссылку. Жутковато делается выборка. Но, видимо, куда деваться.
Кстати:
https://rxlib.ru/forums/index.php?ac...t=4677&f=5&st=0
Следилку за постами написал между делом. Там написано в общих чертах, что к чему.
Tertium
Отправлено: 03.08.2005, 19:58


Машинист паровоза

Группа: Почетный участник
Сообщений: 192



Короче, ответом на вопрос "как лучше выводить огромный ровсет?" стало: огромный ровсет лучше не выводить:)
olegenty
Отправлено: 04.08.2005, 08:30


Ветеран

Группа: Модератор
Сообщений: 2412



так это истина в первой инстанции. ты спроси у самого себя, ЧТО ты можешь сделать с миллионом записей??? пара сотен для принятия решения — и то уже в напряг...
AVC
Отправлено: 04.08.2005, 09:09


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (Tertium @ 03/08/2005, 18:58)
Короче, ответом на вопрос "как лучше выводить огромный ровсет?" стало: огромный ровсет лучше не выводить:)

Петля замкнулась (пост №2). С чего начали, к тому и пришли.
стр.: (2) < 1 [2] >
Вернуться в Работа с базами данных в C++Builder