2013-05-16 3 views
0
select count(*) from user 
where userid not in (select userid from ship where status in ('1','0')) 
    and field='web'; 

Это простое заявление, похоже, работает очень долго, как мне изменить sql, чтобы он мог работать быстрее? Благодарю.Quicken my simple sql

+0

Я не думаю, что какие-либо изменения в запрос помогут, но индексы на ID_пользователь и поле будет. – Scotch

+1

Пожалуйста, прочитайте http://stackoverflow.com/tags/postgresql-performance/info и отредактируйте свой вопрос, чтобы включить 'объяснять анализ' и т. Д. Кроме того, лучше избегать' NOT IN'; вместо этого попробуйте 'NOT EXISTS (SELECT 1 FROM ... WHERE ...)' –

ответ

1

Лучше избегать IN/NOT IN при работе с большими объемами данных. Предполагая, что ваши USERID столбцов индексируются, что-то подобное может быть быстрее:

SELECT COUNT(DISTINCT u.userid) 
    FROM user u 
    LEFT JOIN ship s ON u.userid=s.userid AND s.status IN ('1', '0') 
WHERE s.userid IS NULL AND field='web'