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

Откуда: Екатеринбург
Сообщений: 307
Доброго времени суток! Запрос выполняется по расписанию каждые 30 минут и все время в top 10 по цп, длительности и io. Подскажите, плз, как мне его оптимизировать?

SELECT COUNT(id_file) FROM  dbo.USR_ParsingXML_distr WHERE id_file IN (SELECT MAX(d.id_file) AS id
FROM  dbo.USR_ParsingXML_distr d
INNER JOIN dbo.USR_ParsingXML_USER u ON d.id_file=u.id_file
GROUP BY d.teg, d.directory, d.nDistr, d.nComp, d.name, d.nCat, d.nTexts, d.n3, d.n4, d.n5, d.n6, d.compliance, 
d.[date], d.[time], d.sysdate, d.docs, d.kind, d.distr_num, d.name_all, d.kod_pr, 
d.distr_vid, u.usr_date, u.usr_time, u.usr_uptime, u.info_cfg_date, u.info_cfg_time,u.info_cod_date, u.info_cod_time,
u.consult_date, u.consult_time, u.usr_kind 
HAVING COUNT(d.id_file) > 1)


На обоих таблицах есть не кластерный индекс по id_file, в плане 93% стоимости на сортировке, сделала сортировку по убыванию (ну раз select Max :)) , не помогло. Что можно предпринять?

Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "USR_ParsingXML_distr". Число просмотров 1, логических чтений 49647, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "USR_ParsingXML_USER". Число просмотров 1, логических чтений 3678, физических чтений 0, упреждающих чтений 34, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
1 авг 13, 18:25    [14650273]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
ElenaLeont, версия сервера какая?
1 авг 13, 18:56    [14650426]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
ElenaLeont, так разве не такая же цифра получится?

SELECT COUNT(d.teg)  AS id
FROM  dbo.USR_ParsingXML_distr d
INNER JOIN dbo.USR_ParsingXML_USER u ON d.id_file=u.id_file
GROUP BY d.teg, d.directory, d.nDistr, d.nComp, d.name, d.nCat, d.nTexts, d.n3, d.n4, d.n5, d.n6, d.compliance, 
d.[date], d.[time], d.sysdate, d.docs, d.kind, d.distr_num, d.name_all, d.kod_pr, 
d.distr_vid, u.usr_date, u.usr_time, u.usr_uptime, u.info_cfg_date, u.info_cfg_time,u.info_cod_date, u.info_cod_time,
u.consult_date, u.consult_time, u.usr_kind 
HAVING COUNT(d.id_file) > 1
1 авг 13, 18:58    [14650436]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
ElenaLeont
Member

Откуда: Екатеринбург
Сообщений: 307
сервер ms sql 2008 r2
1 авг 13, 19:17    [14650524]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
ElenaLeont
Member

Откуда: Екатеринбург
Сообщений: 307
результат предложенного кода работает аналогично с предыдущим долго и также основная стоимость сортировка 93%, я уже так пробовала:(
1 авг 13, 19:23    [14650547]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
ElenaLeont
Member

Откуда: Екатеринбург
Сообщений: 307
не понимаю, что он сортирует?
1 авг 13, 19:32    [14650583]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
Гость333
Member

Откуда:
Сообщений: 3683
ElenaLeont,

Выложите план запроса, посмотрим, что он сортирует. Могу предположить, что после сортировки происходит Stream Aggregate.
1 авг 13, 20:21    [14650674]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
ElenaLeont
Member

Откуда: Екатеринбург
Сообщений: 307
Модератор: План приложите к следующему сообщению в виде файла .sqlplan


Сообщение было отредактировано: 1 авг 13, 20:38
1 авг 13, 20:35    [14650693]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
ElenaLeont
Member

Откуда: Екатеринбург
Сообщений: 307


К сообщению приложен файл (plan.sqlplan - 48Kb) cкачать
1 авг 13, 20:53    [14650720]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
ElenaLeont,

Ну, как и предполагали уже - Sort перед Stream Aggregate. Тут надо не запрос оптимизировать, а модель данных.

Сообщение было отредактировано: 1 авг 13, 21:34
1 авг 13, 21:33    [14650810]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
aleks2
Guest
pkarklin
ElenaLeont,

Ну, как и предполагали уже - Sort перед Stream Aggregate. Тут надо не запрос оптимизировать, а модель данных.


Та ни. Запрос тоже уродский.

1. Вот из
SELECT COUNT(id_file) FROM  
[/SRC]
как бе намекает, что 
[src]GROUP BY d.teg, d.directory, d.nDistr, d.nComp, d.name, d.nCat, d.nTexts, d.n3, d.n4, d.n5, d.n6, d.compliance, 
d.[date], d.[time], d.sysdate, d.docs, d.kind, d.distr_num, d.name_all, d.kod_pr, 
d.distr_vid, u.usr_date, u.usr_time, u.usr_uptime, u.info_cfg_date, u.info_cfg_time,u.info_cod_date, u.info_cod_time,
u.consult_date, u.consult_time, u.usr_kind 

вроде как ни к чему.

Откуда следует, что и
INNER JOIN dbo.USR_ParsingXML_USER u ON d.id_file=u.id_file

не нужон, скорее всего.

2. В случае, если всеж п.1 неверен, а данных "дохера и больше", то
HAVING COUNT(d.id_file) > 1)

и группировку следует заменить на exists(...).
2 авг 13, 07:40    [14651503]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
ElenaLeont
Member

Откуда: Екатеринбург
Сообщений: 307
Добрый день! Возвращаюсь к проблемному запросу

aleks2 не подскажете, как

В случае, если всеж п.1 неверен, а данных "дохера и больше", то
HAVING COUNT(d.id_file) > 1)

и группировку следует заменить на exists(...).
3 авг 13, 11:14    [14657682]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
ElenaLeont
Member

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

SELECT MAX(d.id_file) AS id
FROM  dbo.USR_ParsingXML_distr d
INNER JOIN dbo.USR_ParsingXML_USER u ON d.id_file=u.id_file
GROUP BY d.teg, d.directory, d.nDistr, d.nComp, d.name, d.nCat, d.nTexts, d.n3, d.n4, d.n5, d.n6, d.compliance, 
d.[date], d.[time], d.sysdate, d.docs, d.kind, d.distr_num, d.name_all, d.kod_pr, 
d.distr_vid, u.usr_date, u.usr_time, u.usr_uptime, u.info_cfg_date, u.info_cfg_time,u.info_cod_date, u.info_cod_time,
u.consult_date, u.consult_time, u.usr_kind 
HAVING COUNT(d.id_file) > 1


Далее если
SELECT COUNT(id_file) FROM  dbo.USR_ParsingXML_distr WHERE id_file IN
в приведенном выше куске >0 по циклу запускается delete и после опять пересчет count и так пока count не станет =0
3 авг 13, 11:20    [14657695]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
Glory
Member

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

Откоройте для себя EXCEPT/INTERSECT
И ROW_NUMBER() OVER
3 авг 13, 13:28    [14657900]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
aleks2
Guest
-- надеюсь УНИКАЛЬНЫЙ ИДЕНТИФИКАТОР строки ID в таблицах есть?

-- дубли в USR_ParsingXML_distr
select t.id FROM  dbo.USR_ParsingXML_distr t 
   where exists(select * from dbo.USR_ParsingXML_distr tt 
                  where tt.ID > t.ID
                    and tt.id_file = t.id_file
                    -- перечисляем  ВСЕ поля, по которым проверяем дубль
                    and tt.поле1 = t.поле1
                    and tt.поле2 = t.поле2
                    and ...
                )

