2012-05-08 4 views
0

У меня есть таблица под названием sales со следующими несколькими столбцами:SQL Server ускорить запрос с не

salesno (PK, char(25)) 
advanceno (char(15), not null) 

Теперь я хочу, чтобы выбрать все строки, в которых salesno не в advanceno:

SELECT salesno 
FROM sales 
WHERE salesno NOT IN (SELECT advanceno FROM sales) 

Запрос медленный, потому что таблица продаж содержит сотни тысяч строк.

Я сделал это, и это очень быстро:

SELECT salesno 
FROM sales 
WHERE salesno NOT IN ('000008360', '000008361', '000008362', '000008363', '000008364') 

Как можно оптимизировать запрос?

+0

присоединяется, как правило, быстрее, чем где пределы. – xQbert

+0

Имеет ли в таблице продаж какие-либо индексы? –

+0

Когда последний раз обновлялась статистика? Это было какое-то время? С того времени было добавлено значительное количество строк? – brian

ответ

3

Попробуйте это:

DECLARE @sales as Table (salesno char(25) 
,advanceno char(15) not null) 

INSERT INTO @sales(salesno,advanceno) 
SELECT '000008360','000008360' UNION ALL 
SELECT '000008361','000008362' UNION ALL 
SELECT '000008362','000008364' 

SELECT s.salesno 
FROM @sales s 
LEFT JOIN @sales a ON a.advanceno = s.salesno 
WHERE a.advanceno IS NULL 

В вашем примере, попробуйте это

SELECT s.salesno 
FROM sales s 
LEFT JOIN sales a ON a.advanceno = s.salesno 
WHERE a.advanceno IS NULL 
+0

Это медленнее, чем метод not. – kelvinfix

+0

Удивительно, но когда я проиндексировал advanceno, это очень быстро. – kelvinfix

+0

@Lelvin: это ** не ** удивительно! –

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

  • Нет связанных вопросов^_^