首页 > 解决方案 > 哪个更好:单个查询或首先确定顺序,然后使用 IN 列表选择详细信息?

问题描述

我们有一个 Postgres 数据库,其表如下所示,其中ITEM告诉类型和排序/排名:

ITEM  (id, itemId, type, ranking)

TEXTBOOK (id, title, total_pages)
TEXTBOOK_DATA (id, price, availability, supplier)

MAGAZINE (id, title, edition)
MAGAZINE_DATA (id, price, supplier)

当我们在 UI 上显示时,我们需要显示如下列表:

将有很多记录要过滤,因此我们正在考虑 Option1 是否比 Option2 更好(即更快,计算密集度更低),或者是否有另一个更好的 Option 而无需从根本上更改表。帮助表示赞赏。谢谢。

选项#1:左连接表,然后通过 Where 子句进行过滤

SELECT 
    Item.id, 
    COALESCE(Txtbook.title, Magazine.title) "title",    
    COALESCE(TxtbookData.price, MagazineData.price) "price",
    COALESCE(TxtbookData.supplier, MagazineData.supplier) "supplier", 
    Txtbook.total_pages, Magazine.edition, TxtbookData.availability
FROM 
    ITEM Item
LEFT JOIN 
    TEXTBOOK Txtbook ON Item.id = Txtbook.id -- TextBook
LEFT JOIN 
    TEXTBOOK_DATA TxtbookData ON Item.id = TxtbookData.id
LEFT JOIN 
    MAGAZINE Magazine ON Item.id = Magazine.id -- Magazine
LEFT JOIN 
    MAGAZINE_DATA MagazineData ON Item.id = MagazineData.id
WHERE 
    Item.itemId IN (1, 2, 3, 4)
ORDER BY 
    Item.ranking

选项#2:运行第一个查询以获取类型和排序/排名,然后使用编程语言(Java/Javascript/C#)过滤 Id。然后为每种类型运行单独的查询

SELECT Item.id, Item.type
FROM ITEM Item
WHERE Item.itemId  in (1, 2, 3, 4)
ORDER BY Item.ranking

SELECT Txtbook.id, Txtbook.title, TxtbookData.price, TxtbookData.supplier, Txtbook.total_pages, Magazine.edition, TxtbookData.availability
FROM TEXTBOOK Txtbook
INNER JOIN TEXTBOOK_DATA TxtbookData on Txtbook.id = TxtbookData.id
WHERE Txtbook.id in (%filteredIds%)

SELECT Magazine.id, Magazine.title, MagazineData.price, MagazineData.supplier, Magazine.edition
FROM MAGAZINE Magazine
INNER JOIN MAGAZINE_DATA MagazineData on Magazine.id = MagazineData.id
WHERE Magazine.id in (%filteredIds%)

标签: sqlpostgresqlquery-optimization

解决方案


选项 1 总是更好。您的选项 2 是一个坏习惯:

  • 您必须运行三个 SQL 语句而不是一个

  • 那些长长的IN列表创建和处理起来很麻烦,而且它们会使 SQL 语句变得很长

此外,对第一个查询的结果进行排序没有意义,因为该排序将在其他查询中丢失,这需要另一个ORDER BY. 最后,您必须合并两个有序列表。


推荐阅读