2

我有以下 SQL 语句:

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

结果 45 亿

但是当我这样说时:

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 亿条记录(oldtable 包含 45 亿条记录,newtable 包含 4.3 亿条记录)。

为什么?

另一个表的定义:

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条记录,所以根本不需要外连接,我这里只是用来说明记录号不一样,但不应该

4

2 回答 2

2

你从哪里得到插入的数量?

45 亿减去 3 亿约为。42亿。

当你准确计算缺失行数时结果是4.294.967.296?

那么它可能是由于“警告:6813 内部计数器中的数字溢出”。

消息手册中的剪切和粘贴:

6813 内部计数器数值溢出。返回的行数是实际返回的行数,取模 2^32。说明:当返回的活动计数(即行数)超出当前最大限制 (2^32 - 1) 时,在 SUCCESS/OK 包裹内发送此警告消息。请求成功。返回给用户的值为:(返回的实际行数)模 2^32。

注意:如果用户知道实际返回的行数不能超过2^33,那么实际返回的行数可以推导如下:实际返回的行数=2^32+返回给用户的值。

迪特

于 2013-06-27T20:42:09.120 回答
0

您应该创建一个多集表。它会成功的!

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

上面的语法对我有用!

于 2015-05-12T22:32:23.707 回答