Последние комментарии

Для меня эта страница - это удобный способ смотреть, что нового происходит в комментариях и сразу находить заметку, не заходя в админку. Думаю, она будет полезна и тебе.


Серж

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


Алекс

Как бы дико не звучало. В Россию хочу в отпуск приехать. А так на выходных можно смотаться на море) относительно не дорого. Привет из Солнечного Королевства Камбоджа.


Михаил Фленов

Предпоследний комментарий:
На 99% уверен, что where дважды и один раз снаружи будут выполняться одинаково сервером. По любому серверу придется бежать по обеим таблицам отдельно, а потом объединять результат.

Последний комментарий:
На 99% уверен, что разницы не будет. По любому серверу придется искать данные в t1 по фильтру, а потом пристыковывать результат от t2, а каким образом будет стыковка - loop, merge или hash будет зависеть от статистики. а не от того, как ты написал запрос. Хотя бывают случаи, сервер некорректно прочитает твой запрос, ступит и падает в банальный loop, как в самый надежный, но не всегда производительный. Пиши как в первом случае, чем проще напишешь, тем больше шансов, что SQL сервер правильно поймет, какой тебе результат нужен


Александр Р.

Я хотел спросить. Допустим, есть 2 больших таблицы
select t1.*, t2.*
from t1
inner join t2 on t1.id = t2.id
where t1.date between 10.06.2020 and 12.06.2020
есть ли смысл фильтровать до join:
select t1.*, t2.*
from (select * from t1 where t1.date between 10.06.2020 and 12.06.2020) t1
inner join t2 on t1.id = t2.id
в MS SQL?


Александр Р.

В моем коде top 20 можно сделать так:
select top 20 *
from (
    select title, content, date from Posts
    where Title like '%sdfg%'
    union
    select title, content, date from Stories
    where Title like '%sdfg%'
) r
order by date
но если MS SQL умеет оптимизировать твой запрос, то твой запрос проще выглядит.


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

Михаил Фленов

С точки зрения оптимизации в данном случае результат будет один и тот же, по крайней мере SQL сервер прекрасно увидит, что идея одинакова. А вот если нужно показать 20 записей и отсортировать по времени, то результат будет разный. В твоем случае будет показаны 20 записей из Posts, а в моем будет микс, если отсорировать по Date:

select top 20 *
from (
    select title, content, date from Posts
    union
    select title, content, date from Stories
) r
where r.Title like '%sdfg%'
order by date


Александр Р.

r.Title заменил на просто Title: select title, content, date from Posts where Title like '%sdfg%' union select title, content, date from Stories where Title like '%sdfg%'. Может, базе легче будет сначала отфильтровать и объединить маленькие результаты, чем объединить большие результаты, а потом отфильтровать.


Александр Р.

Наверное, более оптимизировано будет select title, content, date from Posts where r.Title like '%sdfg%' union select title, content, date from Stories where r.Title like '%sdfg%'


Михаил Фленов

Ну у меня обычно только одна таблица, с постами. Если у тебя их несколько, то можно привести сначала в единый формат, а потом искать по нему, что-то типа такого:

select *
from (
    select title, content, date from Posts
    union
    select title, content, date from Stories
) r
where r.Title like '%sdfg%'

С точки зрения производительности в принципе должно быть терпимо, если у тебя не миллиарды записей в каждой из таблиц


О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне