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

Откуда:
Сообщений: 21
Добрый день, всем.

Помогите изменить запрос на более быстрый

SELECT MAX(QUATE_BID) AS MAX_VALUE, MIN(QUATE_BID) AS MIN_VALUE,
(SELECT TOP 1 QUATE_BID
FROM TBL_QUOTES
WHERE DATE_INSERT >= '11/05/2009' AND DATE_INSERT < '11/06/2009' AND QUOTE_CODE_ID = 99
ORDER BY PK_QUOTES_ID DESC) AS LAST_VAL,
(SELECT TOP 1 QUATE_BID
FROM TBL_QUOTES
WHERE DATE_INSERT >= '11/05/2009' AND DATE_INSERT < '11/06/2009' AND QUOTE_CODE_ID = 99
ORDER BY PK_QUOTES_ID ASC) AS FIRST_VAL
FROM dbo.TBL_QUOTES MM
WHERE (DATE_INSERT >= '11/05/2009') AND (DATE_INSERT < '11/06/2009') AND (QUOTE_CODE_ID = 99)

Большое спасибо
23 ноя 09, 15:17    [7965017]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать более быстрый запрос  [new]
an0nym
Member

Откуда:
Сообщений: 7076
Игорь Чернов
Добрый день, всем.

Помогите изменить запрос на более быстрый

SELECT MAX(QUATE_BID) AS MAX_VALUE, MIN(QUATE_BID) AS MIN_VALUE,
(SELECT TOP 1 QUATE_BID
FROM TBL_QUOTES
WHERE DATE_INSERT >= '11/05/2009' AND DATE_INSERT < '11/06/2009' AND QUOTE_CODE_ID = 99
ORDER BY PK_QUOTES_ID DESC) AS LAST_VAL,
(SELECT TOP 1 QUATE_BID
FROM TBL_QUOTES
WHERE DATE_INSERT >= '11/05/2009' AND DATE_INSERT < '11/06/2009' AND QUOTE_CODE_ID = 99
ORDER BY PK_QUOTES_ID ASC) AS FIRST_VAL
FROM dbo.TBL_QUOTES MM
WHERE (DATE_INSERT >= '11/05/2009') AND (DATE_INSERT < '11/06/2009') AND (QUOTE_CODE_ID = 99)

Большое спасибо

WITH slice AS(
	SELECT PK_QUOTES_ID, QUATE_BID FROM TBL_QUOTES WHERE DATE_INSERT >= '11/05/2009' AND DATE_INSERT < '11/06/2009' AND QUOTE_CODE_ID = 99
) 
SELECT MAX(QUATE_BID) MAX_VALUE, 
	MIN(QUATE_BID) MIN_VALUE, 
	(SELECT TOP 1 QUATE_BID FROM slice ORDER BY PK_QUOTES_ID DESC) LAST_VAL, 
	(SELECT TOP 1 QUATE_BID FROM slice ORDER BY PK_QUOTES_ID ASC) FIRST_VAL 
FROM slice
23 ноя 09, 15:35    [7965210]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать более быстрый запрос  [new]
iljy
Member

Откуда:
Сообщений: 8711
Игорь Чернов,

какие индексы есть на таблице? Хотя при условии
автор

DATE_INSERT >= '11/05/2009' AND DATE_INSERT < '11/06/2009' AND QUOTE_CODE_ID = 99

все равно будет сканирование, так что быстрее может оказаться так:
WITH slice AS(
       SELECT PK_QUOTES_ID, QUATE_BID, ROW_NUMBER() OVER(ORDER BY PK_QUOTES_ID) N,
                    COUNT(*) OVER() N_MAX
       FROM TBL_QUOTES WHERE DATE_INSERT >= '11/05/2009' AND DATE_INSERT < '11/06/2009' AND QUOTE_CODE_ID = 99
) 
SELECT MAX(QUATE_BID) MAX_VALUE, 
	MIN(QUATE_BID) MIN_VALUE, 
	MAX(CASE N WHEN MAX_N THEN QUATE_BID END) LAST_VAL, 
	MAX(CASE N WHEN 1 THEN QUATE_BID END) FIRST_VAL 
FROM slice

индекс при этом нужен (QUOTE_CODE_ID, PK_QUOTES_ID) INCLUDE(QUATE_BID,DATE_INSERT), хотя возможны варианты.
23 ноя 09, 15:51    [7965368]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать более быстрый запрос  [new]
Игорь Чернов
Member

Откуда:
Сообщений: 21
SQL Server 2000 ругается на эти запросы
23 ноя 09, 15:56    [7965414]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать более быстрый запрос  [new]
iljy
Member

Откуда:
Сообщений: 8711
Игорь Чернов
SQL Server 2000 ругается на эти запросы

а это потому. что надо версию сервера уточнять
SELECT MAX(QUATE_BID) MAX_VALUE, 
	MIN(QUATE_BID) MIN_VALUE, 
	(SELECT TOP 1 QUATE_BID FROM slice ORDER BY PK_QUOTES_ID DESC) LAST_VAL, 
	(SELECT TOP 1 QUATE_BID FROM slice ORDER BY PK_QUOTES_ID ASC) FIRST_VAL 
FROM 
(
     SELECT PK_QUOTES_ID, QUATE_BID FROM TBL_QUOTES
     WHERE DATE_INSERT >= '20090511' AND DATE_INSERT < '20090611' AND QUOTE_CODE_ID = 99
) slice
23 ноя 09, 15:58    [7965435]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать более быстрый запрос  [new]
iljy
Member

Откуда:
Сообщений: 8711
Игорь Чернов,

не, это я наврал. Вот так вот попробуйте
declare @maxpk int, @minpk int

select @maxpk = MAX(PK_QOUTES_ID), @minpk = MIN(PK_QOUTES_ID)
FROM TBL_QUOTES
WHERE DATE_INSERT >= '11/05/2009' AND DATE_INSERT < '11/06/2009' AND QUOTE_CODE_ID = 99

SELECT MAX(QUATE_BID) AS MAX_VALUE, MIN(QUATE_BID) AS MIN_VALUE,
	   MAX(CASE PK_QUOTES_ID WHEN @maxpk then QUOTE_BID end) AS LAST_VAL,
	   MAX(CASE PK_QUOTES_ID WHEN @minpk then QUOTE_BID end) AS FIRST_VAL
FROM dbo.TBL_QUOTES MM
WHERE (DATE_INSERT >= '11/05/2009') AND (DATE_INSERT < '11/06/2009') AND (QUOTE_CODE_ID = 99)
23 ноя 09, 16:04    [7965506]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать более быстрый запрос  [new]
Игорь Чернов
Member

Откуда:
Сообщений: 21
Все равно ругается
Invalid object name 'slice'
23 ноя 09, 16:05    [7965515]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать более быстрый запрос  [new]
iljy
Member

Откуда:
Сообщений: 8711
Игорь Чернов,

я уже это исправил. Можно попробовать еще вот такой вот изврат
declare @maxpk int, @minpk int, @firstval int, @lastval int,
	@maxval int, @minval int

SELECT @maxval = case @maxval > QUATE_BID then @maxval else QUATE_BID,
	   @minval = case @minval < QUATE_BID then @minval else QUATE_BID,
	   @maxpk = case @maxpk > PK_QOUTES_ID then @maxpk else PK_QOUTES_ID,
	   @lastval = case @maxpk > PK_QOUTES_ID then @lastval else QUATE_BID,
	   @minpk = case @minpk < PK_QOUTES_ID then @minpk else PK_QOUTES_ID,
	   @firstval = case @minpk < PK_QOUTES_ID then @firstval else QUATE_BID
FROM dbo.TBL_QUOTES MM
WHERE (DATE_INSERT >= '11/05/2009') AND (DATE_INSERT < '11/06/2009') AND (QUOTE_CODE_ID = 99)


select @minval, @maxval, @firstval, @lastval
но это без гарантий, моежт и не сработать.
23 ноя 09, 16:12    [7965596]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать более быстрый запрос  [new]
Игорь Чернов
Member

Откуда:
Сообщений: 21
Спасибо
23 ноя 09, 16:16    [7965640]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать более быстрый запрос  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
имхо стоит попросить сначала у автора хотя бы план запроса, иначе "изменить запрос на более быстрый" ни о чём.
--------------------------------------------------------------
Дьявол кроется в деталях.
23 ноя 09, 16:32    [7965805]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить