Система многопоточных комментариев SQL Server 2008 - что более эффективно? - PullRequest
1 голос
/ 23 марта 2012

У меня есть таблица, которая содержит мои сообщения и мои комментарии. Мы углубляемся только в один комментарий, без комментариев. Прямо сейчас мы выполняем ajax-запрос для сообщений, затем собираем комментарии в другом запросе, используя идентификаторы родительских сообщений, чтобы получить соответствующие дочерние комментарии.

То, что я хочу сделать, - это консолидировать это в наиболее эффективную систему единого запроса, какую только можно.

Это оставляет меня либо использовать CROSS APPLY, либо UNION, если я не ошибаюсь, но есть некоторые предостережения:

  • Мы хотим выбрать 10 лучших постов и 2 верхних комментария для каждого
  • Должности должны быть перечислены в порядке убывания
  • Комментарии должны быть перечислены в порядке возрастания

Вот пример наших текущих запросов на посты и комментарии:

Сообщения:

 SELECT TOP 10 ForumPostID, ForumID, ContentText, Hidden, S.Firstname, S.Lastname,   
 CONVERT(VARCHAR(30),DATEADD(hh,CASE
       WHEN DD.StartDate IS NOT NULL THEN 5 ELSE 6 
       END,
 FP.PostDate),126)+'Z' AS PostDate, 
 PostDate AS UglyTime, TopPostID, 
 (SELECT COUNT(*) FROM Admin.dbo.ForumPosts WHERE TopPostID = FP.ForumPostID) AS     
 'CommentCount',
 (SELECT COUNT(*) FROM Admin.dbo.ForumLikes WHERE ForumPostID = FP.ForumPostID) AS 'Likes',      
 CASE (SELECT COUNT(*) FROM Admin.dbo.ForumLikes WHERE ForumPostID = FP.ForumPostID AND    
      Authuser = FP.Authuser) WHEN 0 THEN 'Like' ELSE 'You liked this.' END AS 'LikeText' 
 FROM Admin.dbo.ForumPosts FP 
 INNER JOIN Student.dbo.Student S 
      ON S.StudentUID = FP.Authuser
 INNER JOIN Admin.dbo.DayLightSavingsDates DD 
      ON FP.PostDate BETWEEN DD.StartDate AND DD.EndDate
 WHERE FP.ForumPostID NOT IN ( SELECT Top 0 ForumPostID FROM Admin.dbo.ForumPosts FP2 ORDER BY 
 FP2.ForumPostID DESC) 
 AND FP.Hidden = 'N' AND FP.ContentText <> '' 
 AND FP.PostType = 'post' 
 ORDER  BY FP.PostDate DESC 

Комментарии:

SELECT TOP 50 ForumPostID, ForumID, ContentText, Hidden, S.Firstname, S.Lastname, 
CONVERT(VARCHAR(30),DATEADD(hh,CASE
      WHEN DD.StartDate IS NOT NULL THEN 5 ELSE 6 END,
FP.PostDate),126)+'Z' AS PostDate,
PostDate AS UglyTime, TopPostID,
(SELECT COUNT(*) FROM Admin.dbo.ForumPosts WHERE TopPostID = FP.ForumPostID) AS     
      'CommentCount', 
(SELECT COUNT(*) FROM Admin.dbo.ForumLikes WHERE ForumPostID = FP.ForumPostID) AS 'Likes',
CASE (SELECT COUNT(*) FROM Admin.dbo.ForumLikes WHERE ForumPostID = FP.ForumPostID AND 
     Authuser = FP.Authuser) WHEN 0 THEN 'Like' ELSE 'You liked this.' END AS 'LikeText' 
FROM Admin.dbo.ForumPosts FP 
INNER JOIN Student .dbo.Student S 
ON S.StudentUID = FP.Authuser 
INNER JOIN Admin.dbo.DayLightSavingsDates DD ON FP.PostDate BETWEEN DD.StartDate AND DD.EndDate 
WHERE FP.ForumPostID NOT IN 
    ( SELECT Top 0 ForumPostID FROM Admin.dbo.ForumPosts FP2 ORDER BY FP2.ForumPostID DESC) 
AND FP.ForumPostID IN 
   (SELECT Top 2 ForumPostID FROM Admin.dbo.ForumPosts  FP3 WHERE FP3.TopPostID = FP.TopPostID 
       ORDER BY FP3.PostDate DESC) 
AND FP.Hidden = 'N' 
AND FP.ContentText <> '' 
AND FP.PostType = 'comment' 
AND FP.TopPostID IN ( 373, 371, 370, 369, 368, 367, 366, 365, 364, 363 )
ORDER BY FP.ForumPostID ASC 

1 Ответ

0 голосов
/ 23 марта 2012

Самый важный совет, который можно здесь дать, заключается в том, что вам нужно посмотреть на план выполнения. Я не знаю, как обойти это.Запрос слишком сложен, чтобы давать конкретные рекомендации.

Хотя есть одна вещь: у вас есть много выражений типа "(ВЫБЕРИТЕ СЧЕТЧИК (*) ОТ Admin.dbo.ForumPosts WHERE TopPostID = FP.ForumPostID)".У оптимизатора запросов SQL Server возникают проблемы с использованием таких выражений в вычислениях.Иногда не удается преобразовать их в обычное объединение, что предотвращает много оптимизаций.Вы можете преобразовать их в объединения.Однако, насколько я могу судить, IN-пункты безопасны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...