database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 2132 게시물 읽기
No. 2132
부탁드립니다. 수고하세요..
작성자
row
작성일
2005-07-20 14:46ⓒ
2005-07-20 15:35ⓜ
조회수
7,921

select * from
openquery (test,
'select * from test_table
where cust_code = "000a"')


이렇게 수행했는데... 아래 같이..

서버: 메시지 207, 수준 16, 상태 3, 줄 1
열 이름 '000a'이(가) 잘못되었습니다.
서버: 메시지 8180, 수준 16, 상태 1, 줄 1
문을 준비할 수 없습니다.
[OLE/DB provider returned message: 지연된 준비를 완료할 수 없습니다.]

cust_code 는 char type 입니다.

도움 부탁드립니다. 수고하세요

이 글에 대한 댓글이 총 7건 있습니다.

select * from openquery (billink, 'select top 10 * from wowbill.dbo.tbluser where userid =''minsouk''')

 

여기 더블 쿼터는 없습니다. 모두 싱글쿼터 입니다.

 

석이님이 2005-07-20 15:46에 작성한 댓글입니다. Edit

석이님 답글 감사드립니다. 건승 하세요..

row님이 2005-07-20 15:52에 작성한 댓글입니다. Edit

참고로 분산 쿼리를 수행시 실행 계획을 분석해 보시면 알겠지만...

linked server 로 구성된 경우 바로 서버에 쿼리를 실행하는 것을 삼가 하시는 것이 좋습니다.

linked server 구성된 서버가 존재 하는 경우

 

select * from testserver.testdb.dbo.tablename

로 막바로 lilnked server 를 통해서 질의 하시면 실행계획이

원격서버가 아닌 로컬 서버에서 수행됩니다. 즉 올바른 정보를

가지고 access path 및 쿼리를 최적화 하는 것이 어렵습니다.

 

 하지만 openquery 나 기타 openrowset 을 통해서 분산 쿼리를

질의하면 원격서버에서 실행계획을 세우기 때문에 로컬서버에서

만들어진 실행계획 보다 더 최적화된 access path 를 만들어 내는

 것이 가능해 집니다.

 

또한 openquery 를 수행하면서 where 조건을 바깥으로 빼는 경우

select * from (server,

  'select * from server.dbname.dbo.table')

    where name ='a'

 

 하면 filtering 과정을 한번 거쳐서 실행되기 때문에...

낭비가 됩니다.

따라서 원격데이터 추출시 모든 조건을 다 openquery 에 넣어서

추출하면 filtering 과정없이 데이터를 추출하는 것이 가능해 지며

데이터 추출시 집합 결과를 줄일수 있습니다.

 

좀 어려운 것은 openquery 수행시 로컬 테이블과 join 입니다.

좀처럼 실행계획이 좋지 않은 경우 조인 힌트를 통해서 제어가

가능합니다.

 

 수고하세요...

sqler님이 2005-07-20 16:13에 작성한 댓글입니다. Edit

sqler님이 말씀하신 것에 덧붙여서 만약 조인을 해야할 원격 테이블의 대상이 작거나,
전체 테이블의 작은 일부분이라면  임시 테이블에 저장후에 로컬에서 join을 하는 것도
하나의 방법입니다.

DECLARE @QUERY NVARCHAR(1024)
        ,@CustomerID   CHAR(10)


SET @QUERY =N' INSERT INTO #RESULT
                 SELECT *
                        FROM  OPENQUERY(RemoteServer ,''select OrderID, EmployeeID from northwind.dbo.orders where CustomerID =  ''''' + @CustomerID  +''''''')';
EXEC SP_EXECUTESQL @QUERY;


SELECT *
   FROM localTable A INNER JOIN #RESULT B
            ON(A.OrderID = B.OrderID)


 

 

가을남자님이 2005-07-20 16:56에 작성한 댓글입니다. Edit

이런걸 하실때 저라면 이렇게 하겠습니다. ^^ 사견

복제를 일단 합니다.

3가지 방법중 특성에 따라 복제를 합니다.

-_- 뭐 알아서 잘 ~

그런다음 한쪽 서버에서 조인을 하시는 겁니다. ^^;

그게 힘들다면,

 

일단 필요한 최소데이터를 가져오신후

전역 임시테이블을 만듭니다.

 

이걸 스케쥴러로 필요한 시간간격으로 업데이트를 합니다.

그런다음 그 테이블과 조인을 겁니다.

 

이게 젤 빠를꺼 같습니다. ^^;

빨리 나오게 할때 제가 쓰는 방법입니다. ^^ 더 좋은거 있음 알려주시길 바랍니다.

 

 

 

석이님이 2005-07-20 17:13에 작성한 댓글입니다. Edit

오라클의 snapshot(materialized view)이라는 기능이 있습니다. 즉  refresh mode 에 따라 mssql 의 복제중 트랜잭션 복제와 snapshot 복제와 같은 기능을 동시에 지원합니다.

 

이 기능은 mssql 에서도 마찬가지지만 복제를 수행하는 방법에 따라서 복제 수행 object 가 많아 지면 수반되는 network traffic 이나 서버에 주는 부담은 커 질수 밖에 없습니다.

 

 더군다나 오라클에서는 시노임(동의어)라는 기능을 제공함에 따라서 뷰가 아닌 원격 테이블의 데이터를 db link 를 통해서 동일한 테이블로 구성하는 것이 가능합니다.

 

 만약 업무 프로세스가 원격에 있는 테이블을 많이 이용해야 한다면... 이 모든 테이블을 모두 로컬 서버로 가져와서 조인하는 방법은 어려울 환경에 처하는 경우도 발생합니다.

 

 결국은 원격 테이블과 조인이 불가피한 상황이 발생할수도 있습니다.

 이 부분을 저 같은경우 join 힌트를 통해서 튜닝을 하고 있습니다.

즉 hash join으로 풀어 내는 경우가 많습니다.

뷰나 기타 openquery 에 의한 조인 등을 로컬에서 실행 할때...

힌트나 드라이빙 테이블의 제어를 통해서 튜닝이 가능했습니다. 제 테스트 해 본 결과... ^^;; 이런 부분을 말씀드리고 싶었으며...

 

덧붙여 주신 말씀 모두 맞습니다. 오라클에서도 마찬가지로 가능한한 원격 서버의 object 에 대한 조인은 지양합니다. 당연하겠죠...따라서 오라클에서도 말씀드린 snapshot(materialized view) 를 이용한 복제를 통해 원격에서 실제 데이터를 가지고 조인 하는 방법을 취합니다.

하지만 데이터가 정말 많은 상황인데다가 트랜잭션 빈도가 많다면.. 이런 복제도 대안은 되지 않을 듯 싶네요...

비지니스 로직을 정확히 설계하여 데이터 베이스를 설계하는 것이 젤 좋겠다는 생각입니다.

 

 수고하세요..

sqler님이 2005-07-21 09:58에 작성한 댓글입니다. Edit

^^ 맞아요 이런데다 스넵샷 복제 해버림 죽음입니다.

 

석이님이 2005-07-21 10:11에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
2137서버 백업에 관해서... [1]
남용욱
2005-07-21
3563
2135회원이름 하고 점수가 있는 테이블에서 정렬하기... [7]
최중권
2005-07-20
4029
2134remote에 있는 데이타를 가져올때의 속도문제 [1]
pray4peace
2005-07-20
2423
2132부탁드립니다. 수고하세요.. [7]
row
2005-07-20
7921
2131DB를 실시간 백업받고자 합니다. [3]
궁금이
2005-07-20
3531
2130select 해서 CSV로 추출하기... 아래 질문 자문 자답입니다. [1]
커너
2005-07-20
2365
2129그런데 프로지저를 어케 실행시키믄되염? [1]
임민영
2005-07-19
2131
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다