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

Откуда: Смоленск
Сообщений: 303
Переделал чужой запрос под свои нужды (в меру своей сообразительности)..
Запрос работает с SQLной базой 1С. Помечает на удаление документы в журнале, и удаляет их проводки. Все работает как надо, гораздо быстрее, чем штатное удаление документов, но всетаки достаточно долго..
Подскажите, как можно оптимизировать запрос, если это возможно.
USE tdf08
Go
CREATE TABLE ##ID
(IDDOC char(9) primary key clustered)
Go
INSERT INTO ##ID
SELECT DISTINCT IDDOC
FROM _1SJOURN
WHERE (DATE_TIME_IDDOC < '20081231')
Go
EXEC ('Delete from _1SENTRY with (tablock) where DOCID IN (Select IDDOC FROM ##ID)')
DROP TABLE ##ID
Go
update _1SJOURN
set ISMARK = 1
from _1SJOURN
where (DATE_TIME_IDDOC < '20081231')
8 июн 09, 14:33    [7276666]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизировать запрос?  [new]
iljy
Guest
версия sql какая? для 2005 напрашивается примерно такая модификация:
declare @t table (IDDOC char(9) primary key clustered)

update _1SJOURN
set ISMARK = 1
output inserted.IDDOC into @t
where DATE_TIME_IDDOC < '20081231'

дабы 2 раза не выбирать идентификаторы.
для дальнейшей оптимизации - давайте индексы, планы выполнения и т.д.
8 июн 09, 16:10    [7277309]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизировать запрос?  [new]
bot67
Member

Откуда: Смоленск
Сообщений: 303
iljy,

у нас sql2000.
там пройдет такая конструкция?
У вас получается что после выполнения update параллельно появляется таблица @t такаяже как у меня ##ID ? Я правильно понял?
8 июн 09, 16:24    [7277403]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизировать запрос?  [new]
iljy
Guest
bot67
iljy,

у нас sql2000.
там пройдет такая конструкция?
У вас получается что после выполнения update параллельно появляется таблица @t такаяже как у меня ##ID ? Я правильно понял?

поняли правильно, но на 2000 такой конструкции нет. увы.
соответственно надо смотреть индексы и планы, возможно последний update тоже будет быстрее по временной таблице. а еще просветите пожалуйста - зачем у вас delete execом вызывается? он же статичесикй вроде бы...
8 июн 09, 16:32    [7277470]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизировать запрос?  [new]
bot67
Member

Откуда: Смоленск
Сообщений: 303
iljy,

Я переделывал другой похожий запрос, там был exec и я оставил так как было, т.к. в SQLe не силён...
Но тут ещё почесал репу и родилось такое:
Delete from _1SENTRY 
with (tablock) 
where DOCID IN (SELECT IDDOC FROM _1SJOURN WHERE (DATE_TIME_IDDOC < '20081231'))
Go
update _1SJOURN
set ISMARK = 1
from _1SJOURN
where (DATE_TIME_IDDOC < '20081231')
Запустил, жду результат.. Вложеный запрос быстрее будет, чем первый мой вариант?
8 июн 09, 16:46    [7277549]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизировать запрос?  [new]
iljy
Guest
bot67
Но тут ещё почесал репу и родилось такое:
Delete from _1SENTRY 
with (tablock) 
where DOCID IN (SELECT IDDOC FROM _1SJOURN WHERE (DATE_TIME_IDDOC < '20081231'))
Go
update _1SJOURN
set ISMARK = 1
from _1SJOURN
where (DATE_TIME_IDDOC < '20081231')
Запустил, жду результат.. Вложеный запрос быстрее будет, чем первый мой вариант?

очень филосовский вопрос. могу в свободное время погадать. в третий раз повторяю - надо смотреть планы и индексы
8 июн 09, 16:53    [7277579]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизировать запрос?  [new]
bot67
Member

Откуда: Смоленск
Сообщений: 303
iljy,

Планы и индексы смотреть, наверное, ещё рано т.к. не знаю что там смотреть....
Спасибо, что откликнулись :) Буду букварь читать...
8 июн 09, 17:04    [7277647]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизировать запрос?  [new]
Алексей Дружинин
Member

Откуда: Москва
Сообщений: 11
Блог
Добрый день! Я бы такой вариант предложил.

USE tdf08
Go
DECLARE @ID TABLE (
	IDDOC char(9) primary key
)


BEGIN TRANSACTION

INSERT INTO @ID(IDDOC)
SELECT IDDOC
FROM _1SJOURN
WHERE (DATE_TIME_IDDOC < '20081231')
GROUP BY IDDOC

DELETE FROM E
FROM @ID I
INNER JOIN _1SENTRY E ON
	E.DOCID = I.DOCID

UPDATE J
SET ISMARK = 1
FROM @ID I
INNER JOIN _1SJOURN J ON
	J.IDDOC = I.IDDOC

COMMIT TRANSACTION
GO
9 июн 09, 17:32    [7282394]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизировать запрос?  [new]
alx111
Member

Откуда:
Сообщений: 92
1. Создать новую таблицу _1SENTRY_2 с аналогичной структурой и скопировать в нее данные > '20083112', а _1SENTRY удалить.
2. В _1SENTRY есть поле DATE_TIME_DOCID оно = _1SJOURN.DATE_TIME_IDDOC, и по нему есть индекс, так что временной таблицы не нужно создавать.
10 июн 09, 08:06    [7283811]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизировать запрос?  [new]
bot67
Member

Откуда: Смоленск
Сообщений: 303
alx111
2. В _1SENTRY есть поле DATE_TIME_DOCID оно = _1SJOURN.DATE_TIME_IDDOC, и по нему есть индекс, так что временной таблицы не нужно создавать.

блин, слона-то я и не приметил....
В итоге всё, как обычно, оказалось намного прще...
USE tdf08
BEGIN TRANSACTION

Delete from _1SENTRY 
WHERE (DATE_TIME_IDDOC < '20081231'))

update _1SJOURN
set ISMARK = 1
from _1SJOURN
where (DATE_TIME_IDDOC < '20081231')

COMMIT TRANSACTION
Проще уже наверное не получится.....
Спасибо всем огромное!
10 июн 09, 14:04    [7285710]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизировать запрос?  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1050
bot67,

Для полной красоты я бы предложил следующее:
update _1SJOURN
set ISMARK = 1, CLOSED=CLOSED&0xFFFE
from _1SJOURN
where (DATE_TIME_IDDOC < '20081231')
10 июн 09, 16:52    [7286763]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизировать запрос?  [new]
efdm
Member

Откуда: Москва
Сообщений: 310
VladimirKr,

я в чем сакральный смысл CLOSED&0xFFFE?
что за секретная константа?
11 июн 09, 12:16    [7289497]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить