Как избежать проблемы с тайм-аутом сервера SQL при обработке большого количества данных - PullRequest
0 голосов
/ 12 сентября 2011

Мне приходится обрабатывать огромное количество данных в моем приложении ASP.Net MVC. Иногда при получении данных возникает тайм-аут. Какие из всех известных способов ускорить выполнение и избежать тайм-аута? Приложение использует SQL SP.

Следующий запрос в SP занимает больше времени.

WITH CTESelect AS (
  SELECT  TOP 20 CompanyName
  FROM    Periodicals P
  WHERE   P.PID IN (
            SELECT  DISTINCT CASE WHEN P.ParentID IS NULL 
                             THEN P.PID
                             ELSE P.ParentID
                             END AS PID
            FROM    Periodicals P
                    LEFT JOIN Companies C ON P.CompanyID = C.CompanyID
                    LEFT JOIN UserContacts UC ON P.CreatedUserID = UC.UserID
                    LEFT JOIN Contacts CT ON UC.ContactID = CT.ContactID
                    LEFT JOIN UserContacts URC ON P.CustomerID = URC.UserID
                    LEFT JOIN Contacts RCT ON URC.ContactID = RCT.ContactID
                    LEFT JOIN UserRepresentCompanies UCP ON UCP.UserID = URC.UserID
                    LEFT JOIN Contacts CC ON CC.ContactID = UCP.CompanyContactID
            WHERE   ( @CompanyID IS NULL OR @CompanyID = C.CompanyID )
                    AND ( @CustomerID = 0 OR @CustomerID = URC.UserID )
                    AND ( P.SaveMode IS NULL )
          )
)
SELECT  DISTINCT  CompanyName
FROM    CTESelect  

Ответы [ 4 ]

2 голосов
/ 12 сентября 2011

Согласно комментариям, выбор не более 20 записей не должен занимать много времени.

Некоторые вещи для проверки

  • имеет ли каждая foreign key индекс
  • есть ли индекс покрытия для SaveMode и companyname

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

Оператор SQL

SELECT  TOP 20 DISTINCT COALESCE(Pp.CompanyName, p.CompanyName)
FROM    Periodicals P
        LEFT JOIN Periodicals Pp ON Pp.PID = P.ParentID
        LEFT JOIN Companies C ON P.CompanyID = C.CompanyID
        LEFT JOIN UserContacts UC ON P.CreatedUserID = UC.UserID
        LEFT JOIN Contacts CT ON UC.ContactID = CT.ContactID
        LEFT JOIN UserContacts URC ON P.CustomerID = URC.UserID
        LEFT JOIN Contacts RCT ON URC.ContactID = RCT.ContactID
        LEFT JOIN UserRepresentCompanies UCP ON UCP.UserID = URC.UserID
        LEFT JOIN Contacts CC ON CC.ContactID = UCP.CompanyContactID
WHERE   ( @CompanyID IS NULL OR @CompanyID = C.CompanyID )
        AND ( @CustomerID = 0 OR @CustomerID = URC.UserID )
        AND ( P.SaveMode IS NULL )
1 голос
/ 12 сентября 2011

Во-первых, нужны ли вам ЛЕВЫЕ объединения для каждой таблицы?Если некоторые из них можно будет заменить на внутренние, это поможет.Убедитесь, что у вас есть индекс везде, где он вам нужен.Вы захотите проверить план выполнения, чтобы убедиться, что все правильно проиндексировано.

0 голосов
/ 12 сентября 2011

Проблема, скорее всего, связана с запросом.

Несколько замечаний.

Вы делаете несколько объединений в одни и те же таблицы для разных полей Если бы вы делали это за одно объединение, а не просмотр всей таблицы, то поиск был бы более эффективным

Например,

 LEFT JOIN UserContacts UC ON UC.UserID = P.CreatedUserID
 AND UC.UserID = P.CustomerID
 LEFT JOIN Contacts CT ON CT.ContactID = UC.ContactID 
 AND CT.ContactID = UC.ContactID

Также заметил, что P.CustomerId = UserID? Это действительные отношения? так как это сделало бы 2 соединения с таблицей UserContacts и таблицей периодических изданий в том же поле. Вы можете уйти только с 1 присоединением

LEFT JOIN UserContacts URC ON P.CustomerID = URC.UserID

Возможно, вы также возвращаете дополнительные таблицы данных в соединении без причины вывода, например, почему UserRepresentCompanies в запросе? Вы не выбираете данные из него или не используете предложение where.

0 голосов
/ 12 сентября 2011

оптимизировать ваш сохраненный процесс.в Google есть миллион страниц.

, если не можете, увеличьте значение таймаута в строке подключения.

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