Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.03.31;
Скачать: [xml.tar.bz2];

Вниз

дольше ли будет запрос(MSSQL)?   Найти похожие ветки 

 
O'ShinW   (2012-12-04 09:59) [0]

Есть таблица, SECOND (очень большая, тестовые прогоны не рекомендуются)
где есть столбец SECOND.FK_FIRST

Если писать запрос так
where
SECOND.ID in (1,2,3,4545,4546542,464346,634634,903867,145..)

или
добавить join FIRST on FIRST.ID = SECOND.FK_FIRST
where
FIRST.NAME like "%нечто общее%"

теоретически, намного дольше будет?
Просто меня бесит стиль "in (1,2,3,4545," - ничего не понятно.
а ".NAME like "%нечто общее%"" - очевидно сразу..

Однако, запрос нужно выполнить как можно быстрее
(ну, +- 5 минут, ерунда, т.к. более часа работает)


 
sniknik ©   (2012-12-04 10:05) [1]

> теоретически, намного дольше будет?
чем меньше данных тем меньше разница по времени от этих "стилей", на достаточно большой, например миллион может различаться на минуты. и .т.д.
от первого, индексного поиска время будет примерно одинаковое (при одинаковом количестве искомых), а от второго "общего" будет расти до бесконечности.


 
Игорь Шевченко ©   (2012-12-04 10:06) [2]


> Просто меня бесит стиль


Выпей валерьянки и открой для себя EXPLAIN PLAN


 
Ваще имя   (2012-12-04 10:07) [3]

LIKE это очевидно сразу что full scan
Надо FIRST.NAME IN ("Вася Пупкин", "Петя Дупкин", ...) :-)


 
O'ShinW   (2012-12-04 10:32) [4]


> EXPLAIN PLAN

показывает примерно равные суммарные затраты


> например миллион может различаться на минуты.

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

зы
проверю
сегодня в ночь
сравню с предыдущими днями


 
O'ShinW ©   (2012-12-04 10:41) [5]

Удалено модератором
Примечание: Флудить завязывай


 
MsGuns ©   (2012-12-04 13:06) [6]

Подобные "вариантные" запросы предпочтительно реализовывать в два шага: а) создание временной таблицы и заполнение ее значениями образцов, б) выборка из основной таблицы с джоином ее с этой временной.


 
sniknik ©   (2012-12-04 13:37) [7]

> ну, минуты - несущественно
т.е. пока до часу..nnn,  не дорастет, т.е. пока "петух не клюнет" то "свои капризы ближе к телу"?


 
наивный Талейран   (2012-12-04 13:55) [8]


> O"ShinW   (04.12.12 09:59)  


> FIRST.NAME like

а сколько здесь записей?


 
O'ShinW ©   (2012-12-04 14:01) [9]


> sniknik ©   (04.12.12 13:37) [7]

да, получается..
дорастет, посмотрим

Зато
1 следующий за мной будет разбирать, и сразу поймет, что  выборка по XX
2 при новом XX не надо вспоминать про job
3 Пусть следующий почувствует себя умным, когда перечислит и отрапортует что ускорил :)


> > FIRST.NAME like
>
> а сколько здесь записей?

в пределах 50


 
O'ShinW ©   (2012-12-04 14:14) [10]


> 1 следующий за мной будет разбирать, и сразу поймет, что
>  выборка по XX

вообще-то, комментарий :)
ну да, или так


 
O'ShinW ©   (2012-12-04 14:15) [11]


> 2 при новом XX не надо вспоминать про job

палка о двух концах, в общем случае..
но в моем, пожалуй, второй конец не страшен


 
наивный Талейран   (2012-12-04 16:33) [12]


>  O"ShinW ©   (04.12.12 14:01) [9]
> в пределах 50

тогда я не вижу разницы между запросами


 
O'ShinW ©   (2012-12-04 16:36) [13]

Сегодня посмотрим.
Так-то да, должно примерно одинаково быть.


 
sniknik ©   (2012-12-04 16:42) [14]

> в пределах 50
50 это в чем ищут, или то, что запрос найдет?


 
наивный Талейран   (2012-12-04 16:46) [15]


> 50 это в чем ищут, или то, что запрос найдет?

это где ищут

> join FIRST on FIRST.ID = SECOND.FK_FIRST
> where
> FIRST.NAME like "%нечто общее%"


 
sniknik ©   (2012-12-04 16:54) [16]

> это где ищут
тогда вообще в чем вопрос?
но вообще чего то так не кажется, судя по номерам id(автоинкремент?) в вопросе + [4] -
> ну да, я тоже думаю, что минуты
> и примерно так и есть, около миллиона записей

ИМХО, вы друг друга не поняли.


 
наивный Талейран   (2012-12-04 16:58) [17]


> sniknik ©   (04.12.12 16:54) [16]
>
> > это где ищут

дальше у меня было написано что ищут.

есть условие:
SECOND.ID in (1,2,3,4545,4546542,464346,634634,903867,145..)

и есть альтернативное:

> join FIRST on FIRST.ID = SECOND.FK_FIRST
> where
> FIRST.NAME like "%нечто общее%"


в FIRST - 50 записей.


 
sniknik ©   (2012-12-04 17:03) [18]

в 50 записях пофигу как искать.


 
O'ShinW ©   (2012-12-04 17:18) [19]


> в FIRST - 50 записей.

да


> в 50 записях пофигу как искать.

хорошо :)


 
Кука съела ник   (2012-12-04 20:56) [20]

Любой запрос к объединению по теории выполняется дольше, чем запрос к одной таблице при прочих равных.


 
Аббат Пиккола   (2012-12-04 22:49) [21]

А нет альтернативного такого пути:

where ... in (select ... from ... where ... like ...)

?

Некоррелированный подзапрос выполнится первым и единожды.


 
O'ShinW ©   (2012-12-05 09:31) [22]

все нормально, примерно столько же времени заняло.
На 3 мин дольше, но каждый день такое шатание +- было и у исходного запроса.


> Любой запрос к объединению по теории выполняется дольше

дык, почему и спросил :)


> where ... in (select ... from ... where ... like ...)

этот стиль тоже бесит :)


 
Inovet ©   (2012-12-05 09:58) [23]

> [22] O"ShinW ©   (05.12.12 09:31)
> > where ... in (select ... from ... where ... like ...)
>
> этот стиль тоже бесит :)

Этот-то чем бесит?


 
O'ShinW ©   (2012-12-05 10:02) [24]


> Этот-то чем бесит?

не укладыванием в принцип:
набор данных формируется соединениями во from
в where только фильтрация

понятно, что сложно так сделать, (бывает, что не возможно), но когда можно - надо делать так. Имхо.


 
Дмитрий С ©   (2012-12-05 10:11) [25]


> бывает, что не возможно

Да ладно.

Все что можно сделать с помощью where ... in (select ... from ... where ... like ...)  можно сделать с помощью join-ов.

Как по мне - чем больше ты оставишь пространства MSSQL для оптимизации - тем скорее он выполнит запрос.

Но я думаю что и без того твой запрос можно ускорить, избежав LIKE "%


 
O'ShinW ©   (2012-12-05 10:39) [26]


> Все что можно сделать с помощью where ... in (select ...
>  from ... where ... like ...)  можно сделать с помощью join-
> ов.

а кто спорил?

фраза
> бывает, что не возможно
относится к общему случаю.
Например ,к транзитивному замыканию, которое не реализуется через join


 
Дмитрий С ©   (2012-12-05 10:51) [27]


> Например ,к транзитивному замыканию, которое не реализуется
> через join

Почему так категорично? Например, в дереве реализуется. Только причем там join?


 
O'ShinW ©   (2012-12-05 11:09) [28]


> Дмитрий С ©   (05.12.12 10:51) [27]

не знаю что под этим подразумевается, я через connect ..prior в oracle делал. В mssql писал функцию.


> Только причем там join?

я сказал, что не все можно выразить через реляцию
Ты сказал, что мой пример - можно
Я сказал, что говорил про общий случай и пример привел общего случая, где join не поможет.


 
Inovet ©   (2012-12-05 11:42) [29]

> [28] O"ShinW ©   (05.12.12 11:09)
> пример привел общего случая, где join не поможет.

А если саму с собой связать? Id и ParentId.


 
наивный Талейран   (2012-12-05 12:13) [30]


> Кука съела ник   (04.12.12 20:56) [20]
>
> Любой запрос к объединению

там только синтаксически объединение


 
Дмитрий С ©   (2012-12-05 12:26) [31]


> не знаю что под этим подразумевается

А в чем задача заключалась? Любопытно, что ты понимаешь под словосочетанием "транзитивное замыкание".


 
O'ShinW ©   (2012-12-05 12:38) [32]


> А если саму с собой связать? Id и ParentId.

+

> А в чем задача заключалась? Любопытно, что ты понимаешь
> под словосочетанием "транзитивное замыкание".

Это была другая задача.
Не имеет отношения к вопросу.
словосочетание приведено (уже жалею, что приведено:)) для примера

зы
В той задаче (не имеющей отношения к теме) -, да,  я там ввел Id и ParentId. Две таблицы, в mssql и в Oracle (копия из mssql)
В mssql писал функцию
в Oracle connect by prior
Потому что невозможно заранее предусмотреть кол-во join самой с собой

ps2
Я вот не пойму ,это троллинг пошел ?


 
Inovet ©   (2012-12-05 12:49) [33]

> [32] O"ShinW ©   (05.12.12 12:38)
> Я вот не пойму ,это троллинг пошел ?

Имхо, оффтоп.


 
Аббат Пиккола   (2012-12-05 13:31) [34]

O"ShinW ©   (05.12.12 10:02) [24]

набор данных формируется соединениями во from
в where только фильтрация


Мне кажется, это какое-то вредное предубеждение. Приобретая сервер, Вы приобретаете в том числе и функциональность, допускающую обработку подзапросов. Если Вы принципиално не желаете ею пользоваться, значит Вы переплатили за сервер.

По мне так любой запрос (с самым дебильным текстом), работающий хотя бы на 10% быстрее прочих, уже рассматривается как возможно наилучший. Разумеется, запрос, содержащий явное перечисление в IN (111,1212,1231,...) просто опасен. Но не дебильностью текста (текст - очевидно дебильный, если в перечислении куча членов),  а тем, что при числе членов в несколько десятков тысяч текст может превысить допустимую длину (у меня такое случалось) и запрос просто провалится.

Что же касается "бесит"... Все зависит от степени эгоизма повара.
Допустим я пришел в кафе. И заказал  кофе эспрессо (по-быстрому  -очень спешу). Вряд ли я буду в восторге, если официант заставит меня ждать лишних 5 минут только потому что повара "бесит" подавать кофе в неподогретой по всем правилам чашке.


 
наивный Талейран   (2012-12-05 13:36) [35]


> что при числе членов в несколько десятков тысяч текст может
> превысить допустимую длину (у меня такое случалось)

не иначе, диавол руку приложил


 
знайка   (2012-12-05 13:40) [36]


> Но не дебильностью текста (текст - очевидно дебильный, если
> в перечислении куча членов),  а тем, что при числе членов
> в несколько десятков тысяч текст может превысить допустимую
> длину (у меня такое случалось) и запрос просто провалится.
"Вы переплатили за сервер".


 
Аббат Пиккола   (2012-12-05 13:42) [37]

наивный Талейран   (05.12.12 13:36) [35]

> что при числе членов в несколько десятков тысяч текст может
> превысить допустимую длину (у меня такое случалось)

не иначе, диавол руку приложил


Если текст запроса генерируется автоматически то и с Божьей помощью он может вырасти до большой длины. :)


 
O'ShinW ©   (2012-12-05 13:45) [38]


> не иначе, диавол руку приложил

не-не, бывает.
Может, как-то настраивается, но по дефолту, вроде 1 000.

зы
но не в этом случае,
тут перечисление не самих записей, а их групп
vs
предлагается выборку по общему слову в именах этих групп


 
наивный Талейран   (2012-12-05 13:46) [39]


> Если текст запроса генерируется автоматически

благими намерениями известно куда дорога выложена


 
Аббат Пиккола   (2012-12-05 13:49) [40]

Допустим у меня есть сетка с множественным выбором. Пользователь может отметить строки, которые ему нравятся. Я просто фантазирую. И допустим я ничего не знаю о том, что текст SQL-запроса имеет реальные ограничения на длину. И вовсе не 4 гигабайт, как некоторые могут подумать. А гораздо меньше. И я, не долго думая, хочу запомнить отмеченные пользователем строки в виде перечисления их ID и применить в каком-то SQL-запросе. Ничего не зная о подобных ограничениях, так как о них мало где пишут. Пользователь же зачем-то решил для построения своего отчета (который он просил для "выбранных нескольких строк") отметить все записи в сетке, сняв все прочие фильтрации, а их там были десятки тысяч...

Ну например.



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2013.03.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.005 c
15-1354653003
Юрий
2012-12-05 00:30
2013.03.31
С днем рождения ! 5 декабря 2012 среда


15-1354739404
Юрий
2012-12-06 00:30
2013.03.31
С днем рождения ! 6 декабря 2012 четверг


15-1354614958
boriskb
2012-12-04 13:55
2013.03.31
Реклама


2-1348575201
ankazh
2012-09-25 16:13
2013.03.31
Раскладка клавиатуры


15-1355072167
Игорь Шевченко
2012-12-09 20:56
2013.03.31
Занимательная ошибка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский