㈠ 如何將oracle表數據實時同步到sqlsever數據表中
1. SQLSERVER伺服器上面安裝oracle客戶端,配置服務命名(假設為 test)
2. 在SQLSERVER伺服器上面建立鏈接伺服器,腳本如下
SQL code?
SQL code-- Adding linked server:
exec sp_addlinkedserver @server = 'test' ,
@srvproct = 'ORACLE',
@provider = 'MSDAORA',
@datasrc = 'test'
-- Adding linked server login:
exec sp_addlinkedsrvlogin @useself='false ', @rmtsrvname = 'test',
@rmtuser = 'user', --資料庫用戶
@rmtpassword = 'password' --密碼
3. 建立一個作業,通過作業調度存儲過程,存儲過程使用類似的語句將oracle的數據插入到sqlserver表中
SQL code?
insert into sqlserver表 select * from test..oracle表名
4. 如果要球ORACLE數據是實時增加的,並且ORACLE記錄上有遞增的欄位,可以在SQLSERVER上面建立一個表記錄上次插入的id,然後下次可以從上次的ID+1開始繼續插入
SQL code?
insert into sqlserver表 select * from test..oracle表名 where id>@id
5. 防止sqlserver同步的時候oracle仍在不斷的插入,每次要取一個結束ID
SQL code?
select @endid=max(id) from test..oracle表名.
㈡ oracle sql 需要3個表的數據該怎麼連接
select A.*,B.*,C.* ---分別是選擇的部分數據欄位
from A
inner join B on A.jid0 = B.jid0 -----A.jid0和B.jid0是兩個表要連接的欄位,可以在on後面添加連接條件,注意使用括弧,例如on (A.jid0 = B.jid0 and someCondition)
right join C on A.jid1 = C.jid1 -----A.jid1和C.jid1是兩個表要連接的欄位
㈢ sql怎麼連接oracle資料庫
第一步 安裝好oracle客戶端,並配置好TNS信息
先配置好oracle的TNS連接信息。這個跟正常情況使用oracle完全一樣
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 123.456.176.42)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
第二步,配置odbc信息
配置好odbc連接信息,sql server肯定不能直接調用oracle的客戶端去連接的,只能通過odbc的方式間接的去連。
在你平時敲cmd的地方敲入odbc打開下面界面。
你先去driver那地方看下有oracle的driver了不。裝好了oracle的客戶端的話肯定就會有的。
然後選user DSN,點Add ,選擇上一個畫面中看到的oracle driver。
出現這頁面後,在Data Source Name隨便輸入一個名字,這個名字就要後面sql server要用到的。TNS Service Name的下拉列表中就是oracle中配置好的TNS信息,如果你開始沒有配置的話這里就為空的。你選一個TNS名字後,可以點下test connection驗證下看連接上了不。
第三步 在sql server中配置
在前面創建好odbc數據源後就可以在sql server中配置了啊。先打開management studio。在server objects下面有個Linked Servers,選中它並右擊new linked server。打開如下頁面.在linked server中輸入一個名字,隨便取的,在後面執行sql時會用到這名字.provider就選Oracle Provider for OLE DB。proct name就填oracle
Data source就是你開始配置odbc時取的名字。其他地方就不用管了.然後再點下Security會彈出另一個頁面。
在此頁面最下面的地方輸入用戶名和密碼,然後點OK。
接著,你在Linked Servers下面會看到ORA_ARWEN。
注意點:
是在SQL Server伺服器所在地方進行配置。(客戶端不確定)Oracle的server隨便在哪無所謂了,只要你能連接得到就行.然後就是要裝好oracle的客戶端。
㈣ oracle 聯表插入sql
insert into A select name,'1' from B 正解,沒上面那個答案那麼復雜
㈤ 在sqlserver中 與oracle的表連接查詢
在我們使用SQL Server資料庫的過程中,有時需要將SQL Server數據導出,導入到其他的資料庫中,比如導入到Oracle中。
假設要將SQL Server中的Northwind資料庫中的Procts表導出到Oracle的Scott用戶
首先需要有安裝SQL Server企業版
1.打開工具:
開始->程序->
導入和SQL Server數據導出數據
2.下一步,選擇數據源
[數據源]選擇「用於SQL Server的Microsoft OLE DB提供程序」,這應該是預設值。
[伺服器]選擇要導出數據的伺服器,如果是本機,選擇(local)
[資料庫]選擇要導出的數據所在的庫,這里選擇Northwind
3.下一步,選擇目的
[目的]選擇Microsoft ODBC for Oracle
[DSN]選擇用戶/系統DSN一項,然後在下拉列表框中找一個已經連接到了Scott用戶的DSN名稱。
如果下拉列表中沒有,點下拉列表框右側的[新建],出現創建新數據源界面。
接下來選擇系統數據源,下一步,在驅動程序列表中選擇Microsoft ODBC for Oracle
下一步,完成,出現Microsoft ODBC for Oracle安裝界面
[數據源名稱]隨便輸入,比如sss
[說明]可以不填
[用戶名稱]填入要SQL Server數據導出到的Oracle用戶名稱,這里是scott
[伺服器]填入要連接到Oracle伺服器所使用的服務名,比方說使用sqlplus scott/tiger@server1可以連接到資料庫,那麼這里就填入server1。如果本機就是伺服器,使用sqlplus scott/tiger即可連接到資料庫,這里空著不填即可。
這樣就創建好了一個數據源sss,保證下拉列表框中選擇了sss一項。
[用戶名]填入SQL Server數據導出到的Oracle用戶名稱,這里是scott
[密碼]填入SQL Server數據導出到的Oracle用戶使用的密碼,這里是tiger
4.下一步,指定表復制或查詢
如果要導出的內容是整個表,選擇[從源資料庫復製表和視圖]
如果要導出的內容是表的一部分列,行,可以選擇[用一條查詢指定要傳輸的數據],這時需要寫出一個查詢語句
這里選擇第一項[從源資料庫復製表和視圖]
5.下一步,選擇源表和視圖
點中要導出的表Procts一行的復選框,目的、轉換兩欄就會出現內容。
目的可以用來選擇表名。轉換可以用來修改列的數據類型或是整個建表的SQL語句
6.下一步,保存、調度和復制包
選中立即運行
7.下一步,正在完成DTS導入/導出向導
8.完成
提示「成功地將n個表從Microsoft SQLServer復制到了Oracle」
9.完成,關閉導入導出程序
注意:因為oracle的表名都是大寫的,而SQL的表可能是大小混寫的,所以導入後在oracle里查不到該表,比如這個Procts表在oracle里查詢就應該寫成select * from scott."Procts";為了方便查詢可以通過批量修改表名為大寫以便後面導數據的工作。
---導完數據後執行下面語句,生成把表名修改成大寫的操作
select 'ALTER TABLE '||'"'||table_name||'"'||' RENAME TO '|| upper(table_name)||';' from user_tab_comments;
把生成的文件執行即可把此用戶下的所有表名修改成大寫。
㈥ oracle怎麼連接plsql
打開plsql
彈出登錄
點取消
進入未登錄狀態
,
點擊菜單中
工具->首選項->連接
設置oracle主目錄名
oci庫
連接遠程伺服器
首先要配置好netmanager配置服務命名
最後
登陸輸入用戶名
密碼
配置的資料庫名
㈦ oracle表連接千萬級數據SQL優化
要看數據多到何種程度。 比如一個表的筆數只是幾百,如果不需要和其他大表關聯查詢數據,連索引都不用建。 如果是幾十萬級別的表,一般正確建索引就可以。 如果是千萬級別的表,不但要正確建索引,而且要定時手工進行收集統計信息維護
㈧ oracle的執行計劃中表的鏈接方式有幾種分別適用什麼情況
在日常基於資料庫應用的開發過程中,我們經常需要對多個表或者數據源進行關聯查詢而得出我們需要的結果集。那麼Oracle到底存在著哪幾種連接方式?優化器內部又是怎樣處理這些連接的?哪種連接方式又是適合哪種查詢需求的?只有對這些問題有了清晰的理解後,我們才能針對特定的查詢需求選擇合適的連接方式,開發出健壯的資料庫應用程序。選擇合適的表連接方法對SQL語句運行的性能有著至關重要的影響。下面我們就Oracle常用的一些連接方法及適用情景做一個簡單的介紹。
3.1 嵌套循環連接(nested loop)
嵌套循環連接的工作方式是這樣的:
1、 Oracle首先選擇一張表作為連接的驅動表,這張表也稱為外部表(Outer Table)。由驅動表進行驅動連接的表或數據源稱為內部表(Inner Table)。
2、 提取驅動表中符合條件的記錄,與被驅動表的連接列進行關聯查詢符合條件的記錄。在這個過程中,Oracle首先提取驅動表中符合條件的第一條記錄,再與內部表的連接列進行關聯查詢相應的記錄行。在關聯查詢的過程中,Oracle會持續提取驅動表中其他符合條件的記錄與內部表關聯查詢。這兩個過程是並行進行的,因此嵌套循環連接返回前幾條記錄的速度是非常快的。在這里需要說明的是,由於Oracle最小的IO單位為單個數據塊,因此在這個過程中Oracle會首先提取驅動表中符合條件的單個數據塊中的所有行,再與內部表進行關聯連接查詢的,然後提取下一個數據塊中的記錄持續地循環連接下去。當然,如果單行記錄跨越多個數據塊的話,就是一次單條記錄進行關聯查詢的。
3、 嵌套循環連接的過程如下所示:
Nested loop
Outer loop
Inner loop
我們可以看出這裡面存在著兩個循環,一個是外部循環,提取驅動表中符合條件的每條記錄。另外一個是內部循環,根據外循環中提取的每條記錄對內部表進行連接查詢相應的記錄。由於這兩個循環是嵌套進行的,故此種連接方法稱為嵌套循環連接。
嵌套循環連接適用於查詢的選擇性強、約束性高並且僅返回小部分記錄的結果集。通常要求驅動表的記錄(符合條件的記錄,通常通過高效的索引訪問)較少,且被驅動表連接列有唯一索引或者選擇性強的非唯一索引時,嵌套循環連接的效率是比較高的。
嵌套循環連接驅動表的選擇也是連接中需要著重注意的一點,有一個常見的誤區是驅動表要選擇小表,其實這是不對的。假如有兩張表A、B關聯查詢,A表有1000000條記錄,B表有10000條記錄,但是A表過濾出來的記錄只有10條,這時候顯然用A表當做驅動表是比較合適的。因此驅動表是由過濾條件限制返回記錄最少的那張表,而不是根據表的大小來選擇的。
在外連接查詢中,如果走嵌套循環連接的話,那麼驅動表必然是沒有符合條件關聯的那張表,也就是後面不加(+)的那張表。這是由於外連接需要提取可能另一張表沒符合條件的記錄,因此驅動表需要是那張我們要返回所有符合條件記錄的表。比如下面這個查詢,
嵌套循環連接返回前幾行的記錄是非常快的,這是因為使用了嵌套循環後,不需要等到全部循環結束再返回結果集,而是不斷地將查詢出來的結果集返回。在這種情況下,終端用戶將會快速地得到返回的首批記錄,且同時等待Oracle內部處理其他記錄並返回。如果查詢的驅動表的記錄數非常多,或者被驅動表的連接列上無索引或索引不是高度可選的情況,嵌套循環連接的效率是非常低的
-- 刪除原表
drop table t1;
-- 建立測試表
create table t1(
f1 varchar2(10),
f2 varchar2(1000)
)
tablespace CTL
pctfree 98;
-- 填充測試內容
insert into t1(f1,f2)
select rownum, lpad(rownum,700,'0')
from dba_tables a, dba_tab_cols b
where a.owner = b.owner
and rownum < 10000;
commit;
-- 檢查測試內容格式
select sys.dbms_rowid.rowid_block_number(rowid), f1, f2 from t1;
-- 每條記錄都存儲在單獨的數據塊中
select count( distinct sys.dbms_rowid.rowid_block_number(rowid)) from t1;
/*
用同樣的方式建立表t2
*/
-- 刪除原表
drop table t2;
-- 建立測試表
create table t2(
f1 varchar2(10),
f2 varchar2(1000)
)
tablespace CTL
pctfree 98;
-- 填充測試內容
insert into t2(f1,f2)
select rownum * 10, lpad(rownum * 10,700,'0')
from dba_tables a, dba_tab_cols b
where a.owner = b.owner
and rownum < 1000;
commit;
-- 檢查測試內容格式
select sys.dbms_rowid.rowid_block_number(rowid), f1, f2 from t2;
-- 每條記錄都存儲在單獨的數據塊中
select count( distinct sys.dbms_rowid.rowid_block_number(rowid)) from t2;
create index ind_t1_f1 on t1(f1);
create index ind_t2_f1 on t2(f1);
--首先我們來看使用nested loop關聯方式, 不同表作為驅動時的情況.
1, 表t2作為驅動表
select /*+ ordered use_nl(t1 , t2)*/
t1.f1, t2.f1
from ctl.t2 t2,ctl.t1 t1
where t1.f1 = t2.f1
and t1.f1 < 1000;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=84 Card=4 Bytes=56)
1 0 NESTED LOOPS (Cost=84 Card=4 Bytes=56)
2 1 TABLE ACCESS (FULL) OF 'T2' (Cost=2 Card=82 Bytes=574)
3 1 INDEX (RANGE SCAN) OF 'IND_T1_F1' (NON-UNIQUE) (Cost=1 C
ard=1 Bytes=7)
Cost = outer access cost + (inner access cost * outer cardinality)
Cost = 2 + 1 * 82 = 84;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2020 consistent gets
23 physical reads
0 redo size
2650 bytes sent via SQL*Net to client
721 bytes received via SQL*Net from client
8 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
99 rows processed
2, t1作為驅動表
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=4 Bytes=56)
1 0 NESTED LOOPS (Cost=6 Card=4 Bytes=56)
2 1 TABLE ACCESS (FULL) OF 'T1' (Cost=2 Card=4 Bytes=28)
3 1 INDEX (RANGE SCAN) OF 'IND_T2_F1' (NON-UNIQUE) (Cost=1 C
ard=1 Bytes=7)
Cost = outer access cost + (inner access cost * outer cardinality)
Cost = 2 + 1 * 4 = 84;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
11123 consistent gets
3 physical reads
0 redo size
2650 bytes sent via SQL*Net to client
721 bytes received via SQL*Net from client
8 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
99 rows processed
3.2, 哈希連接(hash join)
哈希連接分為兩個階段,如下。
1、 構建階段:優化器首先選擇一張小表做為驅動表,運用哈希函數對連接列進行計算產生一張哈希表。通常這個步驟是在內存(hash_area_size)裡面進行的,因此運算很快。
2、 探測階段:優化器對被驅動表的連接列運用同樣的哈希函數計算得到的結果與前面形成的哈希表進行探測返回符合條件的記錄。這個階段中如果被驅動表的連接列的值沒有與驅動表連接列的值相等的話,那麼這些記錄將會被丟棄而不進行探測
哈希連接比較適用於返回大數據量結果集的連接。
使用哈希連接必須是在CBO模式下,參數hash_join_enabled設置為true,
哈希連接只適用於等值連接。從Oracle9i開始,哈希連接由於其良好的性能漸漸取代了原來的排序合並連接。
SQL> select /*+ ordered use_hash(t1 , t2) */
t1.f1, t2.f1
from ctl.t1 t1,ctl.t2 t2
where t1.f1 = t2.f1 2 3 4 ;
999 rows selected.
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=82 Bytes=1148
)
1 0 HASH JOIN (Cost=5 Card=82 Bytes=1148)
2 1 TABLE ACCESS (FULL) OF 'T1' (Cost=2 Card=82 Bytes=574)
3 1 TABLE ACCESS (FULL) OF 'T2' (Cost=2 Card=82 Bytes=574)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
11113 consistent gets
0 physical reads
0 redo size
23590 bytes sent via SQL*Net to client
1381 bytes received via SQL*Net from client
68 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
999 rows processed
3.3, 排序合並連接(merge join)
排序合並連接的方法非常簡單。在排序合並連接中是沒有驅動表的概念的,兩個互相連接的表按連接列的值先排序,排序完後形成的結果集再互相進行合並連接提取符合條件的記錄。相比嵌套循環連接,排序合並連接比較適用於返回大數據量的結果。
排序合並連接在數據表預先排序好的情況下效率是非常高的,也比較適用於非等值連接的情況,比如>、>=、<=等情況下的連接(哈希連接只適用於等值連接)。由於Oracle中排序操作的開銷是非常消耗資源的,當結果集很大時排序合並連接的性能很差,於是Oracle在7.3之後推出了新的連接方式——哈希連接。
1, rbo模式;
2, 不等於關聯(> < >= <= <>)
3, hash_join_enabled = false;
4, 數據源已排序
㈨ 如何用plsql連接oracle資料庫
【步驟1】按Windows徽標鍵,進入開始界面,找到Net Configuration Assistant,單擊運行