簡體   English   中英

哪個更好:單個查詢還是先確定訂單,然后使用 IN 列表選擇詳細信息?

[英]Which is better: a single query or first determine the order, then select details with an IN list?

我們有一個帶有表的 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 上顯示時,我們需要顯示如下列表:

  • TxtbookTitle1,total_pages,價格,可用性,供應商
  • MagazineTitle1、版本、價格、供應商
  • TxtbookTitle2,total_pages,價格,可用性,供應商
  • MagazineTitle2、版本、價格、供應商

將有很多記錄要過濾,因此我們正在考慮 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%)

選項 1 總是更好。 您的選項 2 是一個壞習慣:

  • 您必須運行三個 SQL 語句而不是一個

  • 那些長的IN列表創建和處理起來很麻煩,而且它們會使 SQL 語句變得很長

此外,對第一個查詢的結果進行排序沒有意義,因為該排序將在其他查詢中丟失,這需要另一個ORDER BY 最后,您必須合並兩個有序列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM