Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Возможно ли обойтись 1 запросом вместо 2-х?  [new]
Amateur7
Member

Откуда:
Сообщений: 266
Добрый вечер.
Для постраничного вывода приходится выполнять 2 запроса:

1)
$find_row='Тест';

SELECT 
*
 FROM Table p 
left join Firm f on f.id_firm = p.id_firm
left join City city on city.id_city = p.id_city
left join Country pc on pc.id_country = p.id_country
WHERE p.id_city=$id_city $find_row


2)
if($page>2){$entersqladd="id_price NOT IN (SELECT TOP $numnext id_price FROM Price p WHERE id_city=$id_city $find_row ) 
AND ";}else{$entersqladd="";}


SELECT TOP $num 
*
 FROM Table p 
left join Firm f on f.id_firm = p.id_firm
left join City city on city.id_city = p.id_city
left join Country pc on pc.id_country = p.id_country
WHERE $entersqladd p.id_city=$id_city $find_row


1-й запрос используется для получения количества всех записей
2-й запрос собственно формирует постраничный вывод

Возможно ли обойтись одним запросом?
P.S.: база большая, и иногда получаю 500 ошибку...
P.P.S.: наткнулся на сталью что запрос выполнялся дольше на 96% по сравнению с аналогичным без TOP, не знаю правда или нет, но поиск реально затягивается...
14 янв 13, 00:39    [13763965]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли обойтись 1 запросом вместо 2-х?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37057
https://www.sql.ru/faq/faq_topic.aspx?fid=105
14 янв 13, 01:37    [13764136]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли обойтись 1 запросом вместо 2-х?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Amateur7
id_price NOT IN (SELECT TOP $numnext id_price FROM Price p WHERE id_city=$id_city $find_row ) 

В подобных случаях нельзя использовать конструкцию SELECT TOP без ORDER BY. Т.к. никто не гарантирует, что на одних и тех же данных запрос будет возвращать одинаковые результаты

Amateur7
1-й запрос используется для получения количества всех записей

Количество обычно подсчитывают через SELECT COUNT(*). Или у вас как-то используется результат вашего SELECT *, помимо этого?

Вообще, ваш первый запрос упрощается до такого:
SELECT COUNT(*)
FROM Table p 
WHERE p.id_city=$id_city


Amateur7
наткнулся на сталью что запрос выполнялся дольше на 96% по сравнению с аналогичным без TOP, не знаю правда или нет

Да запросто. Запросы с TOP и без оного — разные, у них могут быть разные планы выполнения, они могут совершать количество дисковых чтений, отличающееся на порядки, и т.д. У меня были примеры, что запрос с TOP 1 выполнялся несколько миллисекунд, а без TOP 1 — около часа.
14 янв 13, 12:47    [13765948]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли обойтись 1 запросом вместо 2-х?  [new]
Amateur7
Member

Откуда:
Сообщений: 266
Гавриленко Сергей Алексеевич
https://www.sql.ru/faq/faq_topic.aspx?fid=105



а какой способ самый быстрый если в таблице более 300 000 записей?
P.S.: добавить или изменить существующие индексы нельзя, вывод при помощи sqlsrv_query()...
15 янв 13, 13:24    [13771764]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли обойтись 1 запросом вместо 2-х?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Amateur7
а какой способ самый быстрый если в таблице более 300 000 записей?

Кто/что мешает протестировать и выбрать?
15 янв 13, 13:33    [13771855]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли обойтись 1 запросом вместо 2-х?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
вот тут было сделано сравнение Постраничная выборка в Microsoft SQL Server
или тут Постраничная (пакетная, paging) выборка в MS SQL Server
а вот и для 2012 Постраничная (пакетная, paging) выборка в MS SQL Server 2012
но лучше проверить самому для Ваших данных
15 янв 13, 13:43    [13771951]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли обойтись 1 запросом вместо 2-х?  [new]
Amateur7
Member

Откуда:
Сообщений: 266
Гость333
Amateur7
а какой способ самый быстрый если в таблице более 300 000 записей?

Кто/что мешает протестировать и выбрать?


время)
15 янв 13, 16:25    [13773294]     Ответить | Цитировать Сообщить модератору
 Re: Возможно ли обойтись 1 запросом вместо 2-х?  [new]
Amateur7
Member

Откуда:
Сообщений: 266
HandKot
вот тут было сделано сравнение Постраничная выборка в Microsoft SQL Server
или тут Постраничная (пакетная, paging) выборка в MS SQL Server
а вот и для 2012 Постраничная (пакетная, paging) выборка в MS SQL Server 2012
но лучше проверить самому для Ваших данных


спасибо)
15 янв 13, 16:29    [13773322]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить