2016-11-02 10 views
-2

Я хотел бы знать, будет ли IN кэшировать результат статического сложного запроса или будет выполняться для каждой строки?Текущая производительность SQL Server для IN vs EXIST для сложного статического выбора

ОБРАЗЦА

SELECT a.id, a.name 
FROM customer a 
WHERE a.id IN (SELECT b.customerId 
       FROM orders b 
       JOIN aricle c ON c.orderId = b.id 
       WHERE b.date = '20160910' and c.costcenter > 1000) 

Теперь будет результат подзапроса временно хранится или будет EXIST быстрее для этого?

Предположим, что результат всего несколько строк < 100, но запрос может быть намного сложнее!

Я знаю, что в этом случае я мог бы также ПРИСОЕДИНИТЬСЯ к столам, но это не главное.

Я особенно заинтересован в поведении тока SQL Server

Спасибо всем :)

+0

Я не совсем понимаю, что вы просите. Не могли бы вы прояснить, что именно вы ищете? –

+0

Я считаю, что IN будет быстрее, потому что SQL Server ищет набор значений, а не EXIST, где ему придется искать, чтобы каждый существовал, прежде чем захватывать каждое значение. С этим запросом, хотя и не было бы слишком облагаться налогом на операцию. –

+0

в основном, 'in' работает медленнее, чем' существует', когда есть большой набор данных для тестирования. если вы говорите о 100 рядах, не должно быть разницы. –

ответ

0

Если вы конкретно заинтересованы в поведении SQR, то вы можете проверить и посмотреть, если данные считываются из памяти или с диска, выполнив следующую команду перед оператором SQL.

SET STATISTICS IO ON 

Он вернет логические и физические чтения.

Логические чтения: Логическое чтение указывает общее количество страниц данных, необходимых для доступа из кэша данных для обработки запроса. Очень возможно, что логическое чтение будет обращаться к тем же страницам данных много раз, поэтому количество значений логического считывания может быть выше фактического количества страниц в таблице. Обычно лучший способ уменьшить логическое чтение - применить правильный индекс или переписать запрос.

Физические данные Физическое чтение показывает общее количество страниц данных, которые считываются с диска. В случае отсутствия данных в кеше данных физическое чтение будет равно количеству логического считывания. И обычно это происходит для первого запроса запроса. И для последующего же запроса запроса число будет значительно уменьшено, поскольку страницы данных были в кеше данных.

Чтобы сравнить между двумя запросами, вы можете использовать план выполнения, чтобы проверить время выполнения и сравнить запросы.

+0

Хорошо, спасибо. Думаю, я должен принять, что нет абсолютного ответа. – user3771755