我正在从事一个涉及数据集之间连接的项目,我们需要允许预览任意数据集之间的任意连接。这很疯狂,但这就是为什么它很有趣。这是使用面,所以给定一个连接,我想快速显示约 10 行结果。
我一直在围绕不同的方法对不同的表进行子采样,以这样一种方式进行实验,即我至少可以获得一些结果行,但保持样本足够小,以便连接速度快,并且不会导致采样成本高昂。
以下是我发现通过气味测试的方法。我想知道一些关于他们的事情:
- 这些会在哪些类型的连接或数据集上失败?
- 我如何识别这些数据集?
- 如果这两者在同一件事上都不好,那么它们如何改进?
- 有没有我没有放在这里的更好的采样类型?
有限制的子选择。
对一个数据集进行随机抽样以减小整体大小。
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 样本,但 select distinct 查询可能比连接更昂贵。如果您知道不同的 cal 需要多长时间,我相信可能有一种方法可以确定这种方法是否更快,但目前我们对数据集的了解不多。
在连接上打一个 LIMIT
这是最简单的,也是我倾向于的。
SELECT col1, col1 FROM table1 join table2 on table1.col1 = table2.col1 LIMIT #
假设连接很好,这将始终返回数据,并且至少在大量情况下它会很快完成。