-- дубли в USR_ParsingXML_USER
select t.id FROM dbo.USR_ParsingXML_USER t 
   where exists(select * from dbo.dbo.USR_ParsingXML_USER tt 
                  where tt.ID > t.ID
                    and tt.id_file = t.id_file
                    -- перечисляем  ВСЕ поля, по которым проверяем дубль
                    and tt.поле1 = t.поле1
                    and tt.поле2 = t.поле2
                    and ...
                )

-- вот их и надо похерить, а не парить сервер соединением
-- "по всем полям связки таблиц" - не надо иметь семи пядей во лбу, чтоб сообразить: 
-- любой дубль в КАЖДОЙ из  из таблиц порождает дубль в соединении.
-- и наоборот:
-- если дублей в КАЖДОЙ из из таблиц  нет - дубль не может возникнуть при соединении
3 авг 13, 14:18    [14658000]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
ElenaLeont
Member

Откуда: Екатеринбург
Сообщений: 307
aleks2, может конечно я и не догоняю в синтаксисе TSQL, но мне кажется, что предложенный вами код считает не то, что мне надо, в связанных таблицах равенство возможно только по полю id_file, при чем тут

-- перечисляем  ВСЕ поля, по которым проверяем дубль
                    and tt.поле1 = t.поле1
                    and tt.поле2 = t.поле2
                    and ...
3 авг 13, 15:50    [14658230]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
aleks2
Guest
ElenaLeont
aleks2, может конечно я и не догоняю в синтаксисе TSQL, но мне кажется, что предложенный вами код считает не то, что мне надо, в связанных таблицах равенство возможно только по полю id_file, при чем тут

-- перечисляем  ВСЕ поля, по которым проверяем дубль
                    and tt.поле1 = t.поле1
                    and tt.поле2 = t.поле2
                    and ...


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


Разруха не в синтаксисе. Разруха у вас в голове.

ЗЫ. Сочувствую, но помочь ничем не могу.
3 авг 13, 16:00    [14658264]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
ElenaLeont
Member

Откуда: Екатеринбург
Сообщений: 307
а по моему и дураку понятно, что в предложении пропущено лишь "из" между "по всем полям" и "связки таблиц"..........лечите свой бардак в голове....
3 авг 13, 16:05    [14658274]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
aleks2
Guest
ElenaLeont
а по моему и дураку понятно, что в предложении пропущено лишь "из" между "по всем полям" и "связки таблиц"..........лечите свой бардак в голове....


В данном случае, это ничего не меняет ни грамматически, ни семантически.
Канешно, это трудно осознать, но для искорения дублей JOIN не нужен, а для быстродействия - вреден.

Вам не дано это понять.
3 авг 13, 16:18    [14658294]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
ElenaLeont,

Вы давно перешли с Excel на T-SQL? Ваши попытки

автор
Дублями считаются именно одинаковые строки по всем полям связки таблиц


говорят лишь о полном бардаке в данных.

автор
но мне кажется, что предложенный вами код считает не то, что мне надо


Вы мне напоминаете пару "моих" финансовых директоров...
3 авг 13, 18:50    [14658612]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
ElenaLeont
Member

Откуда: Екатеринбург
Сообщений: 307
pkarklin, опишу задачу более понятно:

