powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Тормоза openquery
39 сообщений из 39, показаны все 2 страниц
Тормоза openquery
    #40030107
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Общая задача: обращение к таблицам (основное: выборка по запросу. второстепенное: обновление, вставка) БД FireBird 2.5 из БД SQL Server 2008.

Для этого сейчас доступ организован через прилинкованный сервер FireBird через драйвер ODBC. Используется механизм OPENQUERY.

Проблема в жутких тормозах данного механизма. Запрос который FireBird отрабатывает моментально, через OPENQUERY тормозит неприемлемо долго.

Как ускорить процесс? Чем можно заменить OPENQUERY, может быть?
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030119
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр,

сначала определите, где тормоза, у FireBird же есть средство диагностики поступающих запросов?
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030125
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Критик
Петр,

сначала определите, где тормоза, у FireBird же есть средство диагностики поступающих запросов?


я же написал тормоза на стороне sql server
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030132
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр
Критик
Петр,

сначала определите, где тормоза, у FireBird же есть средство диагностики поступающих запросов?


я же написал тормоза на стороне sql server
То есть при вызове со стороны sql server запрос выполняется быстро, но в sql server потом (или до) где то тормозит?
Сразу из исходного поста это было неочевидно.

А когда тормозит, до или после?
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030135
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр,

Из того, что вы написали, такой вывод сделать нельзя.
Сначала нужно посмотреть, что реально приходит на сторону FireBird через средство его мониторинга.
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030136
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запрос выполняется медленно на sql server. Т.е. даже не использую клиентское приложение, а просто из SMS запрос тормозит
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030140
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр,

Ну запустите вы профайлер и его аналог в FireBird, так найдете, на какой конкретно стадии происходит задержка.

В реальности там может быть всё что угодно, например, какая-нибудь безопасность на уровне строк, которая срабатывает под одним логином через связанный сервер и под другим при прямом запуске. Или аналог SET`ов сиквела.
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030196
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр
Запрос выполняется медленно на sql server.
Да, вы уже писали.
Я спросил, до или после тормозит в sql server?
Это же важно, для понимания проблемы.
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030214
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр
Запрос который FireBird отрабатывает моментально, через OPENQUERY тормозит неприемлемо долго.

А есть 100%-я уверенность, что для Firebird это тот же запрос?

На личном опыте неоднократно наблюдал как тормозят "те же самые" запросы в аналогичной связке через openquery c Oracle. Правда, потом оказывалось, что автор запроса наплевал на неявные преобразования строк в даты или числа, приклеивая литералы в openquery. И запрос для источника оказывался совсем другим.
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030219
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Петр
Запрос выполняется медленно на sql server. Т.е. даже не использую клиентское приложение, а просто из SMS запрос тормозит

Не рассматривались варианты, что "неприемлемо" тормозит odbc-драйвер, что "неприемлемо" тормозит сеть, что клиентское приложение firebird после запроса достает только первые 10-20 строк результирующего набора данных (остальные - по кликам в клиенте), а SQL Server "неприемлемо" тащит все 100500 млн строк (возможно даже, что через первые две неприемлемости)?
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030259
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что выявлено:

для работы с набором данных содана вьюшка формата:
Код: sql
1.
2.
3.
4.
5.
6.
CREATE VIEW vTable as
select * from openquery(ALIAS,'
SELECT 
 ID
,Name
FROM Table')



если выполнить запрос:
Код: sql
1.
select * from vTable  where ID = 160285601


запрос выполняется 5 секунд

если выполнить напрямую выборку используя первичный ключ
Код: sql
1.
2.
3.
4.
5.
6.
select * from openquery(ALIAS,'
SELECT 
 ID
,Name
FROM Table
where ID = 160285601')


то запрос выполняется 80 млсек.

профайлер ничего интересного не показывает - что отправляется то и выполняется
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030260
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр
если выполнить запрос:
Код: sql
1.
select * from vTable  where ID = 160285601

Объясняю - это означает считать ВСЮ таблицу с линкеда и только потом наложить фильтр.
Если совсем точно, то фильтр накладывается в процессе чтения, но читается и гоняется по сети все равно весь объем данных таблицы.
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030262
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр,

А откуда такая уверенность, что предикат будет проброшен на сторону firebird в первом случае? Неоднократно натыкались на то, что при такой реализации куда чаще идёт полное выполнение запроса на источнике и фильтр уже поверх результата.
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030264
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

В каких-то отдельных редких случаях - предикат таки пробрасывается.
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030267
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр,

попробуйте использовать linked server и выставить ему опцию "collation compatible".
Будет ли быстрее?
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030270
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
В каких-то отдельных редких случаях - предикат таки пробрасывается.
В случае openquery предикат не пробрасывается.
Предикат может пробрасываться для
Код: sql
1.
select ... from LinkedServer.Database.Owner.Table where ...
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030273
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Но тоже далеко не всегда
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030276
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр,

Фактически вы сравниваете выполнение разных запросов. Если запросы к простым таблицам с заведомо совместимыми типами данных, то можно использовать вариант invm 22252392 , если нет, то придётся явно прибивать предикаты в openquery.
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030284
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
Но тоже далеко не всегда
Ну так я и не писал "всегда".
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030317
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Петр
если выполнить запрос:
Код: sql
1.
select * from vTable  where ID = 160285601


Объясняю - это означает считать ВСЮ таблицу с линкеда и только потом наложить фильтр.
Если совсем точно, то фильтр накладывается в процессе чтения, но читается и гоняется по сети все равно весь объем данных таблицы.
очень похоже на несовпадение типов данных
потому и засасывает всю таблицу с последующей фильтрацией
160285601 то ли не инт, то ли не бигинт, то ли не numeric (10,0), то ли не варчар

не раз с таким сталкивался в связке оракл-мскл
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030322
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
манипуляции с сортировкой не помогли.

придется делать динамический запрос
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030333
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
env
В каких-то отдельных редких случаях - предикат таки пробрасывается.
В случае openquery предикат не пробрасывается.
Предикат может пробрасываться для
Код: sql
1.
select ... from LinkedServer.Database.Owner.Table where ...




всё так и есть
Код: sql
1.
2.
3.
4.
5.
6.
select *
  from openquery(ORA,
  'select id_doc, regn_doc, okpo, ddoc, user_id
  from DOC.DOCR
  ')
  where id_doc = 2200016

на Оракловом сервере выполняется запрос select id_doc, regn_doc, okpo, ddoc, user_id from DOC.DOCR
потом результат запроса засасывается на мсскл и там фильтруется



этот работает по индексу и моментально
Код: sql
1.
2.
3.
select id_doc, regn_doc, okpo, ddoc, user_id
  from ORA..DOC.DOCR
  where id_doc = 2200016;
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030394
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему-то не получается использовать схему доступа [линк сервер].[каталог]..[таблица] для ODBC драйвера на FireBird
Код: sql
1.
2.
3.
4.
Поставщик OLE DB "MSDASQL" для связанного сервера "LNKSRV" вернул сообщение "[ODBC Firebird Driver][Firebird]Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 23
.".



Кто-то пробовал для FireBird ?
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030402
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр,

Поиск по форуму показывает, что аналогичная проблема была для Firebird 2.0, точнее для его odbc драйвера.

Возможно, между каталогом и таблицей должна быть ещё и схема?
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030404
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр
Почему-то не получается использовать схему доступа [линк сервер].[каталог]..[таблица] для ODBC драйвера на FireBird
Нужно угадать что написано в запросе?
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030409
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
запрос:
Код: sql
1.
SELECT ID FROM SGMRGD.SGMRGD..TEST



ошибка
Код: sql
1.
2.
3.
4.
5.
6.
Поставщик OLE DB "MSDASQL" для связанного сервера "SGMRGD" вернул сообщение "[ODBC Firebird Driver][Firebird]Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 23
.".
Сообщение 7306, уровень 16, состояние 2, строка 2
Не удалось открыть таблицу ""SGMRGD"."TEST"" через поставщик OLE DB "MSDASQL" для связанного сервера "SGMRGD". 



вариант с OPENQUERY работает
Код: sql
1.
select * from openquery(SGMRGD,'SELECT ID FROM TEST')
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030411
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр,

А
Код: sql
1.
openquery(SGMRGD,'SELECT ID FROM "SGMRGD"."TEST"')

тоже работает?
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030413
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
Петр,

А
Код: sql
1.
openquery(SGMRGD,'SELECT ID FROM "SGMRGD"."TEST"')

тоже работает?


Нет. А почему должно работать? Сервер FireBird ничего не знает про SGMRGD.
SGMRGD - это же линк сервер и алиас ODBC драйвера
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030417
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр,

Тогда зачем вы заставляете драйвер читать из несуществующей таблицы?
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030418
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр
Код: sql
1.
SELECT ID FROM SGMRGD.SGMRGD..TEST

Второй SGMRGD зачем? На всякий случай?

Так попробуйте
Код: sql
1.
SELECT ID FROM SGMRGD...TEST
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030420
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Петр
Код: sql
1.
SELECT ID FROM SGMRGD.SGMRGD..TEST

Второй SGMRGD зачем? На всякий случай?

Так попробуйте
Код: sql
1.
SELECT ID FROM SGMRGD...TEST


вот почему второй - картинка

Код: sql
1.
2.
3.
4.
SELECT ID FROM SGMRGD...TABLE

Сообщение 7313, уровень 16, состояние 1, строка 1
Указан недопустимый каталог или схема для поставщика "MSDASQL" для связанного сервера "SGMRGD".
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030426
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр,

Тогда так, в соответствии с принципом "нормальные герои всегда идут в обход" (с)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
if object_id('tempdb..#t', 'U') is not null
 drop table #t;

select * into #t from openquery(SGMRGD, 'SELECT * FROM TEST where 1 = 0');

insert into #t
 exec('SELECT * FROM TEST where ID = ?', 160285601) at SGMRGD;

select * from #t;
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030437
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да временная таблица особо не нужна если выборка только по таблице линксервера

достаточно
Код: sql
1.
2.
3.
create procedure usp_DataSet @ID int 
as
exec('SELECT * FROM TEST where ID = ?', @ID) at SGMRGD



но вот если этот датасет из процедуры надо связать с таблицей из БД SQL сервера как быть. Только через временную таблицу
или можно еще както?
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030453
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
openquery можно использовать при связке типа
Код: sql
1.
2.
3.
select * 
from	openquery(SGMRGD,'SELECT ID, NAME FROM TEST WHERE ID = 12345678') m
		left outer join TEST2 p on p.kid = m.id



т.е. придется вьюшки заменить на хранимые процедуры.

если кто-то предложит правильную конструкцию обращения к firebird напрямую к таблице типа (SELECT ID FROM SGMRGD.SGMRGD..TEST), буду признателен.
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030466
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр
или можно еще както?
CLR-функция
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030492
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр
если кто-то предложит правильную конструкцию обращения к firebird напрямую к таблице типа (SELECT ID FROM SGMRGD.SGMRGD..TEST), буду признателен.

Для начала следует попробовать в настройках драйвера отбить всю "поддержку" схем, чтобы он честно отвечал "схемы не поддерживаются". Или можно использовать драйвер с https://github.com/aafemt/firebird-odbc-driver где эта поддержка отбита принудительно.

Потом включается трассировка ODBC и смотрится как именно SQL Server с ним работает.
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030509
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала следует попробовать в настройках драйвера отбить всю "поддержку" схем, чтобы он честно отвечал "схемы не поддерживаются". Или можно использовать драйвер с https://github.com/aafemt/firebird-odbc-driver где эта поддержка отбита принудительно.

Потом включается трассировка ODBC и смотрится как именно SQL Server с ним работает.

в настройка ODBC пробовал ничего не меняется. Схема отключена

по поводу альтернативного драйвера ODBC - вы пользовались им?
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030826
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, это не "альтернативный драйвер", а немного поправленный форк официального. Во-вторых, я его сделал.
...
Рейтинг: 0 / 0
Тормоза openquery
    #40030828
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Во-вторых, я его сделал.
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Тормоза openquery
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]