Ошибка «Истекло время ожидания» при выполнении представления в SQL Server 2008 - PullRequest
5 голосов
/ 08 марта 2012

Я написал запрос в SQL Server 2008. Выполнение запроса занимает около 4 минут.
Мне нужен этот запрос как View. Итак, я создал представление с этим запросом и при попытке выполнить сценарий создания представления, он показывает следующую ошибку:

Истекло время ожидания.
Период ожидания истек до завершения операции или сервер не отвечает.

Запрос:

SELECT t.jrnno,
       (SELECT SUM(t1.amount)
          FROM dbo.T_sh AS t1
         WHERE (t1.b_or_s = '1') AND (t1.jrnno = t.jrnno)) AS buy,
       (SELECT SUM(t2.amount)
          FROM dbo.T_sh AS t2
         WHERE (t2.b_or_s = '2') AND (t2.jrnno = t.jrnno)) AS sale, 
       SUM(t.amount) AS Total, 
       SUM(t.h_crg) AS Howla, 
       SUM(t.l_crg) AS Laga, 
       SUM(t.taxamt) AS Tax, 
       SUM(t.commsn) AS Commission
  FROM dbo.T_sh AS t
 WHERE (t.tran_type = 'S')  
   AND (t.jrnno NOT IN (SELECT DISTINCT jrnno
                          FROM dbo.T_ledger))
GROUP BY t.jrnno

T_sh и T_ledger в обеих таблицах около 100К строк. Какова может быть возможная причина и как я могу преодолеть это?

Обновление:

select 
   t.jrnno, 
   SUM(CASE WHEN t.b_or_s = 1 THEN t.amount ELSE NULL END) buy,
   SUM(CASE WHEN t.b_or_s = 2 THEN t.amount ELSE NULL END) sale,
   SUM(t.amount) AS Total, 
   SUM(t.h_crg) AS Howla, 
   SUM(t.l_crg) AS Laga, 
   SUM(t.taxamt) AS Tax, 
   SUM(t.commsn) AS Commission
FROM 
   dbo.t_sh t
WHERE  
   t.tran_type = 'S'
   AND NOT EXISTS(SELECT 1 FROM  dbo.T_ledger x where x.jrnno = t.jrnno)
group by 
   t.jrnno

Это решило мою проблему. Спасибо всем за быстрый ответ.

Ответы [ 2 ]

4 голосов
/ 08 марта 2012

Попробуйте этот запрос:

select 
t.jrno, 
SUM(CASE WHEN t1.b_or_s = 1 THEN t.amount ELSE NULL END) buy,
SUM(CASE WHEN t1.b_or_s = 2 THEN t.amount ELSE NULL END) sale,
SUM(t.amount) AS Total, 
SUM(t.h_crg) AS Howla, 
SUM(t.l_crg) AS Laga, 
SUM(t.taxamt) AS Tax, 
SUM(t.commsn) AS Commission
FROM dbo.t_sh t
WHERE  t.tran_type = 'S'
AND NOT EXISTS(SELECT 1 FROM  dbo.T_ledger x x.jrno = t.jrno)
2 голосов
/ 08 марта 2012

Ваш запрос нужно сканировать только dbo.T_sh один раз:

  SELECT t.jrnno,
         SUM(CASE WHEN t.b_or_s = 1 THEN t.amount ELSE NULL END) AS buy,
         SUM(CASE WHEN t.b_or_s = 2 THEN t.amount ELSE NULL END) AS sale,
         SUM(t.amount) AS Total, 
         SUM(t.h_crg) AS Howla, 
         SUM(t.l_crg) AS Laga, 
         SUM(t.taxamt) AS Tax, 
         SUM(t.commsn) AS Commission
    FROM dbo.T_sh AS t
   WHERE t.tran_type = 'S'
     AND t.jrnno NOT IN (SELECT DISTINCT 
                                tl.jrnno
                           FROM dbo.T_ledger tl)
GROUP BY t.jrnno
...