Db2

選擇每週的日誌記錄的select語句

  • November 12, 2014

以下是相關表格的簡化版本:

+------------------------------------------------------+
| DatabaseName | LogRecordNumber | LogTimestamp        |
+------------------------------------------------------+
|DB1           | 47378910        | 2014-11-12 10:40:00 |
|DB1           | 48268418        | 2014-11-12 10:41:00 |
|DB2           | 223781480       | 2014-11-12 10:40:00 |
|DB2           | 228976522       | 2014-11-12 10:41:00 |
+------------------------------------------------------+

我們有一個表,其中包含每分鐘擷取的每個數據庫的日誌記錄號。這些數據可以追溯到一整年,如果數據庫比那更新,則更短。

我們必須觀察日誌記錄編號,以確保它不會超過它可以擁有的最大位數。目前我正在通過一個簡單的查詢來跟踪這些資訊並將其添加到電子表格中。

範例查詢:

SELECT Databasename, MAX(LogRecordNumber), LogTimestamp
FROM MyDB.MyTable
WHERE LogTimestamp BETWEEN '2014-11-12-04...' AND '2014-11-12-08...'
GROUP BY DatabaseName, LogTimestamp

相反,我想開發一份報告,技術人員可以執行該報告來通過統計回歸確定日誌記錄何時會失去。

所以我現在需要一個 select 語句,它會在我們有日誌記錄的每個時間間隔內檢索 LogRecordNumber。每週獲取一次日誌編號是合適的,並允許我對我們何時會用完比特進行合理的回歸猜測。

同樣,這些數據可能是一年前或幾個月前的數據,因此無法對 DATE(CURRENT_TIMESTAMP) - X WEEKS 之類的內容進行硬編碼。

有什麼方法可以做我建議的查詢,還是我需要重新考慮一下?

如果重要的話,有問題的數據庫是 DB2。

可以在SQL中執行此操作。這裡確實有2個問題:

  1. 每週為每個數據庫查找 1 條記錄
  2. 計算平均消費率

對於第一個問題,您有幾種方法可以做到這一點:

select databasename, logrecordnumber, logtimestamp
 from MyTable
where logtimestamp > current timestamp - 42 days
  and dayofweek(logtimestamp) = 0
  and time(logtimestamp) between '11:59:30' and '12:00:30'

這僅查看過去 6 週的記錄,然後查找發生在星期日 ( dayofweek() = 0) 12:00 的記錄。(between當您的腳本沒有精確地按分鐘執行時,使用謂詞應該處理數據庫伺服器和/或實例上時鐘的微小差異。

也可以使用 OLAP 視窗函式來編寫它,但我不確定它是否會更有效。


對於第二個問題,您可能希望使用該LAG()函式來計算日誌記錄中的增量:

select 
   databasename
  ,logrecordnumber
  ,logtimestamp
  ,logrecordnumber - lag(logrecordnumber,1) over (partition by database order by logtimestamp) as logrecordnumber_growth
from 
   MyTable
where 
   logtimestamp > current timestamp - 42 days
   and dayofweek(logtimestamp) = 0
   and time(logtimestamp) between '11:59:30' and '12:00:30'

此範例添加了一個計算,顯示自前一周以來 logrecordnumber 增長了多少。

剩下的計算(推斷何時 LSN 可能用完)留給 OP 練習。

引用自:https://dba.stackexchange.com/questions/82482