Страница 1 из 1

Share(File) по ODBC

Добавлено: 11 Январь 2011, 17:18
Geydar
Cla 6 не ABC, Firebird 2.1 через ODBC.

В Firebird 2.1 появились таблички мониторинга базы - коннекты, запросы и пр.
И что я увидел (о, ужас) !!!
Стандартная функция SHARE (File) (или OPEN - все едино) генерирует запрос "SELECT * FROM File WHERE 0 = 1" - а это чтение всей таблицы - я проверял !
Это ж какая нагрузка на базу лишняя.

Кто подскажет, как уйти от этого?

Re: Share(File) по ODBC

Добавлено: 12 Январь 2011, 4:02
StillZero
чтение всей таблицы - я проверял !
как проверял... логи, картинки и иные доказательства?

Re: Share(File) по ODBC

Добавлено: 12 Январь 2011, 4:45
Admin
Geydar писал(а):Cla 6 не ABC, Firebird 2.1 через ODBC.

В Firebird 2.1 появились таблички мониторинга базы - коннекты, запросы и пр.
И что я увидел (о, ужас) !!!
Стандартная функция SHARE (File) (или OPEN - все едино) генерирует запрос "SELECT * FROM File WHERE 0 = 1" - а это чтение всей таблицы - я проверял !
Это ж какая нагрузка на базу лишняя.

Кто подскажет, как уйти от этого?
(0=1) = FALSE
т.е. запрос никогда не выполнится, т.е. всегда вернет 0 записей.

Re: Share(File) по ODBC

Добавлено: 12 Январь 2011, 7:34
Дед Пахом
Admin писал(а): (0=1) = FALSE
т.е. запрос никогда не выполнится, т.е. всегда вернет 0 записей.
Он как раз-таки выполнится, но вернёт 0 записей :D Стандартный способ получить структуру таблицы.

Re: Share(File) по ODBC

Добавлено: 12 Январь 2011, 8:54
Admin
Дед Пахом писал(а):Он как раз-таки выполнится, но вернёт 0 записей :D Стандартный способ получить структуру таблицы.
Я это и имел в виду.
Спасибо.

Re: Share(File) по ODBC

Добавлено: 13 Январь 2011, 11:18
Geydar
Всё вы правильно говорите - записей возвращает 0, но читает всю таблицу - это видно по статистике выполнения запроса в Ibexpert.
Вот это и плохо.

Re: Share(File) по ODBC

Добавлено: 13 Январь 2011, 15:24
StillZero
бл... хотел уже на коньяк спорить, но похоже Geydar прав.
Спросил на форуме firebird, люди говорят:
- в FB 1.5, 2.1 и 2.5 это так, увы
- Тому, кто использует такой запрос для получения всех полей таблицы, надо отрывать руки по самую задницу

я так понял это Legacy, стд клашин доступ... решения соответственно нет, кроме как уходить либо на какой то другой "доступ", либо на другой сервак, в MS SQL такого нет, к примеру. А другой способ доступа... альтернатив MAV нет, а там тоже самое...
в ADO по другому... на поверхности, как реально происходит я хз, не смотрел

а... фишка есть, в MS SQL есть команда SET ROWCOUNT <число>, устанавливает количество читаемых записей для запроса, MAV это использует и перед такого рода запросами выставляет в 1 или 0, не помню точно, т.е. это решает проблему. Посмотри есть ли подобное в firebird, но ... все равно, как встроить в стд клашины вызовы... MAV попробуй, вроде где то была беслатная тестовая сборка...

Re: Share(File) по ODBC

Добавлено: 14 Январь 2011, 11:21
Geydar
В firebird тоже есть ограничение колва читаемых записей, но ваша правда - как встроить...
А вот такая бредовая идея: может, как-то перенаправить файл перед OPENFILES куда-нибудь на пустую таблицу аналогичной структуры, а после вернуть на боевую?

Re: Share(File) по ODBC

Добавлено: 14 Январь 2011, 12:47
StillZero
зацепило меня конечно, что говорить, готов уже ставить FB и мониторить

я согласен с утверждением, что запрос SELECT * FROM File WHERE 0 = 1 читает всю таблицу
но, полагаю, что это не все... я практически уверен, что перед выполнением запроса, а используется ODBC API, устанавливаются параметры курсора
примерно так

Код: Выделить всё

   SELF.RetCode = SQLSetStmtAttr(SELF.hstmt, SQL_ATTR_MAX_ROWS,SELF.MaxRow,SQL_IS_UINTEGER)
где SELF.MaxRow = 1, тем самым решая проблему чтения всей таблицы!

Geydar проверь еще раз, не знаю как там в FB, смотри до выполнения что происходит!

Re: Share(File) по ODBC

Добавлено: 19 Январь 2011, 11:37
Geydar
StillZero, честно говоря не знаю, где это посмотреть. Посмотрел трассировку ODBC - там ничего похожего не обнаружил.