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 億 3000 万レコードが含まれます)。

なんで?

AnotherTable の定義:

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 内部カウンターの数値オーバーフロー」が原因である可能性があります。

Messages マニュアルからの切り取りと貼り付け:

6813 内部カウンターの数値オーバーフロー。返される行数は、実際に返される行数で、モジュロ 2^32 です。説明: この警告メッセージは、返された activitycount (つまり、行数) が (2^32 - 1) の現在の最大制限をオーバーフローしたときに、SUCCESS/OK パーセル内で送信されます。リクエストは成功です。ユーザーに返される値は、(返される実際の行数) modulo 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 に答える