Następująca kwerenda działa efektywnie, gdy uruchamiane bezpośrednio przeciwko Oracle 11 stosując Ropucha (z natywnych sterowników Oracle)SQL Server OPENQUERY() zachowuje się inaczej wtedy bezpośredni zapytanie z TOAD
select ... from ... where ...
and srvg_ocd in (
select ocd
from rptofc
where eff_endt = to_date('12/31/9999','mm/dd/yyyy')
and rgn_nm = 'Boston'
) ...
;
dokładnie w tym samym zapytaniu „nigdy” powraca jeśli przeszedł z SQL Server 2008 do tej samej bazy danych Oracle przez openquery()
. SQL Server ma łącze do bazy danych Oracle przy użyciu sterownika OLE DB dostawcy Oracle.
select * from openquery(servername, '
select ... from ... where ...
and srvg_ocd in (
select ocd
from rptofc
where eff_endt = to_date(''12/31/9999'',''mm/dd/yyyy'')
and rgn_nm = ''Boston''
) ...
');
Zapytanie nie powraca w rozsądnym czasie, a użytkownik zabija zapytanie. Nie wiem, czy w końcu wróci z poprawnym wynikiem.
Ten wynik, w którym zapytanie bezpośrednie TOAD działa sprawnie, a wersja openquery()
"nigdy" nie jest zwracana, jest powtarzalna.
Mała modyfikacja openquery()
daje prawidłowy efektywny wynik: Zmień eff_endt
na trunc(eff_endt)
.
To dobrze i dobrze, ale nie wydaje się, żeby zmiana była konieczna.
openquery()
ma zostać przekazany, więc jak może istnieć różnica między zachowaniem TOAD i openquery()
?
Dbamy o to, ponieważ często opracowujemy złożone zapytania za pomocą TOAD bezpośrednio uzyskującego dostęp do Oracle. Po uzyskaniu funkcjonalności i optymalizacji zapytania, konwertujemy ją na ciąg znaków openquery()
do użycia w aplikacji serwera SQL. Niezwykle obciążające jest to, że zapytanie nagle kończy się niepowodzeniem z openquery()
, gdy wiemy, że działało jako bezpośrednie zapytanie. Następnie musimy szukać obejścia przez próbę i błąd.
Chciałbym zobaczyć pliki śledzenia Oracle dla dwóch scenariuszy, ale serwer Oracle znajduje się w innej organizacji, a my nie otrzymujemy współpracy z Oracle DBA.
Czy ktoś wie o jakimkolwiek kierowcy, TOAD, czy ??? problemy, które mogłyby wyjaśnić rozbieżności? Czy istnieje sposób, aby wyeliminować problem tak, że obie metody zawsze dają taki sam wynik?
Dokonaliśmy śladu po stronie SS - prawidłowe zapytanie jest wysyłane, a nic nigdy nie wraca z Oracle. Różne konta Oracle, ale nie widzę, w jaki sposób może to wyjaśnić różnicę w przypadku dodania problemu "naprawiania" skracania. Zestaw wyników jest bardzo mały, bez dat ani znaczników czasowych. OpenQuery nie kończy się na czas - użytkownik zmęczy się czekaniem i przerwie. TOAD i SS są na różnych maszynach, z różnymi sterownikami. Podejrzewamy sterowniki, ale szukam konkretnych informacji o znanych problemach. Zobaczę, czy mamy dostęp do czegoś takiego jak wireshark. – dbenham
Właśnie dowiedziałem się, że sniffery ruchu sieciowego są zabronione w naszym miejscu pracy, więc nie ma dla nas żadnego wireshark. Przesyłamy za dużo danych wrażliwych. – dbenham
Wygląda na to, że nie szyfrują swoich poufnych danych. Cóż, to jest temat na inną dyskusję. Zobaczę, czy mogę odtworzyć twój problem tutaj na mojej stronie. – SQLburn