Chỉ ghi lại hiệu suất tôi đã thấy là the one produced by @Scott (tác giả của the other answer to this question). Thật không may, bài viết của ông không làm công lý Cơ sở dữ liệu Web SQL, vì nó sử dụng một mệnh đề HAVING không hiệu quả để hạn chế kích thước của tập kết quả. Tôi chỉnh SQL của Scott, thay thế HAVING, GROUP BY và LEFT JOIN với (hầu như) tương đương WHERE và phụ Selects:
SELECT p.Name AS ProgramName,
s.rowid,
s.Name,
s.NowShowing,
s.ProgramID,
(SELECT COUNT(*) FROM Episode WHERE SeriesID = s.rowid AND STATUS IN ('Watched', 'Recorded', 'Expected') OR STATUS IS NULL) AS EpisodeCount,
(SELECT COUNT(*) FROM Episode WHERE SeriesID = s.rowid AND STATUS = 'Watched') AS WatchedCount,
(SELECT COUNT(*) FROM Episode WHERE SeriesID = s.rowid AND STATUS = 'Recorded') AS RecordedCount,
(SELECT COUNT(*) FROM Episode WHERE SeriesID = s.rowid AND STATUS = 'Expected') AS ExpectedCount
FROM Program p
JOIN Series s ON p.rowid = s.ProgramID
WHERE s.NowShowing IS NOT NULL OR
EXISTS (SELECT * FROM Episode WHERE SeriesID = s.rowid AND STATUS IN ('Recorded', 'Expected'))
ORDER BY CASE
WHEN s.NowShowing IS NULL THEN 1
ELSE 0
END,
s.NowShowing,
p.Name
Đây là nhanh hơn so với bản gốc khoảng 28 lần - 20 ms vs 560 ms trên máy tính của tôi - trong đó, bằng cách ngoại suy từ các số của Scott, làm cho nó nhanh hơn khoảng 10 lần so với IndexedDB tương đương. Tôi đã không thể xác nhận điều này vì mã IndexedDB không hoạt động trong trình duyệt của tôi, dường như do thay đổi API.
Tôi nên giải thích "(gần như)" tôi đã viết ở trên. SQL ban đầu của tôi và của tôi có ý nghĩa khác nhau một cách tinh tế: một mệnh đề WHERE vô cớ trong tập EpisodeCount của tôi - có tác dụng thay thế quét bảng bằng tìm kiếm chỉ mục - có thể không tính một số tập nếu nó không bao gồm tất cả các giá trị Trạng thái có thể. Việc loại bỏ mệnh đề này sẽ xóa bỏ sự khác biệt với chi phí nhân đôi thời gian thực hiện lên 40 ms.
Lưu ý rằng, trước đó, tôi discussed with Scott một thay đổi nhỏ hơn đối với SQL của mình cũng đạt được thời gian 40 ms.
CẬP NHẬT: Rất cám ơn Scott đã cập nhật số article của bạn để xác nhận cuộc thảo luận mà chúng tôi có.
Nguồn
2012-11-17 00:13:13
Đây là một câu hỏi thú vị. Tôi sẽ thực hiện một số thử nghiệm trong vài tuần tới và đăng cập nhật tại đây khi tôi có một số câu trả lời. – buley