Почему TOP или SET ROWCOUNT делают мой запрос таким медленным? - PullRequest
4 голосов
/ 19 ноября 2009

У меня есть база данных SQL Server 2008 с приблизительно 14 миллионами строк. В нем есть две таблицы

Table1
    rowId int, primary key
    someData1 int
    someData2 int...

Table2
    id int, primary key
    rowId ==> int, refers to the rowId from Table1
    someCalculatedData int...

    Table2.rowId is not a foreign key, but I did make a Non-clustered, Non-Unique index on it

Когда я импортирую данные, я вставляю все данные в Таблицу1, а затем нахожу строки, в которых нет записи в Таблице2, и вставляю данные в эту таблицу.

Я делал это в пакетном режиме, выбирая 250 000 строк за раз, обрабатывая данные и вставляя их в таблицу 2, а затем находя следующие 250 000 строк и так далее, пока в Таблице 1 не было ни одной строки, в которой нет записей. в таблице 2.

select TOP 250000 rowId from Table1 
       where NOT EXISTS (select rowId from Table2 where Table1.rowId=Table2.rowId)

Этот запрос действительно замедлился, и теперь для получения следующего пакета требуется более двух минут. Если я выполню запрос без ключевых слов TOP или SET ROWCOUNT и получу все строки, то запрос вернет результаты через ~ 15 секунд.

Кто-нибудь знает, почему TOP и SET ROWCOUNT приводят к тому, что запрос занимает гораздо больше времени, чем получение всех данных?

Можно ли повысить производительность запроса и при этом каждый раз получать только подмножество данных?

Ответы [ 3 ]

3 голосов
/ 19 ноября 2009

посмотрим, поможет ли это

select top 250000 t1.rowid 
from Table1 t1 
left outer join table2  t2 
on t1.rowid=t2.rowid 
where t2.rowid is null
1 голос
/ 19 ноября 2009

Очевидно, мой индекс или статистика индекса в Table2.rowId были не свежими, и план запросов для запросов TOP / SET ROWCOUNT работал плохо.

Я реорганизовал / перестроил индекс, и производительность запросов для запросов TOP / SET ROWCOUNT была значительно улучшена.

1 голос
/ 19 ноября 2009

Это происходит потому, что весь запрос должен быть запущен на сервере, прежде чем сервер сможет решить, какие «верхние» 250 000 строк. Только тогда данные начнут возвращаться вашему клиенту по сети.

Без оператора "top" сервер начнет отправку данных немедленно, хотя я подозреваю, что общее время для всех данных, которые будут отправлены с сервера и получены на вашем компьютере, вероятно, будет похоже на оператор, включая top.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...