ASTERIAはJOINが苦手
DBから抽出するRDBGetでは, 20万レコードを取り出したとき, 動かなくなくりました.
また, 5万レコードと1万レコードをJOINしたとき,
JOINは出来たのですが, 処理時間が遅すぎて使い物になりませんでした.
結論, ASTERIAはビッグデータの操作が苦手.
対処方法 DBサーバに処理をさせ,ASTERIA側はプロシージャの結果を受け取る
MySQLでは,
viewではユーザ変数が使えないので,
行番号はtemporary tableで作成する.
temporary tableは自己結合が出来ないので,
サブクエリに関してもtemporary tableを作成する.
それをストアプロシージャで一つの処理とする.
実際に作ってみた.
getLastRow()
delimiter //
create procedure getLastRows()
BEGIN
-- メイン句
SET @i=0;
drop table if exists addRowNo;
create temporary table addRowNo
-- インデックスを貼ると高速化
(
`行番号` int(11),
primary key(`行番号`)
)
AS
SELECT
cast(@i:=@i+1 as SIGNED) AS '行番号',
稟議番号,
稟議ステータス,
稟議承認者名
FROM
DUMMY_TABLE
-- SubQuery(Temporary は自己結合できないので)
SET @j=0; -- 変数名を変える
drop table if exists getKeys;
create temporary table getKeys
(
`行番号` int(11),
primary key(`行番号`)
)
AS
SELECT
max(cast(@j:=@j+1 as SIGNED)) AS '行番号',
稟議番号
FROM
DUMMY_TABLE
GROUP BY 稟議番号;
-- 最終行を取得するクエリ
SELECT MAIN.*
FROM addRowNo MAIN
LEFT getKeys SUB
on MAIN.行番号 = SUB.行番号
WHERE SUB.行番号 is not null;
END //
delimiter ;
これを
SQLCall1
call getLastRows()
で呼び出すことが出来る
参照(以前の記事をもとにしています])
ASTERIA WARPでキーごとの最終行(=履歴の最新行)を取得するには