私はデータセット間の結合を含むプロジェクトに取り組んでおり、任意のデータセット間の任意の結合のプレビューを許可する必要があります。これはクレイジーですが、それが楽しい理由です。これは使用面であるため、結合を指定すると、最大10行の結果をすばやく表示したいと思います。
私は、少なくともいくつかの結果行を取得するが、結合が高速でサンプリングに費用がかからないようにサンプルを十分に小さく保つように、さまざまなテーブルをサブサンプリングするさまざまな方法に基づいて実験を行ってきました。
これが私が嗅覚テストに合格した方法です。私はそれらについていくつか知りたいです:
- これらはどのタイプの結合またはデータセットで失敗しますか?
- これらのデータセットをどのように識別できますか?
- これらの両方が同じことで悪い場合、どのようにそれらを改善することができますか?
- ここに入れていない、より良いサンプリングの種類はありますか?
制限付きで副選択します。
1つのデータセットのランダムなサンプルを取得して、全体のサイズを縮小します。
SELECT col1, col2 FROM table1 JOIN
(SELECT col1, col2 FROM table2 LIMIT #) AS sample2
on table1.col1 = sample2.col1
LIMIT 10;
私はこれが好きです。なぜなら、それは簡単で、将来、どのテーブルからサンプルを取得するかについて賢くなる可能性があるからです。table1.col1がsample2.col1と等しくならない部分を選択して、結果が返されないようにすることもできます。
col1の等しい値を見つけて、それらをサンプリングします
より複雑なマルチクエリアプローチ。ここでは、結合する列を個別に選択し、結果を比較して共通の値を見つけてから、結果を共通の値に制限するサブ選択を実行します。
SELECT DISTINCT col1 FROM table1;
SELECT DISTINCT col1 FROM table2;
commonVals = intersection of above results
SELECT col1, col2 FROM table1 JOIN
(SELECT col1, col2 FROM table2 WHERE col1 IN(commonVals) LIMIT #) as sample2
on table1.col1 = sample2.col1
LIMIT 10;
これにより、table2の優れたサンプルが得られますが、selectdistinctクエリは結合よりもコストがかかる可能性があります。個別の計算にかかる時間について何か知っていれば、この方法の方が速いかどうかを判断する方法があると思いますが、現時点では、データセットに関する知識はそれほど多くありません。
参加時に制限を叩く
これは最も簡単で、私が傾いているものです。
SELECT col1, col1 FROM table1 join table2 on table1.col1 = table2.col1 LIMIT #
結合が適切であると仮定すると、これは常にデータを返し、少なくとも大規模なケースでは高速に実行されます。