|
|
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
Как грамотно определить количество строк в полученном ResultSet? В книге "Сервлеты и JavaServer Pages" написано: "Единственный способ определения количества строк - постоянное повторение вызова метода next объекта ResultSet, пока он не возвратит значение false". Неужели только так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2004, 11:29 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
GMaxКак грамотно определить количество строк в полученном ResultSet? В книге "Сервлеты и JavaServer Pages" написано: "Единственный способ определения количества строк - постоянное повторение вызова метода next объекта ResultSet, пока он не возвратит значение false". Неужели только так? ResultSet rs = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY).executeQuery(qry); rs.last(); int resulSetSize = rs.getRow(); rs.beforeFirst(); или выполнить select count(*) from table1 where a > 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2004, 11:34 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
Исчерпывающе! Пасиба. Значит книги врут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2004, 11:42 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
Две копейки: столкнулся с тем, что Oracle 9i JDBC Driver позволяет получать ResultSet.TYPE_SCROLL_SENSITIVE только для ResultSet'ов, полученных через выполнение select'а, но не как refcursor, из процедуры, к примеру. Такое вот ограничение.. В Oracle 10g JDBC уже работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2004, 12:46 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
В книге навверное подразумевался JDBC 1.0, т.к. в этой версии можно по Resultset пройти только один раз в одном направлении А способ предложенный А.Грасоff™ будет работать только начиная с JDBC 2.0 Так что не надо на книжки гнать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2004, 13:31 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
SmaLLВ книге навверное подразумевался JDBC 1.0, т.к. в этой версии можно по Resultset пройти только один раз в одном направлении А способ предложенный А.Грасоff™ будет работать только начиная с JDBC 2.0 Так что не надо на книжки гнать Ну зачем же сразу так грубо? Может быть и 1.0, правда ссылки на версию в книге я не нашел. Кстати книга была написана в 2000 году, а JDBC 2.0 появился еще в 1998 если не ошибаюсь. Но в 2000 точно был. Так что вот... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2004, 14:07 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
А.Грасоff™ GMaxКак грамотно определить количество строк в полученном ResultSet? В книге "Сервлеты и JavaServer Pages" написано: "Единственный способ определения количества строк - постоянное повторение вызова метода next объекта ResultSet, пока он не возвратит значение false". Неужели только так? ResultSet rs = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY).executeQuery(qry); rs.last(); int resulSetSize = rs.getRow(); rs.beforeFirst(); Ну ты научишь, Граспых. Память-то не резиновая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2004, 23:13 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
чего-то не получилось у меня получить OutOfMemory на [select * from table]. в table - 13796090 строк. сервер БД - Microsoft SQL 2000 драйвер на клиенте - JNetDirect 3.3 клиентский комп - PIV/2GHz, 512MB, Windows 2000 Prof. серверный комп - 2 x PIII/1.3GHz, 1GB, Windows 2000 Prof. на клиенте память при выполнении java-теста, аналогичному привиденным, выросла на 6MB, сервер тоже не особо напрягался. -- FUCK THE iNET!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2004, 12:18 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
А.Грасоff™чего-то не получилось у меня получить OutOfMemory на [select * from table]. в table - 13796090 строк. сервер БД - Microsoft SQL 2000 драйвер на клиенте - JNetDirect 3.3 клиентский комп - PIV/2GHz, 512MB, Windows 2000 Prof. серверный комп - 2 x PIII/1.3GHz, 1GB, Windows 2000 Prof. на клиенте память при выполнении java-теста, аналогичному привиденным, выросла на 6MB, сервер тоже не особо напрягался. -- FUCK THE iNET!!! где-та я видел про ето (оракловый драйвер) топик, тока найти не могу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2004, 12:26 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
zalexakaгде-та я видел про ето (оракловый драйвер) топик, тока найти не могу это? http://www.sql.ru/forum/actualthread.aspx?tid=32346 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2004, 12:30 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
А.Грасоff™ zalexakaгде-та я видел про ето (оракловый драйвер) топик, тока найти не могу это? http://www.sql.ru/forum/actualthread.aspx?tid=32346 ниа не то, нимагу вспомнить словов для поиска зы кстати ты там тоже участвовал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2004, 12:35 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2004, 12:39 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
Курсор Oracle обеспечивает последовательный доступ только в одном направлении (несмотря на скроллируемость резервного набора). Поэтоу предложенный метод пройти до конца, а потом вернуться в начало приведет только к повторному выполнению запроса и перебору всех строк, но скрытым образом. То есть сначала все строки извлекаются на клиента, а потом выполняется повторно запрос и в полученном НОВОМ наборе курсор устанавливается в начало. Если уж так хочется узнать количество строк, перед основным запросом выполни SELECT COUNT(*) FROM ... WHERE "условие" где "условие" точно такое как в основном запросе. Все таки будет меньший напряг для системы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2004, 14:04 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
MBasilКурсор Oracle обеспечивает последовательный доступ только в одном направлении (несмотря на скроллируемость резервного набора). Поэтоу предложенный метод пройти до конца, а потом вернуться в начало приведет только к повторному выполнению запроса и перебору всех строк, но скрытым образом. То есть сначала все строки извлекаются на клиента, а потом выполняется повторно запрос и в полученном НОВОМ наборе курсор устанавливается в начало.Это ты сам придумал? Или это где-то написано? Как объяснишь вот это: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2004, 14:45 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
2 stdio а версия thin драйвера у вас какая? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2004, 14:54 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
zalexaka2 stdio а версия thin драйвера у вас какая?9.0.1.5.0 На других версиях, думаю, поведение будет точно таким же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2004, 15:14 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
zalexaka2 stdio а версия thin драйвера у вас какая?а еще у него пентиум один с 32 мб озу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2004, 15:14 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
to stdio Ну, и как это противоречит тому, что я написал ? Когда ты вызвал execute(), выполнился парсинг SQL и было произведено его выполнение. Указатель курсора установлен на начало для выборки. Когда ты вызвал rs.last() все строчки должны быть "профетчены" на клиента, что естественно потребовало массу работы. В чем ошибочность моих слов ? Проблема этого дела в том, что не пройдя весь курсор с фетчем до конца ты не узнаешь, сколько возвращено строк. Это принципиальный вопрос, так как узнать количество строк в Oracle можно только перебрав их все. Вернуться в начало - значит повторно выполнить запрос. Чем тебе не нравиться COUNT(*). Запрос, конечно все равно выполняется, но хоть фетч уменьщается до одной строки. И дело тут не в версии драйвера, а в механизме работы курсора Oracle. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2004, 15:52 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
MBasilto stdio Ну, и как это противоречит тому, что я написал ? Когда ты вызвал execute(), выполнился парсинг SQL и было произведено его выполнение. Указатель курсора установлен на начало для выборки. Когда ты вызвал rs.last() все строчки должны быть "профетчены" на клиента, что естественно потребовало массу работы. В чем ошибочность моих слов ? Проблема этого дела в том, что не пройдя весь курсор с фетчем до конца ты не узнаешь, сколько возвращено строк. Это принципиальный вопрос, так как узнать количество строк в Oracle можно только перебрав их все. Вернуться в начало - значит повторно выполнить запрос. Чем тебе не нравиться COUNT(*). Запрос, конечно все равно выполняется, но хоть фетч уменьщается до одной строки. И дело тут не в версии драйвера, а в механизме работы курсора Oracle.противоречит тем, что ты рассказываешь про то как работает драйвер, как ты думаешь, а не так как Oracle это делает на самом деле . А на деле он просто скачивает всё в память на клиента и там уж создаёт иллюзию обратно крутимого курсора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2004, 16:52 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
Уел ! Ну да, я не обратил внимания на то, что у тебя в примере результирующий набор TYPE_SCROLL_INSENSITIVE. И в этом моя ошибка. Однако при чувствительном к изменениям наборе запрос все-равно будет выполняться повторно. С другой стороны большой, наверное, кайф выбрать тысячи строк на клиента только для того, чтобы выяснить сколько строк на самом деле будет выбрано. Таким образом задача stdio видимо состояла не в том, чтобы ответить на вопрос, как без выполнения операции фетч выяснить - сколько строк вернет запрос, а в том чтобы уличить меня в ошибке. Ты победил ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2004, 17:20 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
MBasilТаким образом задача stdio видимо состояла не в том, чтобы ответить на вопрос, как без выполнения операции фетч выяснить - сколько строк вернет запрос, а в том чтобы уличить меня в ошибке.Нет. Я просто хотел показать, что лучше один раз провести эксперимент, чем строить гипотезы. Даже если будет SENSITIVE, то совсем не очевидно, что будет перезапускаться весь запрос целиком. Не будет вылняться select * from (...) where rowid = ... ? А? А под хранение значений "предыдущих" rowid всё равно память нужна => всегда я найду такую таблицу, на которой оперативной памяти не хватит. _________________ Умерщвление прекрасной гипотезы мерзким фактом являет собой величайшую трагедию науки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2004, 18:25 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
Полагаю, что при перезапросах ROWID использоваться не будет, так он неизвестен для вставленных после первого запроса строк. Поэтому Вашу замечательную сентенцию по поводу красивой гипотезы возвращаю Вам обратно. Извините за назойливость. Маленькое дополнение У меня есть небольшая универсальная программа по выполнению запросов и выводу результатов написанная на Java. В ней запрос (Oracle 10g ) SELECT * FROM dba_objects; возвратил строк : 48259 За время : 12344 м-сек. Запрос SELECT COUNT(*) FROM dba_objects; возвратил строк : 1 За время : 203 м-сек. Правда это с учетом вывода на экран. Однако, согласитесь, разница во времени существенная. Поскольку я принципиально не использую чувствительных к скроллированию курсоров, потребность в памяти при десятках подряд выполняемых запросов составляет 12М и не больше. Что касается скроллируемых наборов, то предпочитаю собственного изготовления RowSet с кэшированием строк в базе, расположенной на сервере приложений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2004, 18:35 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
MBasilПолагаю, что при перезапросах ROWID использоваться не будет, так он неизвестен для вставленных после первого запроса строк. Поэтому Вашу замечательную сентенцию по поводу красивой гипотезы возвращаю Вам обратно."To support updatability and change sensitibility, Oracle JDBC drivers cache the ROWID along with each row". (взято из читаемого курса по "Oracle9i: Access the Database with Java and JDBC"). Проверять - проверял до курса. MBasilИзвините за назойливость. Маленькое дополнение У меня есть небольшая универсальная программа по выполнению запросов и выводу результатов написанная на Java. В ней запрос (Oracle 10g ) SELECT * FROM dba_objects; возвратил строк : 48259 За время : 12344 м-сек. Запрос SELECT COUNT(*) FROM dba_objects; возвратил строк : 1 За время : 203 м-сек. Правда это с учетом вывода на экран. Однако, согласитесь, разница во времени существенная. Поскольку я принципиально не использую чувствительных к скроллированию курсоров, потребность в памяти при десятках подряд выполняемых запросов составляет 12М и не больше. Что касается скроллируемых наборов, то предпочитаю собственного изготовления RowSet с кэшированием строк в базе, расположенной на сервере приложений.Ах, ну всё про баню. Я где-то утверждал, что надо пересчитывать строки на клиенте? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2004, 09:48 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
Господа, обращаю ваше внимание на некоторые дополнительные аспекты. 1. То, что для изменения строки, еще в момент выполнения операции POST и в момент ее блокирования необходимо кэширование ROWID, это несомненно, как несомненно и то, что драйвер обязан это делать. 2. Однако, рассмотрим следующую ситуацию. Пользователь работает с последними строками резервного набора, а в это время администратор удаляет одну из первых строк и вставляет ее вновь. При этом он еще вставляет десяток строк (одна из них может получить то же самое ROWID). Можете ли Вы гарантировать, что по ROWID будет получена та же строка, когда пользователь вернется в начало набора ? Фиксация ROWID ведь гарантирована только при блокировании строки. Представьте себе - пользователь проскроллировал набор в начало увидел на месте старой строки нечто совершенно неожиданное, так как ROWID старой строки получила другая. 3. Ситуация практически та же, но запрос обращается к секционированной таблице, а администратор выполняет операции MERGE PARTITION или SPLIT PARTITION. Можно было бы привести и другие примеры, но думаю и этого достаточно. 4. Откровенно говоря менторский тон stdio мне надоел, и с Вашего разрешения, я в дискуссию по этому топику больше вмешиваться не буду. Пусть последнее слово останется за ним. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2004, 15:01 |
|
||
|
Определение количества строк в ResultSet
|
|||
|---|---|---|---|
|
#18+
MBasilГоспода, обращаю ваше внимание на некоторые дополнительные аспекты.Типа, пусть мировое сообщество нас рассудит? MBasil1. То, что для изменения строки, еще в момент выполнения операции POST и в момент ее блокирования необходимо кэширование ROWID, это несомненно, как несомненно и то, что драйвер обязан это делать.До этого Вы выдвигали совсем другую гипотезу. http://www.sql.ru/forum/actualpost.aspx?bid=38&tid=141321&mid=1149935&p=1&act=quot#1146913 MBasil2. Однако, рассмотрим следующую ситуацию. Пользователь работает с последними строками резервного набора, а в это время администратор удаляет одну из первых строк и вставляет ее вновь. При этом он еще вставляет десяток строк (одна из них может получить то же самое ROWID). Можете ли Вы гарантировать, что по ROWID будет получена та же строка, когда пользователь вернется в начало набора ? Фиксация ROWID ведь гарантирована только при блокировании строки. Представьте себе - пользователь проскроллировал набор в начало увидел на месте старой строки нечто совершенно неожиданное, так как ROWID старой строки получила другая. 3. Ситуация практически та же, но запрос обращается к секционированной таблице, а администратор выполняет операции MERGE PARTITION или SPLIT PARTITION. Можно было бы привести и другие примеры, но думаю и этого достаточно.Выводы где? Смотрим в документацию и видим: http://download-west.oracle.com/docs/cd/B10501_01/java.920/a96654/resltset.htm#1020090 Повторюсь "Умерщвление прекрасной гипотезы мерзким фактом являет собой величайшую трагедию науки" MBasil4. Откровенно говоря менторский тон stdio мне надоел, и с Вашего разрешения, я в дискуссию по этому топику больше вмешиваться не буду. Пусть последнее слово останется за ним.И пусть ему будет стыдно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2004, 15:41 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=32801089&tid=2151257]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
175ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
96ms |
get tp. blocked users: |
1ms |
| others: | 240ms |
| total: | 558ms |

| 0 / 0 |
