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: ну что я могу сказать. видимо у нас совсем разные SQL-движки Значит, не оптимизирован 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
Отредактировано 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
|
блин, да, я имел ввиду не саму таблицу конечно. Датасет. Пардон, не точно выразил мысль.
Короче так не бывает, потому что так не бывает никогда?
То есть всё сводится к тому, что ПОЛЬЗОВАТЕЛЮ НИКОГДА НЕЛЬЗЯ ОТДАВАТЬ ВСЁ и мелкомягкий субд сделан с подковыркой. Не могу понять, почему нельзя было всётки реализовать нормальную возможность — 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). С чего начали, к тому и пришли. |
|