2012-03-19 2 views
1

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

После дальнейшего исследования я наткнулся на эту страницу: 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

Эти примеры запросов статистики на уровне объектов/индекс для таблицы, вы не можете примените к ним условие - ваша примерная страница выглядит так, как будто она хочет подсчитать X для каждой категории, но ваш образец запроса, похоже, не применяется к их набору, а какой всего используется sql. –

ответ

2

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

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

3

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

+1

Как утверждает Виталий, ваша настоящая проблема заключается в том, что вы денормализовали свою модель данных. Теперь вам нужно использовать последовательность OR. ИЛИ затрудняет использование СУБД индексами. Решение этой проблемы и проблемы с производительностью исчезнут. Вам не нужно нормализовать вашу модель данных. Вы можете настроить SQL, чтобы он мог работать с не нормированными моделями данных (как вы показали). Но это будет сложно и медленно. Go With The Flow, SQL лучше всего работает с нормализованными моделями данных. – Wim

-1

Что-то вроде этого, может быть, чтобы воспользоваться индексами (если таковые имеются):

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 уникальные

+0

К сожалению, это оказалось еще медленнее, чем мое решение. – neojakey

+0

@neojakey вам нужны отдельные «отфильтрованные индексы с включенным столбцом» в этих столбцах, чтобы воспользоваться этим методом; 'создавать некластеризованный индекс ix_m_nykacid_nykacide1 на члене (nykacountyid, nycacatidextra1) включают (memberid), где profiletypeid <> 1' (10 из них) –

Смежные вопросы