Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MSSQL: Скорость выполнения двух запросов, почему один быстрее другого? 
V
    Опции темы
ДобренькийПапаша
Дата 23.7.2010, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7



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

Код

SELECT DISTINCT maker
FROM Product prd
WHERE model IN
(
SELECT model
FROM PC
WHERE speed>=450
)


А вот этот запрос выполняется быстрее на порядок:
Код

SELECT DISTINCT maker
FROM Product prd
WHERE model IN
(
SELECT model
FROM PC
WHERE speed>=450
and prd.model = prd.model


Цена первого запроса примерно 0.2, а второго запроса 0.01.
Вопрос: почему?


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
skyboy
Дата 23.7.2010, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



сделай explain запросам
PM MAIL   Вверх
Frees
Дата 23.7.2010, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 2
Всего: 54



Цитата(ДобренькийПапаша @  23.7.2010,  21:31 Найти цитируемый пост)
Вопрос: почему?

в первом запросе не используется индекс 

если стоит вопрос оптимизации то лучше переделать IN на EXISTS, по слухам EXISTS быстрее, сам тестов не делал. Поправьте если не прав

Код

SELECT DISTINCT maker
FROM Product prd
WHERE
exists
(
SELECT *
FROM PC p
WHERE p.speed>=450 and p.model = prd.model
)


Это сообщение отредактировал(а) Frees - 23.7.2010, 21:38


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
ДобренькийПапаша
Дата 24.7.2010, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7



Цитата(skyboy @ 23.7.2010,  21:04)
сделай explain запросам

Что это значит? smile


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
skyboy
Дата 24.7.2010, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



explain даст ответ на вопрос: "почему?"
vingrad: профилирование запросов в mysql 
mysql.com: explain syntax
PM MAIL   Вверх
Zloxa
Дата 25.7.2010, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



sql-ex?
там вроде была педалька "показать план запроса".
План запроса это то, где Вы смотрите "цену".

На самом деле вопрос забавный.
Скорее всего предикат prd.model = prd.model вводит MS в заблуждение относительно того, что подзапрос кореллированный, в результате MS строит разные планы для этого запроса. Если это не баг, то, как минимум, недоделка оптимизатора.


Это сообщение отредактировал(а) Zloxa - 25.7.2010, 15:36


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
skyboy
Дата 25.7.2010, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



да, кстати, explain - конструкция для mysql
а с чего я взял, что речь идет о mysql?
PM MAIL   Вверх
Zloxa
Дата 25.7.2010, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Собсна вот планы
user posted image
user posted image

Если честно, даже после длительной медитации над этими запросами, я так и не понял, от чего в первом случае выполняетcя inner join, а не semi join, как во втором запросе, план которого мне кажется куда более разумным.
Однако ж косты у запросов отличаются отнюдь не на порядок, как то было обозначено ТС.


Это сообщение отредактировал(а) Zloxa - 25.7.2010, 17:19


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DimW
Дата 26.7.2010, 06:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



удалил.


Это сообщение отредактировал(а) DimW - 26.7.2010, 08:24
PM MAIL ICQ   Вверх
azesmcar
Дата 26.7.2010, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: нет
Всего: 211



Zloxa

На какой СУБД проводился опыт? Есть ли там возможность отключить оптимизацию для запроса? Случаи плохой оптимизации бывают, иногда отключение оптимизации на Oracle давало значительное повышение скорости работы запроса.
PM   Вверх
Zloxa
Дата 26.7.2010, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(azesmcar @  26.7.2010,  08:42 Найти цитируемый пост)
На какой СУБД проводился опыт?

sql-ex крутится на ms sql 2003 или старше.... ибо конструкцию with держит smile

у меня в свою очередь вопрос ТС
Откуда подчерпнут этот, на первый взгляд, нелепый трюк с предикатом "prd.model = prd.model"?


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
ДобренькийПапаша
Дата 26.7.2010, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7



Да, я прошу прощения. Ошибся по поводу того, что различия в стоимостях на порядок.
Это действительно вопрос с сайта sql-ex.
Там при выполнении задания бывает ссылка слева появляется на обсуждение данного задания на форуме. Такой нелепый трюк с предикатом предложили именно там.
Если вы зарегены там, то вот ссылка.
Я там же спросил, дескать почему один запрос выполняется быстрее другого?
Местный гуру сказал, цитирую: "Такой предикат не ускоряет запрос, а изменяет стоимость плана."

А почему стоимость плана меняется в лучшую сторону?))) Я там просто дальше расспрашивать не стал, так как ответили мне неохотно)))


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
Zloxa
Дата 27.7.2010, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(ДобренькийПапаша @  26.7.2010,  20:01 Найти цитируемый пост)
вот ссылка.

По ссылке все еще интереснее нежели Вы показали, ведь там предикат prd.model = prd.model находится за скобками подзапроса smile
Код

SELECT DISTINCT maker
FROM Product prd
WHERE model IN
(
SELECT model
FROM PC
WHERE speed>=450
)
and prd.model = prd.model

Цитата(ДобренькийПапаша @  26.7.2010,  20:01 Найти цитируемый пост)
Местный гуру сказал, цитирую: "Такой предикат не ускоряет запрос, а изменяет стоимость плана."

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

Я провел такой эксперимент:

В окне анализатора плана я ввел
Код

select * from product where model=model

получил cost:0.0033370000310242
EstimateRows: 5
аналогичный ему запрос
Код

select * from product where model is not null

получил cost:0.0033370000310242
EstimateRows: 50

Чем обусловлена такая разница? Я полагаю тем, что оптимизатор не нашел ресурса оптимизиации предиката model=model(что он эквивалентен model is not null) и оценил его так же как оценивал бы model=:some_val. Очевидно оптимизатор владеет какойто информацией об  содержимом столбца model и считает что селективность этого предиката будет 0,1

теперь смотрим на ожидания по предикату pс.speed>=450 EstimateRows: 15.23076915741

Чтоже получается?
Получается что добавив этот предикат мы запутали оптимизатор и он решил что мы будем объединять не 15*50 строк, а 5*15. Естественно, что  для такого объединения будет рассчитана меньшая стоимость. 

Самое же интересное в этом случае, с моей точки зрения, то, что обманув оптимизатор, заставив его выдать некошерный план, мы еще и добились его улучшения. Почему оптимизатор выбирает изначально не верный план - не знаю/*и действительно ли он неверный*/. В обоих случаях лидирующим в  nested loops был выбран тот  набор, который имеет меньше строк. В первом случае это сделало невозможным выполнение semi join, и сделало необходимым введение дополнительной аггрегации для обеспечения distinct. Однако, т.к. в ведомом наборе у нас производится полное сканирование а не доступ по индексу, по идее смена лидирующей таблицы не должна бы влиять на стоимость запроса. Какая разница 15*50 или же 50*15? Получается либо у нас тут разночтения с оптимизатором и он действительно небезосновательно думает что не все равно какой набор данным будет тут лидирущим, даже не смотря на оверхед надстроенный сверзу- тогда я не прав. Либо же оптимизатор просто тупо ставит лидирущим набором тот, где меньше строк.

Это сообщение отредактировал(а) Zloxa - 27.7.2010, 12:50


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0595 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.