есть три таблицы: USR_ParsingXML_FILE - в нее сохраняются xml файлы
CREATE TABLE [dbo].[USR_ParsingXML_FILE](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[xml_file] [xml] NULL,
	[file_name] [nvarchar](50) NULL,
	[date_zap] [datetime] NULL,
	[path_file] [nvarchar](250) NULL,
	[pr] [bit] NOT NULL,
 CONSTRAINT [PK_USR_ParsingXML_FILE] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

ALTER TABLE [dbo].[USR_ParsingXML_FILE] ADD  CONSTRAINT [DF_USR_ParsingXML_FILE_pr]  DEFAULT ((0)) FOR [pr]
GO


далее идет разбор xml из поля [xml_file] приведенной таблицы в таблицы [dbo].[USR_ParsingXML_USER] и dbo.USR_ParsingXML_distr. В этих таблицах есть поле id_file - внешний ключ на USR_ParsingXML_FILE.id. Связь между USR_ParsingXML_FILE и USR_ParsingXML_USER один к одному, а с USR_ParsingXML_distr один ко многим. Проблема в том, что файлы ко мне попадают один и тот же по несколько раз (имеется ввиду с одним содержимым), а мне нужно, чтобы не было одинаковых файлов в системе. Поэтому, я сделала так, как сделала: после разбора xml запускаю хп, которая анализирует наличие одинаковых файлов и удаляет их из первой таблицы, из остальных удаляются по ключу. Я не спец в синтаксисе TSQL поэтому и прошу помощи, как мне это реализовать более оптимально. Привожу полный код хп, которой удаляю дубли:
ALTER PROCEDURE [dbo].[USR_Parsing_Dubli]
AS
BEGIN

	SET NOCOUNT ON;
	
DECLARE @i int, @str nvarchar(4000), @count int
SET @i=1

declare @table_name nvarchar(50)


set @count = (SELECT COUNT(id_file) FROM  dbo.USR_ParsingXML_distr WHERE id_file IN (SELECT MAX(d.id_file) AS id
FROM  dbo.USR_ParsingXML_distr d
INNER JOIN dbo.USR_ParsingXML_USER u ON d.id_file=u.id_file
GROUP BY d.teg, d.directory, d.nDistr, d.nComp, d.name, d.nCat, d.nTexts, d.n3, d.n4, d.n5, d.n6, d.compliance, 
d.[date], d.[time], d.sysdate, d.docs, d.kind, d.distr_num, d.name_all, d.kod_pr, 
d.distr_vid, u.usr_date, u.usr_time, u.usr_uptime, u.info_cfg_date, u.info_cfg_time,u.info_cod_date, u.info_cod_time,
u.consult_date, u.consult_time, u.usr_kind 
HAVING COUNT(d.id_file) > 1))


BEGIN TRANSACTION;

BEGIN TRY

WHILE @count > 0

BEGIN

--DECLARE @i int, @str nvarchar(4000)
--SET @i=1

--declare @table_name nvarchar(50)

set @table_name = 'MDB.emp.temp'	+ CAST(@i AS NVARCHAR(6))

create table #temp (id int null)

insert into #temp (id)
SELECT Max (Distinct d.id_file)
FROM  dbo.USR_ParsingXML_distr d
INNER JOIN dbo.USR_ParsingXML_USER u ON d.id_file=u.id_file
GROUP BY d.teg, d.directory, d.nDistr, d.nComp, d.name, d.nCat, d.nTexts, d.n3, d.n4, d.n5, d.n6, d.compliance, 
d.[date], d.[time], d.sysdate, d.docs, d.kind, d.distr_num, d.name_all, d.kod_pr, 
d.distr_vid, u.usr_date, u.usr_time, u.usr_uptime, u.info_cfg_date, u.info_cfg_time,u.info_cod_date, u.info_cod_time,
u.consult_date, u.consult_time, u.usr_kind 
HAVING COUNT(d.id_file) > 1

set @str = 'SELECT distinct id into ' + @table_name +
' from #temp'

exec (@str)

drop table #temp


set @str = 'INSERT INTO [MDB].[dbo].[USR_ParsingXML_FILE_dubli]
           ([xml_file]
           ,[file_name]
           ,[date_zap]
           ,[path_file]
           ,[id_file])
SELECT [xml_file]
      ,[file_name]
      ,[date_zap]
      ,[path_file]
      ,f.[id]
FROM [MDB].[dbo].[USR_ParsingXML_FILE] f
INNER JOIN ' + @table_name + ' t ON f.id=t.id
WHERE f.pr<>0'

exec (@str)

DELETE FROM [MDB].[dbo].[USR_ParsingXML_FILE] 
FROM [MDB].[dbo].[USR_ParsingXML_FILE] f INNER JOIN  [dbo].[USR_ParsingXML_FILE_dubli] d ON f.id=d.id_file
WHERE d.pr=0

UPDATE [dbo].[USR_ParsingXML_FILE_dubli] SET pr=1 WHERE pr=0


set @str='IF OBJECT_ID(N''' + @table_name + ''', N''U'') IS NOT NULL  drop table ' + @table_name

exec (@str)

set @count = (SELECT COUNT(id_file) FROM  dbo.USR_ParsingXML_distr WHERE id_file IN (SELECT MAX(d.id_file) AS id
FROM  dbo.USR_ParsingXML_distr d
INNER JOIN dbo.USR_ParsingXML_USER u ON d.id_file=u.id_file
GROUP BY d.teg, d.directory, d.nDistr, d.nComp, d.name, d.nCat, d.nTexts, d.n3, d.n4, d.n5, d.n6, d.compliance, 
d.[date], d.[time], d.sysdate, d.docs, d.kind, d.distr_num, d.name_all, d.kod_pr, 
d.distr_vid, u.usr_date, u.usr_time, u.usr_uptime, u.info_cfg_date, u.info_cfg_time,u.info_cod_date, u.info_cod_time,
u.consult_date, u.consult_time, u.usr_kind 
HAVING COUNT(d.id_file) > 1))

set @i= @i + 1

END

END TRY

BEGIN CATCH


 SELECT 
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() as ErrorState,
        ERROR_PROCEDURE() as ErrorProcedure,
        ERROR_LINE() as ErrorLine,
        ERROR_MESSAGE() as ErrorMessage;

    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;

END CATCH;

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;
3 авг 13, 20:27    [14658804]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
aleks2
Guest
1. Даже если тупо НЕ выполнять ДВАЖДЫ один и тот же запрос - будет в ДВА раза быстрее.
2. Ну а если все ж проникнуться ненужностью JOIN - можно надеятся на ускорение разов в десять...
3 авг 13, 20:39    [14658835]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
ElenaLeont
Member

Откуда: Екатеринбург
Сообщений: 307
ну так предложите работоспособный вариант вместо того, чтобы оскорблять меня, вроде форум существует как раз для того, чтобы найти помощь, а не выслушивать оскорбления. Или не так, а aleks2?
3 авг 13, 20:43    [14658841]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
`
Guest
aleks2
1. Даже если тупо НЕ выполнять ДВАЖДЫ один и тот же запрос - будет в ДВА раза быстрее.
...

походу, трижды ...
ElenaLeont
+
ALTER PROCEDURE [dbo].[USR_Parsing_Dubli]
AS
BEGIN

	SET NOCOUNT ON;
	
DECLARE @i int, @str nvarchar(4000), @count int
SET @i=1

declare @table_name nvarchar(50)


set @count = (SELECT COUNT(id_file) FROM  dbo.USR_ParsingXML_distr WHERE id_file IN 
-- 1
(SELECT MAX(d.id_file) AS id
FROM  dbo.USR_ParsingXML_distr d
INNER JOIN dbo.USR_ParsingXML_USER u ON d.id_file=u.id_file
GROUP BY d.teg, d.directory, d.nDistr, d.nComp, d.name, d.nCat, d.nTexts, d.n3, d.n4, d.n5, d.n6, d.compliance, 
d.[date], d.[time], d.sysdate, d.docs, d.kind, d.distr_num, d.name_all, d.kod_pr, 
d.distr_vid, u.usr_date, u.usr_time, u.usr_uptime, u.info_cfg_date, u.info_cfg_time,u.info_cod_date, u.info_cod_time,
u.consult_date, u.consult_time, u.usr_kind 
HAVING COUNT(d.id_file) > 1))


BEGIN TRANSACTION;

BEGIN TRY

WHILE @count > 0

BEGIN

--DECLARE @i int, @str nvarchar(4000)
--SET @i=1

--declare @table_name nvarchar(50)

set @table_name = 'MDB.emp.temp'	+ CAST(@i AS NVARCHAR(6))

create table #temp (id int null)

insert into #temp (id)
-- 2
SELECT Max (Distinct d.id_file)
FROM  dbo.USR_ParsingXML_distr d
INNER JOIN dbo.USR_ParsingXML_USER u ON d.id_file=u.id_file
GROUP BY d.teg, d.directory, d.nDistr, d.nComp, d.name, d.nCat, d.nTexts, d.n3, d.n4, d.n5, d.n6, d.compliance, 
d.[date], d.[time], d.sysdate, d.docs, d.kind, d.distr_num, d.name_all, d.kod_pr, 
d.distr_vid, u.usr_date, u.usr_time, u.usr_uptime, u.info_cfg_date, u.info_cfg_time,u.info_cod_date, u.info_cod_time,
u.consult_date, u.consult_time, u.usr_kind 
HAVING COUNT(d.id_file) > 1

set @str = 'SELECT distinct id into ' + @table_name +
' from #temp'

exec (@str)

drop table #temp


set @str = 'INSERT INTO [MDB].[dbo].[USR_ParsingXML_FILE_dubli]
           ([xml_file]
           ,[file_name]
           ,[date_zap]
           ,[path_file]
           ,[id_file])
SELECT [xml_file]
      ,[file_name]
      ,[date_zap]
      ,[path_file]
      ,f.[id]
FROM [MDB].[dbo].[USR_ParsingXML_FILE] f
INNER JOIN ' + @table_name + ' t ON f.id=t.id
WHERE f.pr<>0'

exec (@str)

DELETE FROM [MDB].[dbo].[USR_ParsingXML_FILE] 
FROM [MDB].[dbo].[USR_ParsingXML_FILE] f INNER JOIN  [dbo].[USR_ParsingXML_FILE_dubli] d ON f.id=d.id_file
WHERE d.pr=0

UPDATE [dbo].[USR_ParsingXML_FILE_dubli] SET pr=1 WHERE pr=0


set @str='IF OBJECT_ID(N''' + @table_name + ''', N''U'') IS NOT NULL  drop table ' + @table_name

exec (@str)

set @count = (SELECT COUNT(id_file) FROM  dbo.USR_ParsingXML_distr WHERE id_file IN 
--3
(SELECT MAX(d.id_file) AS id
FROM  dbo.USR_ParsingXML_distr d
INNER JOIN dbo.USR_ParsingXML_USER u ON d.id_file=u.id_file
GROUP BY d.teg, d.directory, d.nDistr, d.nComp, d.name, d.nCat, d.nTexts, d.n3, d.n4, d.n5, d.n6, d.compliance, 
d.[date], d.[time], d.sysdate, d.docs, d.kind, d.distr_num, d.name_all, d.kod_pr, 
d.distr_vid, u.usr_date, u.usr_time, u.usr_uptime, u.info_cfg_date, u.info_cfg_time,u.info_cod_date, u.info_cod_time,
u.consult_date, u.consult_time, u.usr_kind 
HAVING COUNT(d.id_file) > 1))

set @i= @i + 1

END

END TRY

BEGIN CATCH


 SELECT 
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() as ErrorState,
        ERROR_PROCEDURE() as ErrorProcedure,
        ERROR_LINE() as ErrorLine,
        ERROR_MESSAGE() as ErrorMessage;

    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;

END CATCH;

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;
3 авг 13, 20:48    [14658858]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос, плз!  [new]
ElenaLeont
Member

Откуда: Екатеринбург
Сообщений: 307
ну ииии вариант без повторов..........
3 авг 13, 20:52    [14658868]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить