useQueryInsightsMetrics.ts 988 B

123456789101112131415161718192021222324
  1. import { useMemo } from 'react'
  2. import type { QueryPerformanceRow } from '../../QueryPerformance/QueryPerformance.types'
  3. export const useQueryInsightsMetrics = (data: QueryPerformanceRow[]) => {
  4. const avgP95 = useMemo(() => {
  5. const rows = data.filter((r) => (r.p95_time ?? 0) > 0)
  6. if (rows.length === 0) return 0
  7. return Math.round(rows.reduce((sum, r) => sum + (r.p95_time ?? 0), 0) / rows.length)
  8. }, [data])
  9. const totalCalls = useMemo(() => data.reduce((sum, r) => sum + r.calls, 0), [data])
  10. const totalRowsRead = useMemo(() => data.reduce((sum, r) => sum + r.rows_read, 0), [data])
  11. const cacheHitRate = useMemo(() => {
  12. const hits = data.reduce((sum, r) => sum + (r._total_cache_hits ?? 0), 0)
  13. const misses = data.reduce((sum, r) => sum + (r._total_cache_misses ?? 0), 0)
  14. const total = hits + misses
  15. return total > 0 ? ((hits / total) * 100).toFixed(2) + '%' : '–'
  16. }, [data])
  17. return { avgP95, totalCalls, totalRowsRead, cacheHitRate }
  18. }