iT邦幫忙

0

資料表在大流量情景下的搜尋問題

  • 分享至 

  • xImage

我在公司中負責的專案有遇到一個問題,情景如下

我有兩張資料表,分別是交易紀錄的買/賣,有時間戳記,兩張表沒有關聯性
我想達成"依照時間最新的搜索找出買/賣紀錄的共N筆資料"並生成報表
在我的想法中,我是先直接抓範圍內所有資料,最後依時間排序後,再決定輸出的page、pagesize。但我的同事說這在大流量下會對程式造成負擔,希望我能想出優化的方法

我自己目前的解決方式是在SQL中LIMIT限定N筆,這樣兩張表共抓出2N筆(因為最新時間有可能都是同一買/賣),並在調出來後在程式裡進行時間排序。

我不覺得我這方法是做到最好了,請問有其他最佳解?
請問在商業環境中,各位前輩有其他做法嗎,可以給我一點方向或舉例嗎?

雷N iT邦研究生 1 級 ‧ 2023-10-05 20:05:49 檢舉
因為是買賣紀錄表, 代表紀錄的都是過去的事實
我不知道儲存量跟併發請求量多高就是了
我也不知道紀錄表的id 是不是遞增的其實XD
brown125 iT邦新手 5 級 ‧ 2023-10-06 09:11:47 檢舉
id是遞增的,儲存量和併發量我這邊不是真正的伺服器後台所以我也不知道XD,只是搜索方式不能像我之前做的那麼粗暴
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
Samuel
iT邦好手 1 級 ‧ 2023-10-06 09:21:46

改寫成SP
縮減HTTP傳輸SQL指令字串的量

表分區Partition Table
https://coolmandiary.blogspot.com/2023/01/sqlpartition-table.html

0
kawa0710
iT邦新手 1 級 ‧ 2023-10-06 09:29:28

建議最優解是寫SP(store procedure, 預儲程序),以下用SQL Server的T-SQL語法實作分頁語法:

CREATE PROCEDURE SearchBills
    @StartDate DATETIME,
    @EndDate DATETIME,
    @SkipRows INT,
    @TakeRows INT
AS
BEGIN
    SET NOCOUNT ON;

    -- 使用 OFFSET FETCH 子句實作分頁
    SELECT *
    FROM Bills
    WHERE TransactionTime >= @StartDate
      AND TransactionTime <= @EndDate
    ORDER BY TransactionTime
    OFFSET @SkipRows ROWS
    FETCH NEXT @TakeRows ROWS ONLY;
END;
brown125 iT邦新手 5 級 ‧ 2023-10-06 09:42:31 檢舉

那請問就程式面或SQL語法搜尋,使用LIMIT已經是最好的嗎,如果不用分表或預儲存的話

我要發表回答

立即登入回答