Ускоренный подсчет SQL - PullRequest
1 голос
/ 19 марта 2012

У меня есть страница, загрузка которой занимает слишком много времени, поскольку она должна подсчитывать количество участников в каждой категории. http://www.storeboard.com/counties/default.asp?cou=1196

После дальнейшего расследования я наткнулся на эту страницу: http://blogs.msdn.com/b/martijnh/archive/2010/07/15/sql-server-how-to-quickly-retrieve-accurate-row-count-for-table.aspx

У меня вопрос, как мне это изменить:

SELECT COUNT(MemberID) AS MembersInCountyCat
FROM Member
WHERE NYKACountyID = @NYKACountyID
AND (
    NYKACatID = @NYKACatID 
 OR NYKACatIDExtra1 = @NYKACatID 
 OR NYKACatIDExtra2 = @NYKACatID 
 OR NYKACatIDExtra3 = @NYKACatID 
 OR NYKACatIDExtra4 = @NYKACatID 
 OR NYKACatIDExtra5 = @NYKACatID
 OR NYKACatIDExtra6 = @NYKACatID 
 OR NYKACatIDExtra7 = @NYKACatID 
 OR NYKACatIDExtra8 = @NYKACatID 
 OR NYKACatIDExtra9 = @NYKACatID 
 OR NYKACatIDExtra10 = @NYKACatID
)
AND ProfileTypeID <> 1

В предложение в решении 4 на странице, которую я цитировал.

Любая помощь, которую вы можете оказать, будет принята с благодарностью.

Большое спасибо, Пол

Ответы [ 3 ]

3 голосов
/ 19 марта 2012

Вы должны нормализовать свою базу данных, то есть переместить NYKACatID, NYKACatIDExtra1 .. NYKACatIDExtra10 в отдельную таблицу. Определите правильный индекс для этой таблицы и перепишите ваш запрос, используя соединение.

2 голосов
/ 19 марта 2012

Если вам действительно необходимо выполнить поиск во всех этих полях, то внесите в них соответствующие индексации - используйте Profiler и советник по настройке ядра базы данных для хорошей отправной точки.

Одной из альтернатив может быть извлечение этих 10 полей NYKACatIDExtra в отдельную таблицу и размещение их в виде отношения один ко многим.Затем используйте объединение, чтобы найти категории для предметов, и количество должно быть намного быстрее ...

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

Примерно так, может быть, использовать индексы (если они у вас есть):

select MembersInCountyCat = count(*) 
from (
SELECT MemberID
FROM Member
WHERE NYKACountyID = @NYKACountyID
AND NYKACatID = @NYKACatID
AND ProfileTypeID <> 1 
union
SELECT MemberID
FROM Member
WHERE NYKACountyID = @NYKACountyID
AND NYKACatIDExtra1 = @NYKACatID 
AND ProfileTypeID <> 1
union
...
union 
SELECT MemberID
FROM Member
WHERE NYKACountyID = @NYKACountyID
AND NYKACatIDExtra10 = @NYKACatID 
AND ProfileTypeID <> 1
) t

union сделает эти MemberIds уникальными

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