Мой сайт имеет процедуру поиска, которая работает очень медленно. Одна вещь, которая замедляет его, это объединение 8 таблиц, которое оно должно сделать (у него также есть предложение WHERE
для ~ 6 параметров поиска). Я пытался ускорить запрос, используя различные методы, такие как добавление индексов, но они не помогли.
Одна идея, которая у меня есть, - кэшировать результат соединения 8 таблиц. Я мог бы создать временную таблицу соединения и сделать процедуру поиска запросить эту таблицу. Я мог бы обновлять таблицу каждые 10 минут или около того.
Используя псевдокод, я изменил бы свою процедуру так:
IF CachedTable is NULL or CachedTable is older than 10 minutes
DROP TABLE CachedTable
CREATE TABLE CachedTable as (select * from .....)
ENDIF
Select * from CachedTable Where Name = @SearchName
AND EmailAddress = @SearchEmailAddress
Это рабочая стратегия? Я на самом деле не знаю, какой синтаксис мне понадобится для этого, или что мне нужно будет заблокировать, чтобы предотвратить поломку, если два запроса происходят одновременно.
Кроме того, каждый раз для создания нового CachedTable
может потребоваться довольно много времени, поэтому я подумал о попытке что-то вроде двойной буферизации в компьютерной графике:
IF CachedTabled is NULL
CREATE TABLE CachedTable as (select * from ...)
ELSE IF CachedTable is older than 10 minutes
-- Somehow do this asynchronously, so that the next time a search comes
-- through the new table is used?
ASYNCHRONOUS (
CREATE TABLE BufferedCachedTable as (select * from ...)
DROP TABLE CachedTable
RENAME TABLE BufferedCachedTable as CachedTable
)
Select * from CachedTable Where Name = @SearchName
AND EmailAddress = @SearchEmailAddress
Имеет ли это какой-то смысл? Если так, как я достигну этого? Если нет, что я должен делать вместо этого? Я пытался использовать индексированные представления, но это приводило к странным ошибкам, поэтому я хочу что-то вроде этого, чтобы я мог иметь больший контроль (Кроме того, что-то, что я мог бы потенциально раскрутить на другом сервере в будущем.)
А как насчет индексов и т. Д. Для таблиц, созданных таким образом?
Это может быть очевидно из вопроса, но я не знаю так много о SQL или опциях, которые у меня есть.