查询在简单选择上花费的时间太长

Posted

技术标签:

【中文标题】查询在简单选择上花费的时间太长【英文标题】:Query taking too long on a simple select 【发布时间】:2020-11-06 16:50:19 【问题描述】:

我有一个 Laravel 后端应用程序,它使用使用 Postgres 的多租户数据库,其中每个租户都有一个 SCHEMA。所以我有 2 个表,分别是 bra_product 和 bra_file,它们都有一个来自特定架构的 JOIN,我们称之为“tenant10”。

我有 2500 个模式,每个模式都有两列,我创建了一个名为 MASTER 的模式,其中所有来自模式的表都从那里继承。

所以 ma​​ster.bra_product 拥有来自所有模式的所有产品的所有数据,所以这个简单的查询:

$size = count($productList);
$counter = 0;
for ($i = 0; $i < $size; $i++) 
    $counter++;
    $productList[$i]->srcimglist = $this->mdFile->getMasterImageByProduct($productList[$i]);

dd($productList);
return $productList; 

我在这里列出了 20 个产品的列表,我创建了一个循环来获取每个产品的图像列表,这将执行以下操作:

public function getMasterImageByProduct($product) 
    return DB::select("SELECT bra_f.*
                          FROM master.bra_file bra_f
                          WHERE bra_f.product_id = :productId
                          AND bra_f.active = true
                          ORDER BY bra_f.order", ['productId' => $product->product_id]);


我的 master.bra_file 有 12.500 行,我的查询需要 40 秒,这是不正常的,我不知道为什么。

【问题讨论】:

我看不出这 2500 个模式在这里有什么相关性。这只是一个表master.bra_file,其中包含 12500 行,查询时间过长。就这样。正确的?还是 master.bra_file 是一个 view 访问那些其他模式中的表? master.bra_file 是一个父表,它有 2500 个子模式,其中有一个名为 bra_file 的表,该表从 master.bra_file 继承 master.bra_file 是一个有 12,058 的表是正确的,这个表有这个数字是因为他是你理解的所有模式的所有 bra_file 表的父表? 现在我在删除 ORDER BY bra_f.order 时发现了一些奇怪的东西,我的查询现在需要 5 秒。 【参考方案1】:

您可以尝试创建另一个表来保存所有子数据并避免继承。

将 bra_file 的结构镜像到另一个“缓存”表中,并使用 INSERT、UPDATE 和 DELETE 触发器自动更新它。

【讨论】:

以上是关于查询在简单选择上花费的时间太长的主要内容,如果未能解决你的问题,请参考以下文章

从 plsql 块执行查询花费的时间太长

COUNT(id) 查询花费的时间太长,哪些性能增强可能会有所帮助?

从 tbl_5billion_rows 中选择 max(sort_key) 耗时太长

SparkSession 在本地独立集群上花费的时间太长

HIVE 加入时间太长,但在 Impala 上速度很快

PBKDF2WithHmacSHA1 密钥生成在 Android 上花费的时间太长