2013-04-29 86 views
2

我有以下SQL語句:插入從選擇(Teradata數據)

select cast (count(*) as bigint) from 
(SELECT oldtable.id,oldtable.day,newtable.newid from oldtable 
left outer join newtable on oldtable.day between newtable.FROM_DAY 
and newtable.TO_DAY and oldtable.id = newtable.id) a 

這導致4.5十億

,但是當我這樣說:

INSERT INTO AnotherTable 
(id, day, newid) 
SELECT oldtable.id,oldtable.day,newtable.newid from oldtable 
left outer join newtable on oldtable.day between newtable.FROM_DAY 
and newtable.TO_DAY and oldtable.id = newtable.id 

它只是插入3億條記錄(舊錶包含45億條記錄,新增4.3億條記錄)。

爲什麼?

AnotherTable的definiton:

CREATE MULTISET TABLE AnotherTable ,NO FALLBACK , 
NO BEFORE JOURNAL, 
NO AFTER JOURNAL, 
CHECKSUM = DEFAULT, 
DEFAULT MERGEBLOCKRATIO 
( 
    id INTEGER NOT NULL, 
    day DATE FORMAT 'YYYY-MM-DD', 
    newid INTEGER NOT NULL 
) 
PRIMARY INDEX (id) 
PARTITION BY RANGE_N(day BETWEEN DATE '2000-09-20' AND DATE '2030-02-15' EACH INTERVAL '1' DAY); 

我做了如下檢查:

SELECT oldtable.id,oldtable.day,newtable.newid from oldtable 
left outer join newtable on oldtable.day between newtable.FROM_DAY and newtable.TO_DAY 
and oldtable.id = newtable.id 
where newtable.newid is null 

這導致0的記錄,所以外連接沒有必要的,我只是在這裏使用它來演示該記錄號碼是不同的,但它不應該是

+0

是否有可能對'newid'有非NULL約束?由於「left outer join」,這可能是NULL。 – 2013-04-29 13:01:50

+0

我提出了以下檢查: 'SELECT oldtable.id,oldtable.day,newtable.newid從oldtable 左外連接newtable的上newtable.FROM_DAY 和newtable.TO_DAY和oldtable.id = newtable的之間oldtable.day。id where newtable.newid is null' 它導致了0條記錄,所以根本不需要外部連接,我只是在這裏用它來證明記錄號是不同的,但它不應該是 – 2013-04-29 13:05:55

+0

您是否收到任何來自數據庫服務器的錯誤消息?是否有任何磁盤存儲限制問題?如果它繼續失敗,可能嘗試從SQL select中生成插入語句,然後再運行插入腳本。 – 2013-04-29 13:16:16

回答

2

你從哪裏得到插入的數量?

45億減去3億是約。 42億美元。

當你完全計算缺失的行數是4.294.967.296?

然後它可能是由於「警告:6813內部計數器的數值溢出」。

剪切&從消息手工粘貼:

6813在內部計數器數值溢出。返回的行數是實際返回的行數,模2^32。 說明:當返回的活動計數爲 (即行數)超過當前最大限制(2^32 - 1)時,此警告消息在SUCCESS/OK宗地內發送。 請求成功。 返回給用戶的值是:(實際返回的行數)模2^32。

注意:如果該用戶知道的實際行數返回不能超過2^33時,返回然後實際的行數可以推導如下:行 實際數目返回= 2^32 +的值返回給用戶。

迪特

+0

我不再在公司工作,所以我不能檢查,但這似乎是最好的原因 – 2013-06-28 20:54:38

0

你應該創建一個多集表。它會做的伎倆!

CREATE MUTLISET TABLE(); 
INSERT INTO() 
SELECT() 

上面的語法適合我!