#sql #sql-server
#sql #sql-сервер
Вопрос:
Я понял, что мне нужно только записать идентификатор сеанса клиента и идентификатор просмотренного продукта, чтобы достичь этого. Вот мой сценарий таблицы:
CREATE TABLE [dbo].[pagevisits](
[ID] [int] IDENTITY(1,1) NOT NULL,
[xsession] [int] NULL,
[xpagename] [int] NULL
) ON [PRIMARY]
Я придумал запрос, который, похоже, работает нормально
select top 5 xpagename, COUNT(xpagename)as total
FROM pagevisits
WHERE pagevisits.xsession in (SELECT pagevisits.xsession
FROM pagevisits
WHERE pagevisits.xpagename = 20
AND pagevisits.xsession != 539447381 )
AND pagevisits.xpagename != 20
GROUP BY xpagename
ORDER BY total DESC
Однако, будучи немного новичком в SQL, я боюсь, что, поскольку эта таблица, вероятно, станет довольно большой, не загромождает ли это сервер? Есть ли лучший способ сделать это или я в порядке?
Комментарии:
1. Если вас беспокоит размер, вы можете помочь уменьшить его, применив некоторые ограничения к вашим требованиям. Например, вас интересует «просмотрено» только тогда, когда пользователь перешел непосредственно с этой страницы на другую? Это не уменьшит количество записей, но упростит выполнение запроса. В качестве альтернативы, вас интересуют только просмотры за последние x дней / недель / месяцев / лет? Если да, то вы можете периодически удалять из таблицы ненужную информацию (или разбивать ее на разделы, если вам нужны данные на всякий случай).
2. Amazon использует «Люди, которые купили это, также купили», вероятно, потому, что у них все равно должна быть эта информация, и она не будет такой обширной, как «Люди, которые просматривали, также просматривали».
3. Да, это правильно. Дополнительный выбор позволяет мне находить то, что видели другие люди, чтобы я мог подсчитать наиболее просматриваемые элементы и найти пять самых популярных.
Ответ №1:
Я не уверен, зачем вам нужен внутренний SELECT там. Если вы хотите выбрать страницы, посещенные клиентом в существующем сеансе (предположение: идентификатор сеанса известен), отличные от текущей страницы, вы можете:
select top 5 xpagename, COUNT(xpagename)as total
FROM pagevisits
WHERE pagevisits.xsession = 539447381
AND pagevisits.xpagename != 20
GROUP BY xpagename
ORDER BY total DESC
где 539447381 — текущий идентификатор сеанса, а 20 — текущая страница.
Вы можете повысить производительность, если сможете добавить кластеризованный индекс в xpagename и xsession:
CREATE CLUSTERED INDEX [custom] ON [dbo].[pagevisits]
(
[xsession] ASC,
[xpagename] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
PS: В заголовке вопроса указано «Клиент также просматривается» и, следовательно, мой ответ. Если ожидаемый результат заключается в возврате 5 лучших страниц, посещенных другими клиентами, которые просматривали текущую страницу, то запроса, приведенного в вопросе, достаточно, но для повышения производительности добавьте кластеризованный индекс (заменяет просмотр таблицы поиском кластеризованного индекса).
Комментарии:
1. Я полагаю, что OP хотел, чтобы раздел «Люди, которые просматривали это, также просматривали» — аналогично Amazon «Люди, которые купили это, также купили». Таким образом, не список, который просматривал текущий пользователь, а то, что просматривали другие люди, которые также просматривали этот продукт.
2. В заголовке вопроса говорилось «Клиент также просматривал» и, следовательно, мой ответ. Если ожидаемый результат заключается в возврате 5 лучших страниц, посещенных другими клиентами, которые просматривали текущую страницу, то запрос, приведенный в вопросе, идеально подходит для предложенного мной кластеризованного индекса (для замены сканирования таблицы поиском кластеризованного индекса).
3. Извините, возможно, я был расплывчатым в своей формулировке. Мне нужен способ генерирования предложений для других продуктов. Поскольку это для сайта недвижимости, я не могу использовать покупки!! Наиболее просматриваемые свойства другими людьми, которые просматривали то же свойство, показались лучшим выбором. Я попробую рекомендации. Спасибо за быстрые ответы.