2015-01-26 2 views
0

Я столкнулся с проблемой производительности из-за инструкции «Вставить в» в sql. Я использую CTE для выбора данных из нескольких таблиц и вставки в другую таблицу. До вчерашнего дня он работал нормально. Выбор занимает менее минуты, чтобы получить данные, которые вставляются в вечность. Может кто-нибудь, пожалуйста, помогите мне понять, что я делаю неправильно. Любая помощь высоко ценится. Благодарю.SQL-вставка в использование CTE

Вот мой код:

Я использую этот запрос в качестве ИП. Я пытаюсь загрузить 220K записей в таблицу записей 1.5M.

;with CTE_A 
AS 
(
     SELECT A1, A2,...   
     FROM dbo.A with (nolock) 
     WHERE A1 = <some condition> 
     GROUP BY a.A1,a.A2 , a.A3  
), CTE_C as 
    (
     SELECT C1, C2,....     
     FROM dbo.B with (nolock)  
     WHERE a.C1 = <some condition> 
     GROUP BY a.c1,a.C2 , a.C3  
) 
INSERT INTO [dbo].MainTable 
    SELECT 
     A1, A2, A3 , C1, C2, C3  
    FROM 
     CTE_A ta with (nolock) 
    LEFT OUTER JOIN 
     CTE_C tc with (nolock) ON ta.a1 = tc.a1 and ta.b1 = tc.b1 and ta.c1 = tc.c1 
    LEFT OUTER JOIN 
     othertable bs with (nolock) ON usd_bs.c = s.c 
             AND (A1 BETWEEN bs.a1 AND bs.a1) 
             AND bs.c1 = 1      
+1

Вы действительно должны дать больше информации. В его нынешнем состоянии кому-то нужен кристальный шар. –

+0

Обновите свой вопрос по вашему запросу. –

+0

Я добавил более подробную информацию к вопросам. – lch

ответ

1

попробовать этот метод (временную таблицу вместо КТР), исполнение должно быть значительно выше для вашей задачи

IF OBJECT_ID('Tempdb..#CTE_A') IS NOT NULL 
    DROP TABLE #CTE_A 
IF OBJECT_ID('Tempdb..#CTE_C') IS NOT NULL 
    DROP TABLE #CTE_C 
------------------------------------------------------------- 
SELECT A1 , 
     A2 ,... 
INTO #CTE_A --data set into temp table 
FROM dbo.A WITH (NOLOCK) 
WHERE A1 = <some condition> 
GROUP BY a.A1 , 
     a.A2 , 
     a.A3 
------------------------------------------------------------- 
SELECT C1 , 
     C2 ,....     
FROM dbo.B WITH (NOLOCK)  
INTO #CTE_C --data set into temp table 
WHERE a.C1 = <some condition> 
GROUP BY a.c1 , 
     a.C2 , 
     a.C3 
INSERT INTO [dbo].MainTable 
     SELECT A1 , 
       A2 , 
       A3 , 
       C1 , 
       C2 , 
       C3 
     FROM #CTE_A AS ta 
       LEFT JOIN #CTE_C AS tc ON ta.a1 = tc.a1 
              AND ta.b1 = tc.b1 
              AND ta.c1 = tc.c1 
       LEFT JOIN othertable AS bs ON usd_bs.c = s.c 
               AND (A1 BETWEEN bs.a1 AND bs.a1) 
               AND bs.c1 = 1 
Смежные вопросы