Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Что делает оператор SELECT


Автор: RomanEEP 4.5.2009, 14:40
Что передается между клиентом и сервером и что выполняется на серваке при вызове оператора SELECT.

Автор: ZZZubec 4.5.2009, 14:43
Ставишь снифер и смотриш что идет на порту 3306 (MySQL)

Автор: pompei 4.5.2009, 14:47
На серваке делаются все вычисления и сортировки, а передаётся только результат.... хотя всё зависит от драйвера.

Автор: RomanEEP 4.5.2009, 15:41
мне интересна сама идеалогия (я использую FirBird но думаю остальны БД работают по схожему принципу).
Мне кажется при выполнении Select, по сути передаются сам запрос к серверу и сигнал что оператор отработал к клиенту. А клиент по необходимости по команадам Next, Prev запрашивает необходимые записи из созданного набора.
Тогда, по идеи на сервере для этого создается некая таблица по которой он отправляет данные клиенту по необходимости. Я не знаю насколько это близко к реальному. Но абсолютно не ясно как работает это таблица если результат запроса содержит большое кол-во записей, сопоставимых с размерами ОП?

Автор: LSD 4.5.2009, 19:13
Цитата(RomanEEP @  4.5.2009,  15:41 Найти цитируемый пост)
Мне кажется при выполнении Select, по сути передаются сам запрос к серверу и сигнал что оператор отработал к клиенту. А клиент по необходимости по команадам Next, Prev запрашивает необходимые записи из созданного набора.

В принципе это зависит от реализации. Например сервер может сразу отдать первые N строк клиенту. Но вообщем и целом, это так.



Цитата(RomanEEP @  4.5.2009,  15:41 Найти цитируемый пост)
Тогда, по идеи на сервере для этого создается некая таблица по которой он отправляет данные клиенту по необходимости. Я не знаю насколько это близко к реальному. Но абсолютно не ясно как работает это таблица если результат запроса содержит большое кол-во записей, сопоставимых с размерами ОП?

Опять же зависит от реализации, но обычно сервер использует некое временное дисковое пространство для хранения курсоров.

Автор: RomanEEP 4.5.2009, 20:33
Т.е. если я делаю select * from table в которой 1.000.000 записей и перекачаю с сервера только первую запись, то будет ли сервер (класса FireBird, MySQL, MSSQL, Oracle) бегать по всем строкам таблицы, что бы создать весь набор  и если нет? Могут ли быть использованы алгоритмы вроде того, что используются для поиска в Windows, т.е хранятся критерии выборки и указатель на текущую запись?

Автор: Zloxa 4.5.2009, 21:28
Цитата(RomanEEP @  4.5.2009,  20:33 Найти цитируемый пост)
Т.е. если я делаю select * from table в которой 1.000.000 записей и перекачаю с сервера только первую запись

За всех не могу говорить. 
Могу сказать только за оракл. 
Именно для такого запроса, оракл может выдать фетч до того как закончен скан.
Но если к запросу добавить order by по не индексированному полю, то выдать отклик до того, как закончится скан, а следом сортировка, будет невозможно.


Автор: pompei 5.5.2009, 05:23
Любая "нормальная" СУБД (типа MySQL, PostgreSQL, Oracle, FireBird, ...) делает всё возможное чтобы уменьшить затраты.

Есть ещё такая фича, которая называется версионность - это когда вы делаете запрос на чтение, а БД запоминает момент времени запроса, и когда во время запроса кто-то чужой модифицирует БД, то СУБД сохраняет оригинальные значения полей (чтобы их вам дать, если надо будет) до тех пор, пока не будет до конца выполнен ваш запрос - т.е. получается, что когда вы обращаетесь к БД, для вас создаётся отдельная ваша личная неизменная версия БД на момент запроса.

Автор: RomanEEP 5.5.2009, 10:35
Цитата(Zloxa @  4.5.2009,  21:28 Найти цитируемый пост)
Именно для такого запроса, оракл может выдать фетч до того как закончен скан.

Хорошо, а будет ли он вообще проводить скан до конца, если я не буду от него запрашивать другие записи?
Оч интересно узнать аналогичное про жарптицу!

Автор: Zloxa 5.5.2009, 11:11
Цитата(RomanEEP @  5.5.2009,  10:35 Найти цитируемый пост)
а будет ли он вообще проводить скан до конца, если я не буду от него запрашивать другие записи?

нет

Автор: nichnikov 18.5.2009, 17:04
Цитата(RomanEEP @ 4.5.2009,  13:41)
мне интересна сама идеалогия (я использую FirBird но думаю остальны БД работают по схожему принципу).
Мне кажется при выполнении Select, по сути передаются сам запрос к серверу и сигнал что оператор отработал к клиенту. А клиент по необходимости по команадам Next, Prev запрашивает необходимые записи из созданного набора.
Тогда, по идеи на сервере для этого создается некая таблица по которой он отправляет данные клиенту по необходимости. Я не знаю насколько это близко к реальному. Но абсолютно не ясно как работает это таблица если результат запроса содержит большое кол-во записей, сопоставимых с размерами ОП?

ну да,смотря какой клиент.
Если за клиента взять классы работы скриптовых языков,то реализация перехода по записям будет представлена функционалом

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)