Оптимизация sql Count Query - PullRequest
0 голосов
/ 15 июля 2010

Я все еще довольно новичок в SQL, поэтому я хотел знать, делаю ли я это наиболее оптимизированным способом.

 SELECT DISTINCT ACCOUNTID, ACCOUNT_NAME
  (SELECT        COUNT(*)
  FROM            TICKET
  WHERE        (ACCOUNTID = OPPORTUNITY.ACCOUNTID)) AS [Number Of Tickets],
  (SELECT        COUNT(*)
  FROM            TICKET
  WHERE        (ACCOUNTID = OPPORTUNITY.ACCOUNTID) AND (STATUSCODE = 1 OR
         STATUSCODE = 2 OR
         STATUSCODE = 3)) AS [Active Tickets]
 from OPPORTUNITY
    where AccountID > @LowerBound and AccountID < @UpperBound

То, что я пытаюсь сделать, это получить список всех учетных записей и показать, сколько билетов у этой учетной записи и сколько активных (с кодом состояния 1, 2 или 3). Является ли выбор внутри выбора правильным способом или есть способ сделать это, используя что-то вроде group by.

Больше всего меня беспокоит скорость, для получения примерно 20 записей требуется 3-5 секунд, и запрос может иметь тысячи результатов.

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

Это выполняется на SQL Server 2000.

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

Ответы [ 2 ]

2 голосов
/ 15 июля 2010

Я думаю, что ниже должно быть логически эквивалентным и более эффективным.Тщательно протестируйте оба аспекта с вашей стороны!

 SELECT O.ACCOUNTID, O.ACCOUNT_NAME,
   COUNT(*) AS [Number Of Tickets],
   ISNULL(SUM(CASE WHEN STATUSCODE IN (1,2,3) THEN 1 ELSE 0 END),0) 
                                                                AS [Active Tickets]
 FROM OPPORTUNITY O
 LEFT OUTER JOIN TICKET T ON T.ACCOUNTID = O.ACCOUNTID
    WHERE O.ACCOUNTID > @LowerBound and O.ACCOUNTID < @UpperBound
    GROUP BY O.ACCOUNTID, O.ACCOUNT_NAME

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

1 голос
/ 15 июля 2010

Механизм SQL (даже в 2000 году) достаточно умен, чтобы оптимизировать этот sql.Основываясь на ваших показателях производительности с таким небольшим количеством результатов, я предполагаю, что исходные данные имели кучу записей и не имеют индексов, необходимых SQL.

Убедитесь, что есть индекс Opportunity.AccountID ииндекс для Ticket.AccountID.

...