Единственное описание производительности, которое я видел, это , созданный @ Scott (автор другой ответ на этот вопрос ). К сожалению, его статья не отдает должное базе данных Web SQL, поскольку в ней используется неэффективное предложение HAVING для ограничения размера набора результатов. Я подправил SQL Скотта, заменив HAVING, GROUP BY и LEFT JOIN на (почти) эквивалентный WHERE и выбрал:
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
Это примерно в 28 раз быстрее, чем оригинал - 20 мс против 560 мс на моем компьютере - что благодаря экстраполяции чисел Скотта делает его примерно в 10 раз быстрее, чем эквивалентная IndexedDB. Я не смог подтвердить это, потому что код IndexedDB не работает в моем браузере, по-видимому, из-за изменений API.
Я должен объяснить "(почти)", которое я написал выше. Исходный SQL и мой Скотт имеют несколько разные значения: необоснованное предложение WHERE для моего EpisodeCount, которое заменяет сканирование таблицы поиском по индексу, может не подсчитать некоторые эпизоды, если оно не охватывает все возможные значения Status. Удаление этого пункта стирает разницу за счет удвоения времени выполнения до 40 мс.
Обратите внимание, что ранее я обсуждал со Скоттом меньшее изменение в его SQL, которое также достигает 40 мс времени.
ОБНОВЛЕНИЕ: Большое спасибо Скотту за обновление его статьи , чтобы подтвердить обсуждение, которое мы провели.