Laboratory of Mobile Agricultural Chemicals Searcher
携帯農薬検索実験室

研究会

  ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索  
49 / 114 ツリー <前へ | 次へ>

〔581〕ACFinder 070318版 kabe (07/03/18 22:36)

〔619〕Re:070323test版 Hidemi Oya (07/03/26 0:51)
〔621〕Re:070323test版 Hidemi Oya (07/03/26 23:16)
〔625〕Re:070323test版 kabe (07/03/27 9:40)
〔627〕Re:070323test版 kabe (07/03/27 21:13)
〔628〕Re:070323test版 kabe (07/03/27 21:15)

〔619〕Re:070323test版
 Hidemi Oya WEB  (07/03/26 0:51)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

> 指定した主作物を対象作物とする農薬の全ての適用をテンポラリテーブルにして、病害虫一覧等を作成する際は毎回作物で検索するようにした方が良いかもしれません。
 クエリ1(テンポラリビューは [#618] の方法で作成済み)で試してみました。が、この方法で病害虫一覧等も作成するとなるとさすがに時間がかかり、大きな速度改善効果は期待できません。
 近接作物を指定したときは多少遅くなりますが、クエリ2の方が良さそうです。なお、この場合絞り込み条件の病害虫一覧等は tSaku から生成します。また、絞り込み条件が指定されている場合は、tTmp を作成する際に WHERE 節を付加します。

クエリ1
CREATE TEMP TABLE tBango AS
SELECT DISTINCT bango FROM m_tekiyo WHERE sakumotsu REGEXP ...;
DROP TABLE IF EXISTS tTbl;
CREATE TEMP TABLE tTbl AS
SELECT * FROM tekiyo WHERE bango in (SELECT bango FROM tBango);
DROP TABLE tBango;
SELECT * FROM tvTsushoTekiyo WHERE sakumotsu REGEXP ...;

クエリ2
DROP TABLE IF EXISTS tSaku;
CREATE TEMP TABLE tSaku AS SELECT * FROM tekiyo WHERE 主作物検索条件;
DROP TABLE IF EXISTS tTbl;
(1) 近接作物が指定されていない場合
CREATE TEMP TABLE tTbl AS SELECT * FROM tSaku;
(2) 近接作物が指定されている場合
CREATE TEMP TABLE tTmp AS SELECT DISTINCT bango FROM tSaku;
CREATE TEMP TABLE tTbl AS SELECT * FROM tekiyo
WHERE bango IN (SELECT bango FROM tTmp)
AND ((主作物検索条件) OR (近接作物検索条件));
DROP TABLE tTmp;
(3) (1), (2) 共通
SELECT * FROM tvTsushoTekiyo;

〔621〕Re:070323test版
 Hidemi Oya WEB  (07/03/26 23:16)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

 [#619] のクエリ2ですが、ACFinder 起動時に次のようなテンポラリテーブルを作成すると、さらに高速化が可能です。作物に「ブロッコリー,あぶらな科野菜,野菜類」を指定した場合、自宅マシンで [#619] のクエリ2が初回 2.3 秒ですが、下記のクエリなら初回 1.8 秒です。
 なお、テンポラリテーブルの作成は自宅マシンで 1.3 秒、パーマネントテーブルとして作成しても同じ時間でした。この程度なら ACFinder 起動時にテンポラリテーブルとして毎回作成しても苦にはならないですが、薬剤タブでも使うなら、データ更新時にパーマネントテーブルとして作成した方が良いかもしれません。

--ACFinder 起動時
CREATE TEMP TABLE tsTekiyo (...);
CREATE TEMP VIEW IF NOT EXISTS tvTekiyo AS
SELECT ... FROM tsTekiyo;
CREATE TEMP VIEW IF NOT EXISTS tvTsushoTekiyo AS
SELECT ... FROM tsTekiyo;
--追加テンポラリテーブル作成
CREATE TEMP TABLE tBangoSaku AS
SELECT DISTINCT bango, sakumotsu FROM tekiyo;

--作物タブ用クエリ
CREATE TEMP TABLE tTmp AS SELECT bango FROM tBangoSaku WHERE 作物検索条件;
DROP TABLE IF EXISTS tSaku;
CREATE TEMP TABLE tSaku AS SELECT * FROM tekiyo
WHERE bango IN tTmp AND 作物検索条件;
DROP TABLE tTmp;
DROP TABLE IF EXISTS tsTekiyo;
--(1) 近接作物指定無し
CREATE TEMP TABLE tsTekiyo AS SELECT * FROM tSaku;
/*
--(2) 近接作物指定有り
CREATE TEMP TABLE tTmp AS SELECT DISTINCT bango FROM tSaku;
CREATE TEMP TABLE tsTekiyo AS SELECT * FROM tekiyo
WHERE (bango IN tTmp) AND ((作物検索条件) OR (近接作物検索条件));
DROP TABLE tTmp;
*/
--(3) 適用表示
SELECT * FROM tvTsushoTekiyo;

〔625〕Re:070323test版
 kabe  (07/03/27 9:40)

引用なし
   >Hidemi Oyaさん

kabe です。

作物名そのものを REGEXP で検索する時間をどれくらい短縮できるかですね。
この考え方をさらに進めると、次の方法が効果的と思われます。

作物名を単一化して作物コードと作物名のみのテーブルを作成する。
m_tekiyo テーブルに作物コードを付加して、作物名テーブルから作物コードを更新する。
作物検索は最初に作物名テーブルで検索して、作物コードを抽出してから適用を検索する。
これだと REGEXP での作物名検索は現状で 1100レコード程度に対して行えば済むのでかなり高速化が期待できそうです。

作物コードをデータ更新時に同時に作成することになるので、データ更新時間がどれくらい増えるかですね。

〔627〕Re:070323test版
 kabe  (07/03/27 21:13)

引用なし
   kabe です。

>作物コードをデータ更新時に同時に作成することになるので、データ更新時間がどれくらい増えるかですね。
実験中です。
m_kihon の9万行のレコードの UPDATE 処理を加えた場合のデータ更新時間は、私の環境で今まで 50秒程度が70秒以上かかります。
UPDATE m_tekiyo SET idsaku = (
SELECT idsaku FROM m_sakumotsu
WHERE m_sakumotsu.sakumotsu m_tekiyo.sakumotsu)
m_sakumotsu の sakumotsu と m_tekiyoのsakumotsu にインデックス設定を行った上です。

〔628〕Re:070323test版
 kabe  (07/03/27 21:15)

引用なし
   kabe です。

>m_kihon の9万行のレコードの
訂正↑m_tekiyo です。

  ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索  
49 / 114 ツリー <前へ | 次へ>
ページ:  ┃  記事番号:   
(SS)C-BOARD vv3.8 is Free.