Как оптимизировать sql запросы? Sql оптимизация запросов по датам


sql - Оптимизация запросов с множеством объединений и фильтров даты

У меня есть запрос, который работает, но ужасно медленный. Там было несколько таблиц, в которых все имеют одинаковый столбец по дате и идентификатору. Поскольку количество строк огромно (3M+), для его ускорения требуется фильтрация по дате. Я выполнил рудиментарную работу, но мне интересно, как оптимизировать ее дальше.

Запрос, который работает очень медленно, выглядит так:

select A.date ,A.id ,A.col3 ,B.id2 ,B.colR ,B.colS ,C.colX ,C.colY ,C.colZ from table1 A left join table2 B on A.id = B.id left join table3 on B.id2 = C.id2 where A.date = '2017-06-01' and A.col3 = 'test' and B.id2 is not NULL

Теперь в таблице 2 также есть поле date, которое я также хотел бы фильтровать. Я переписал запрос так, и это работает отлично:

select A.date ,A.id ,A.col3 ,B.id2 ,B.colR ,B.colS from (select date, id, col3 from table1 where date='2017-06-01' and col3='test') A left join (select date, id, colR, colS from table2 where date='2017-06-01') B on A.id=B.id where B.colR is not NULL

Но теперь возникает вопрос о том, как я присоединяюсь к таблице 3. Мой подход к удару по другому left join с соединением, который у меня уже есть, похоже, не работает так же, как я приближался к нему в моем первоначальном, плохо оптимизированном запросе. Этот подход выглядит так:

select A.date ,A.id ,A.col3 ,B.id2 ,B.colR ,B.colS ,C.colX ,C.colY ,C.colZ from (select date, id, col3 from table1 where date='2017-06-01' and col3='test') A left join (select date, id, id2, colR, colS from table2 where date='2017-06-01') B on A.id=B.id where B.colR is not NULL left join (select id2, colX, colY, colZ from table3) C on B.id2 = C.id2

Как мне перейти на таблицу 3, если запрос сразу же не работает? Конкретная ошибка, которую я получаю:

Msg 103010, Level 16, State 1, Line 1 Parse error at line: 33, column: 1: Incorrect syntax near 'left'.

Который находится во втором left join меня есть в приведенном выше утверждении.

qaru.site

Как оптимизировать sql запросы? :: DLE FAQ

Приветствую, проверил время отклика сайта, и выявились несколько медленных запросов, но как их ускорить, оптимизировать просто понятия не имею, вот пример медленных запросов с временем выполнения:0,10511804 сек. - [ SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story) as full_story, p.full_story as full_story2, p.xfields, p.title, p.category, p.alt_name, p.comm_num, p.allow_comm, p.fixed, p.tags, e.news_read, e.day_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM dle_post p LEFT JOIN dle_post_extras e ON (p.id=e.news_id) WHERE category regexp '[[:<:]](1|2|3|4|5|6|7|8|9|10|11|12|13|14|21|22|23|708|709|710|711|712|713)[[:>:]]' AND approve=1 AND date < '2015-06-09 21:18:28' ORDER BY day_read DESC, news_read DESC LIMIT 0,6 ]

0,02097297 сек. - [ SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story) as full_story, p.full_story as full_story2, p.xfields, p.title, p.category, p.alt_name, p.comm_num, p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM dle_post p LEFT JOIN dle_post_extras e ON (p.id=e.news_id) WHERE category regexp '[[:<:]](30|31)[[:>:]]' AND approve=1 AND date < '2015-06-09 21:18:28' ORDER BY date DESC LIMIT 0,5 ]

0,02827621 сек. - [ SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story) as full_story, p.full_story as full_story2, p.xfields, p.title, p.category, p.alt_name, p.comm_num, p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM dle_post p LEFT JOIN dle_post_extras e ON (p.id=e.news_id) WHERE category regexp '[[:<:]](1|2|3|4|5|6|7|8|9|10|11|12|13|14|21|22|23|708|709|710|711|712|713)[[:>:]]' AND p.date >= '2015-06-09 21:18:28' - INTERVAL 7 DAY AND p.date < '2015-06-09 21:18:28' AND approve=1 ORDER BY news_read DESC LIMIT 0,7 ]

dle-faq.ru

Оптимизация запроса

declare @StartDate datetime, @EndDate datetime set @StartDate = '20130101' set @EndDate = '20150825' create table #note ( co_num nvarchar(20), note nvarchar(4000) ) DECLARE SelCoCrs CURSOR LOCAL STATIC FOR select distinct co_num,RowPointer from ( select order_date, credit_hold, co_num, lcr_num, est_num, cust_num, cust_seq, rusdrop_num, rusdrop_seq, createdby, ship_code, charfld1, type, trans_nat, RowPointer from co with (nolock) union all select order_date, 0 credit_hold, co_num, lcr_num, est_num, cust_num, cust_seq, cust_num, cust_seq, createdby, ship_code, charfld1, type, trans_nat, RowPointer from coh with (nolock) ) co WHERE co.order_date >= @StartDate and co.order_date <= @EndDate and co.type <> 'E' OPEN SelCoCrs declare @Severity int, @CoNum nvarchar(20), @RowPointer nvarchar(50), @Note nvarchar(4000) set @Severity = 0 WHILE @Severity = 0 BEGIN set @Note = '' FETCH SelCoCrs INTO @CoNum, @RowPointer IF @@FETCH_STATUS = -1 BREAK SELECT @Note = @Note + ', ' + case when Note like 'ATTACHMENT:%' then Description else [Description] + ' ' + cast([Note] as nvarchar(2000)) end FROM [zip_work].[dbo].[ReportNotesView] where TableName = 'co' and [RefRowPointer] = @RowPointer insert into #note select @CoNum co_num, substring(@Note,3,len(@Note)) note END declare @baseitem TABLE ( [item] [nvarchar](15) NOT NULL, [Description] [nvarchar](100) NOT NULL, [isbase] [int] NOT NULL ) insert into @baseitem SELECT [_Code] collate Cyrillic_General_100_CI_AS item ,[_Description] [Description] ,1 isbase FROM [s01-sq03].[ui].[dbo].[_Reference171] where _Folder = 0x01 and _Fld384 <> 0x00 and [_OwnerIDRRef] = 0xB636852BC90F1C0541826510D7F6B034 --ЗИП and [_Marked] = 0x00 select co.order_date [Дата заказа] , ci.due_date [Плановая дата] , ci.uf_contract_date [Контр. дата] , co.CreatedBy [Ответственный] , ci.item [Код изделия] , (select string from sl_zip.forms_work.dbo.russianstrings where name = 'sItemStatus=' + i.stat) [Статус изделия] , i.description [Изделие] , ISNULL(t.description,'Реализация') [Тип сделки] , ISNULL(ci.lot,'') [Партия] , ISNULL(logo.description,'') [Логотип] , (select string from sl_zip.forms_work.dbo.russianstrings where name = 'sCoItemStatus=' + ci.stat) [Статус ЗК] , ci.co_num [co_num] , cust_lcr.confrm_num [Договор] , ca.name [Клиент] , div_mgr.div_name [Департамент] , dept.description [Отдел] , new_dept.description [Подразделение] , ci.qty_ordered [Кол-во заказано] , ci.qty_ordered * ci.price_conv [Сумма заказано] , iw.qty_reorder [Страховой запас] , ci.qty_shipped [Кол-во отгружено] , ci.qty_shipped * ci.price_conv [Сумма отгружено] , ci.ship_date [Дата отгружки] , ci.qty_ordered - ci.qty_shipped [Колво не отружено] , (ci.qty_ordered - ci.qty_shipped) * ci.price_conv [Сумма не отгружено] , iw.qty_on_hand [Кол-во в наличии] , iw.qty_alloc_co [Кол-во в заказах] , iw.qty_on_hand - iw.qty_alloc_co [Наличие с учетом потребности] , iw.qty_wip [В производстве] , CASE WHEN iw.qty_alloc_co > iw.qty_on_hand + iw.qty_wip THEN iw.qty_alloc_co - iw.qty_on_hand - iw.qty_wip ELSE 0 END [К производству] , shipcode.description [Условия поставки] , CASE WHEN qty_ordered = qty_shipped and qty_packed = qty_shipped THEN 'Отфактурован' WHEN qty_ordered = qty_shipped THEN 'Отгружен' WHEN qty_shipped > 0 THEN 'Частично' WHEN exists (select co_num from ruscocomplect where co.co_num = ruscocomplect.co_num) THEN 'Выписан' ELSE 'Создан' END [Факт отгрузки] , CASE WHEN co.order_date > CAST('2010-01-01' as datetime) THEN DATEDIFF(day, ISNULL(ci.uf_contract_date, ci.due_date), ISNULL(ci.ship_date, GETDATE())) ELSE DATEDIFF(day, ci.

forundex.ru


Prostoy-Site | Все права защищены © 2018 | Карта сайта