Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / оптимизация запроса / 25 сообщений из 29, страница 1 из 2
13.12.2017, 14:31:12
    #39569019
annetby
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
Прошу помощи:
adp проект, Форма содержит ленточную подформу, источник записи - функция (записей порядка 28000 на сегодня).
При загрузки формы проходит около 1 минуты, прежде же загрузятся данные.
Декомпиляция, изменение источника записей, уменьшение сортировочных полей, до одного не решило мою проблему. Единственное, что помогло, это - отказаться от сортировки. Это не вариант, поскольку поле по которому идет сортировка отображает deadline, это вычисляемое поле в запросе DaysToEventEndNewSort.
Можно ли как то увеличить скорость загрузки?
Спасибо.

Ниже запрос и план запроса.
...
Рейтинг: 0 / 0
13.12.2017, 14:31:25
    #39569020
annetby
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
SELECT TOP 100 PERCENT CASE WHEN A.State = 'В работе' THEN CAST(A.DaysToEventEnd AS integer) ELSE '9999' END AS DaysToEventEndNewSort,
A.DirCode, A.RegistrCode, LEFT(A.LocName, 1) AS LocName, LEFT(A.MedName, 3) AS MedName, A.TypeName, A.OldType_ShortName, A.NameLS,
A.Declarant, A.DeclarantCountry, A.ExpertName, A.ExpertID, CASE WHEN A.State = 'В работе' THEN CAST(A.DaysToCentrEnd AS varchar)
ELSE '---' END AS DaysToCentrEnd, CASE WHEN A.State = 'В работе' THEN CAST(A.DaysToEventEnd AS varchar) ELSE '---' END AS DaysToEventEnd,
LEFT(A.DocType, 1) AS DocType, A.EventsQuantity, LEFT(A.ChemistryState, 1) AS ChemistryState, LEFT(A.Status, 1) AS Status, A.State,
CASE WHEN A.State = 'В работе' THEN CAST(A.DaysToEventEnd AS varchar) ELSE '---' END AS DaysToEventEndNew, B.LoginName
FROM dbo.fn_TEList_Init() A CROSS JOIN
dbo.tTEList_SO B
WHERE (B.LoginName = SUSER_SNAME()) AND (@DirCode IS NULL OR
@DirCode = 'Все' OR
A.DirCode = @DirCode) AND (@NameLS IS NULL OR
@NameLS = 'Все' OR
A.NameLS LIKE '%' + @NameLS + '%' OR
@NameLS = '-- Отсутствует --' AND A.NameLS IS NULL) AND (@Declarant IS NULL OR
@Declarant = 'Все' OR
A.Declarant LIKE '%' + @Declarant + '%' OR
@Declarant = '-- Отсутствует --' AND A.Declarant IS NULL) AND (@DeclarantCountry IS NULL OR
@DeclarantCountry = 'Все' OR
A.DeclarantCountry = @DeclarantCountry OR
@DeclarantCountry = '-- Отсутствует --' AND A.DeclarantCountry IS NULL) AND (@ExpertID IS NULL OR
@ExpertID = '-1' OR
A.ExpertID = @ExpertID OR
@ExpertID = '0' AND A.ExpertID IS NULL) AND (@DocType IS NULL OR
@DocType = 'Все' OR
A.DocType = @DocType OR
@DocType = '?? Отсутствует ??' AND A.DocType IS NULL) AND (@Status IS NULL OR
@Status = 'Все' OR
A.Status = @Status) AND (@State IS NULL OR
@State = 'Все' OR
A.State = @State)
ORDER BY DaysToEventEndNewSort
...
Рейтинг: 0 / 0
13.12.2017, 14:34:04
    #39569024
annetby
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
DECLARE @DirCode varchar(20), @NameLS varchar(20),  @Declarant varchar(20),  @DeclarantCountry varchar(20),  @DocType varchar(20),  @Status varchar(20),  @State varchar(20)    SET @DirCode ='Все'
 SET @NameLS ='Все'
 SET @Declarant ='Все'
 SET @DeclarantCountry ='Все'
 SET @DocType ='Все'
 SET @Status ='Все'
 SET @State ='Все'    --SET @Date = CONVERT(datetime, CONVERT(char,GETDATE(),1),1)
 SELECT     TOP 100 PERCENT CASE WHEN A.State = 'В работе' THEN CAST(A.DaysToEventEnd AS integer) ELSE '9999' END AS DaysToEventEndNewSort,                         DirCode, RegistrCode, LEFT(LocName, 1) AS LocName, LEFT(MedName, 3) AS MedName, TypeName, Ol
...
Рейтинг: 0 / 0
13.12.2017, 14:34:31
    #39569025
annetby
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
|--Sort(ORDER BY:([Expr1026] ASC))
       |--Compute Scalar(DEFINE:([Expr1026]=If (If (Convert([tTheoryEvents].[IsDossierReturn])=1) then 'Возврат Досье' else If (Convert([tTheoryEvents].[IsArchive])=1) then 'Архив' else If (Convert([tTheoryEvents].[IsCommission])=1) then 'Комиссия' else If
            |--Hash Match(Right Outer Join, HASH:([tExpType].[Id])=([tTheory].[TheoryTypeID_Old]), RESIDUAL:([tTheory].[TheoryTypeID_Old]=[tExpType].[Id]))
                 |--Table Scan(OBJECT:([LFFASQL].[dbo].[tExpType]))
                 |--Hash Match(Right Outer Join, HASH:([tTheoryGroupType].[Type_ID])=([tTheory].[TheoryTypeID]), RESIDUAL:([tTheory].[TheoryTypeID]=[tTheoryGroupType].[Type_ID]))
                      |--Nested Loops(Left Outer Join, OUTER REFERENCES:([tTheoryGroupType].[Type_Name]))
                      |    |--Nested Loops(Left Outer Join, OUTER REFERENCES:([tTheoryGroupType].[Type_Med_ID]))
                      |    |    |--Clustered Index Scan(OBJECT:([LFFASQL].[dbo].[tTheoryGroupType].[PK_tTheoryGroupType]))
                      |    |    |--Hash Match(Cache, HASH:([tTheoryGroupType].[Type_Med_ID]), RESIDUAL:([tTheoryGroupType].[Type_Med_ID]=[tTheoryGroupType].[Type_Med_ID]))
                      |    |         |--Nested Loops(Left Outer Join, OUTER REFERENCES:([tTheoryGroupMeds].[Med_Loc_ID]))
                      |    |              |--Clustered Index Seek(OBJECT:([LFFASQL].[dbo].[tTheoryGroupMeds].[PK_tTheoryGroupMeds]), SEEK:([tTheoryGroupMeds].[Med_ID]=[tTheoryGroupType].[Type_Med_ID]) ORDERED FORWARD)
                      |    |              |--Clustered Index Seek(OBJECT:([LFFASQL].[dbo].[tTheoryGroupLocation].[PK_tTheoryGroupLocation]), SEEK:([tTheoryGroupLocation].[Loc_ID]=[tTheoryGroupMeds].[Med_Loc_ID]) ORDERED FORWARD)
                      |    |--Clustered Index Seek(OBJECT:([LFFASQL].[dbo].[tTheoryGroupType_Names].[PK_tTheoryGroupType_Names]), SEEK:([tTheoryGroupType_Names].[TheoryType_Name]=[tTheoryGroupType].[Type_Name]) ORDERED FORWARD)
                      |--Nested Loops(Inner Join, WHERE:(([@Status]=NULL OR [@Status]='Все') OR If (Convert([tTheoryEvents].[IsDossierReturn])=1 OR Convert([tTheoryEvents].[IsCommission])=1) then 'Завершенный' else If ([tTheoryResultNames].[Rank]=1) then '
                           |--Stream Aggregate(DEFINE:([Expr1005]=MAX([tTodaysDate].[Today])))
                           |    |--Top(1)
                           |         |--Clustered Index Scan(OBJECT:([LFFASQL].[dbo].[tTodaysDate].[PK_tTodaysDate]), ORDERED BACKWARD)
                           |--Hash Match(Right Outer Join, HASH:([tTheoryResultNames].[ResultName])=([tTheoryEvents].[Result]), RESIDUAL:([tTheoryResultNames].[ResultName]=[tTheoryEvents].[Result]))
                                |--Clustered Index Scan(OBJECT:([LFFASQL].[dbo].[tTheoryResultNames].[PK_tTheoryResultNames]))
                                |--Hash Match(Right Outer Join, HASH:([tExpert].[ExID])=([tTheory].[ExID]), RESIDUAL:([tTheory].[ExID]=[tExpert].[ExID]))
                                     |--Compute Scalar(DEFINE:([tExpert].[Name]=dbo.tExpert.[LastName]+' '+substring(dbo.tExpert.[FirstName], 1, 1)+'.'+substring(dbo.tExpert.[Patronymic], 1, 1)+'.'))
                                     |    |--Clustered Index Scan(OBJECT:([LFFASQL].[dbo].[tExpert].[PK_tExpert]))
                                     |--Filter(WHERE:(((([@DocType]=NULL OR [@DocType]='Все') OR [tTheoryEvents].[DocType]=Convert([@DocType])) OR ([@DocType]='?? Отсутствует ??' AND [tTheoryEvents].[DocType]=NULL)) AND (([@State]=NULL OR [@State]='Все') O
                                          |--Merge Join(Right Outer Join, MERGE:([tTheoryEvents].[ID])=([tTheory].[CurrentEventID]), RESIDUAL:([tTheory].[CurrentEventID]=[tTheoryEvents].[ID]))
                                               |--Clustered Index Scan(OBJECT:([LFFASQL].[dbo].[tTheoryEvents].[PK_tTheoryEvents]), ORDERED FORWARD)
                                               |--Sort(ORDER BY:([tTheory].[CurrentEventID] ASC))
                                                    |--Merge Join(Inner Join, MERGE:([tTheory].[DirCode])=([tTheoryEvents].[DirCode]), RESIDUAL:([tTheory].[DirCode]=[tTheoryEvents].[DirCode]))
                                                         |--Filter(WHERE:((([@Declarant]=NULL OR [@Declarant]='Все') OR like([tTheory].[Declarant], '%'+[@Declarant]+'%', NULL)) OR ([@Declarant]='-- Отсутствует --' AND [tTheory].[Declarant]=NULL)))
                                                         |    |--Clustered Index Scan(OBJECT:([LFFASQL].[dbo].[tTheory].[PK_tTheory]),  WHERE:(((([@DirCode]=NULL OR [@DirCode]='Все') OR [tTheory].[DirCode]=[@DirCode]) AND ((([@NameLS]=NULL OR [@NameLS]='Вс
                                                         |--Sort(ORDER BY:([tTheoryEvents].[DirCode] ASC))
                                                              |--Hash Match(Aggregate, HASH:([tTheoryEvents].[DirCode]), RESIDUAL:([tTheoryEvents].[DirCode]=[tTheoryEvents].[DirCode]))
                                                                   |--Clustered Index Scan(OBJECT:([LFFASQL].[dbo].[tTheoryEvents].[PK_tTheoryEvents]))
...
Рейтинг: 0 / 0
13.12.2017, 14:38:11
    #39569027
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
1. Нафига те 28000 записей не клиенте? Микрософт очень толсто намекает, ограничивая 10 000 записей выборку в ADP.
2. Мой хрустальный шар треснул, при попытке заглянуть в dbo.fn_TEList_Init() и dbo.tTEList_SO.
3. Я так полагаю - это сильномохнатые вьюхи с кучей вычисляемых полей и соединений по этим полям...
...
Рейтинг: 0 / 0
13.12.2017, 14:44:33
    #39569032
annetby
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
aleks222,
спасибо , что посмотрели.
Не скажу, что я асс, но я правда хочу разобраться:
1 - SELECT TOP - вроде ограничение
2 - не поняла совсем
3 - куча вычислений есть, но соединений по ним нет
...
Рейтинг: 0 / 0
13.12.2017, 14:55:50
    #39569039
annetby
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
Я уже думаю формировать временную таблицу для решения моей проблемы
...
Рейтинг: 0 / 0
13.12.2017, 14:56:14
    #39569041
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
TOP 100 PERCENT -- не ограничение,
а подарок тем, кто строит запросы
в графическом построителе вьюх.

опубликуйте код dbo.fn_TEList_Init()
и убедитесь во всей куче соединений воочию
...
Рейтинг: 0 / 0
13.12.2017, 15:00:49
    #39569042
оптимизация запроса
annetby1 - SELECT TOP - вроде ограничениеу тебя там топ 100%. Так себе ограничение......
...
Рейтинг: 0 / 0
13.12.2017, 15:01:37
    #39569043
annetby
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
Yasha123 ,
не сразу поняла , соединений - тьма, 12 таблиц, это правда.
Я подумала о соединениях с вычисляемыми полями , сорри
...
Рейтинг: 0 / 0
13.12.2017, 15:09:20
    #39569051
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
1. top 100 %. Ога.
2. Эффективное написание запросов требует использования не вьюх, а таблиц. По минимуму.
3. Выход на "лишь бы щас работало": запихиваешь результат запроса БЕЗ сортировки во временную таблицу. Выбираешь из временной с сортировкой.
...
Рейтинг: 0 / 0
13.12.2017, 15:10:06
    #39569052
Гигабайт Мегабайтович Килобайтов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
после быстрого взгляда cross двух функций и потом попытка объединить результаты типа джоин. наверняка в построено в построителе запросов. без понимания того что таки надо получить в итоге.
1) нафиг выкинуть cross join ибо по всей видимости dbo.tTEList_SO отвечает за доступ , но к чему фиг поймёшь
2) а может таки посмотреть что есть в dbo.fn_TEList_Init()
3) нормально переписать условие where
...
Рейтинг: 0 / 0
13.12.2017, 15:22:41
    #39569067
annetby
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
Ребята, всем огромное спасибо за отклики.
что то совсем непонятные для меня вещи: убирала cross join из запроса, и по времени на 5 секунд дольше загружалась форма, 64 сек.
и с TOP 100 PERCENT --играла, ставила 10.
запрос на выполнение срабатывает за 23 сек., но при открытии формы в adp проекте и загрузки данных проходит 1 минута.
Вот пришла к вам за помощью.
...
Рейтинг: 0 / 0
13.12.2017, 15:28:13
    #39569073
annetby
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
Гигабайт Мегабайтович Килобайтов,
dbo.tTEList_SO отвечал за сортировку (хранил сортировку пользователей для след Загрузки. Я убрала ее и оставила одно поле для сортировки и в одном порядке -по возрастанию). Подумалось, если Вы найдете причину так пусть уже и красиво будет с сортировкой :-)
...
Рейтинг: 0 / 0
13.12.2017, 15:36:40
    #39569081
Гигабайт Мегабайтович Килобайтов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
annetbyГигабайт Мегабайтович Килобайтов,
dbo.tTEList_SO отвечал за сортировку (хранил сортировку пользователей для след Загрузки. Я убрала ее и оставила одно поле для сортировки и в одном порядке -по возрастанию). Подумалось, если Вы найдете причину так пусть уже и красиво будет с сортировкой :-)
таки что-то у вас не то, в текущем виде dbo.tTEList_SO точно не отвечает за сортировку ибо вы сортируете по полю из dbo.fn_TEList_Init()

CASE WHEN A.State = 'В работе' THEN CAST(A.DaysToEventEnd AS integer) ELSE '9999' END
вы хоть понимаете что тут происходит и как ведет себя сортировка в данном случае?))
...
Рейтинг: 0 / 0
13.12.2017, 15:37:41
    #39569082
Гигабайт Мегабайтович Килобайтов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
Гигабайт Мегабайтович КилобайтовannetbyГигабайт Мегабайтович Килобайтов,
dbo.tTEList_SO отвечал за сортировку (хранил сортировку пользователей для след Загрузки. Я убрала ее и оставила одно поле для сортировки и в одном порядке -по возрастанию). Подумалось, если Вы найдете причину так пусть уже и красиво будет с сортировкой :-)
таки что-то у вас не то, в текущем виде dbo.tTEList_SO точно не отвечает за сортировку ибо вы сортируете по полю из dbo.fn_TEList_Init()

CASE WHEN A.State = 'В работе' THEN CAST(A.DaysToEventEnd AS integer) ELSE '9999' END
вы хоть понимаете что тут происходит и как ведет себя сортировка в данном случае?))
а самый лучший вариант таки раскрыть функцию и препарировать исходные данные.
...
Рейтинг: 0 / 0
13.12.2017, 15:41:15
    #39569086
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
annetbyи с TOP 100 PERCENT --играла, ставила 10.


annetbyПодумалось, если Вы найдете причину так пусть уже и красиво будет с сортировкой :-)

Причину мы установили: полное непонимание сути.

Лечение: только самолечение.
...
Рейтинг: 0 / 0
13.12.2017, 15:47:06
    #39569091
annetby
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
Гигабайт Мегабайтович Килобайтов, надеюсь, что хотя бы имею представление.
было так:
ORDER BY
CASE WHEN B.DirCode = 1 THEN A.DirCode WHEN .... END,
CASE WHEN B.DirCode = 2 THEN A.DirCode ... END DESC,

Я убрала сортировку сложную и возможно не нужную - CROSS JOIN dbo.tTheoryExpandedList_SortOrder B
Я правда хочу разобраться, что не так.
...
Рейтинг: 0 / 0
13.12.2017, 16:03:28
    #39569111
Гигабайт Мегабайтович Килобайтов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
для уточнения - текст данного запроса уходит с клиента или таки это всё на сервере?

CASE WHEN A.State = 'В работе' THEN CAST(A.DaysToEventEnd AS integer) ELSE '9999' END

вы тут приводите к типу varchar(сколько то ) а потом сортируете этот varchar , что происходит очень медленно. это при условии что "когда вы убрали сортировку результат приемлем".


и таки хотелось бы посмотреть таки что было в сортировки до то, как вы её порезали.
...
Рейтинг: 0 / 0
13.12.2017, 16:11:27
    #39569118
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
annetby,

Для начала вот так. И начнем разбираться по Вашим nested loops.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
SELECT TOP 100 PERCENT 
	-- вычисляемый столбец для сортировки
	CASE WHEN A.State = 'В работе' THEN CAST(A.DaysToEventEnd AS integer) ELSE '9999' END AS DaysToEventEndNewSort
	-- обычные вычисляемые столбцы
	,A.DirCode
	,A.RegistrCode
	,LEFT(A.LocName, 1) AS LocName
	,LEFT(A.MedName, 3) AS MedName
	,A.TypeName
	,A.OldType_ShortName
	,A.NameLS
	,A.Declarant
	,A.DeclarantCountry
	,A.ExpertName
	,A.ExpertID
	,CASE WHEN A.State = 'В работе' THEN CAST(A.DaysToCentrEnd AS varchar) ELSE '---' END AS DaysToCentrEnd
	,CASE WHEN A.State = 'В работе' THEN CAST(A.DaysToEventEnd AS varchar) ELSE '---' END AS DaysToEventEnd
	,LEFT(A.DocType, 1) AS DocType
	,A.EventsQuantity
	,LEFT(A.ChemistryState, 1) AS ChemistryState
	,LEFT(A.Status, 1) AS Status
	,A.State
	,CASE WHEN A.State = 'В работе' THEN CAST(A.DaysToEventEnd AS varchar) ELSE '---' END AS DaysToEventEndNew
	,B.LoginName
FROM dbo.fn_TEList_Init() A -- отсюда не прилетает вычисляемый DaysToEventEndNewSort, а сортируем по нему
CROSS JOIN dbo.tTEList_SO B -- поэтому связка еще и ограничивается чудовищными фильтрами
WHERE (
-- фильтры по части B
B.LoginName = SUSER_SNAME()
) 
-- фильтры по части A
AND (@DirCode IS NULL OR @DirCode = 'Все' OR A.DirCode = @DirCode)
AND (@NameLS IS NULL OR @NameLS = 'Все' OR A.NameLS LIKE '%' + @NameLS + '%' OR
@NameLS = '-- Отсутствует --' AND A.NameLS IS NULL)
AND (@Declarant IS NULL OR @Declarant = 'Все' OR A.Declarant LIKE '%' + @Declarant + '%' OR
@Declarant = '-- Отсутствует --' AND A.Declarant IS NULL)
AND (@DeclarantCountry IS NULL OR @DeclarantCountry = 'Все' OR A.DeclarantCountry = @DeclarantCountry OR
@DeclarantCountry = '-- Отсутствует --' AND A.DeclarantCountry IS NULL)
AND (@ExpertID IS NULL OR @ExpertID = '-1' OR A.ExpertID = @ExpertID OR @ExpertID = '0' AND A.ExpertID IS NULL)
AND (@DocType IS NULL OR @DocType = 'Все' OR A.DocType = @DocType OR @DocType = '?? Отсутствует ??' AND A.DocType IS NULL)
AND (@Status IS NULL OR @Status = 'Все' OR A.Status = @Status) AND (@State IS NULL OR @State = 'Все' OR A.State = @State)
-- сортировка по вычисляемому столбцу
ORDER BY DaysToEventEndNewSort
...
Рейтинг: 0 / 0
13.12.2017, 16:15:41
    #39569123
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
annetby,

Теперь сюда скриншотик следующего запроса. И далее мы Вам таки ткнем пальцем в некошерное место.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
exec sp_spaceused [tTheoryEvents]
exec sp_spaceused [tTheory]
exec sp_spaceused [tExpType]
exec sp_spaceused [tTheoryGroupType]
exec sp_spaceused [tTheoryGroupMeds]
exec sp_spaceused [tTheoryGroupLocation]
exec sp_spaceused [tTheoryGroupType_Names]
exec sp_spaceused [tTodaysDate]
exec sp_spaceused [tTheoryResultNames]
exec sp_spaceused [tExpert]
...
Рейтинг: 0 / 0
13.12.2017, 16:15:58
    #39569124
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
Гигабайт Мегабайтович КилобайтовCASE WHEN A.State = 'В работе' THEN CAST(A.DaysToEventEnd AS integer) ELSE '9999' END

вы тут приводите к типу varcharТип данного выражения - int.
Потому что приоритет int выше, чем varchar.
...
Рейтинг: 0 / 0
13.12.2017, 16:17:59
    #39569126
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
annetby,

Хотя в принципе и так очевидно, что у Вас не хватает некластерных индексов на таблице [tTheoryEvents]. Ну или статистика по ним уже некошерная.
...
Рейтинг: 0 / 0
13.12.2017, 16:26:05
    #39569131
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
annetby,

Показывайте актуальный план в формате sqlplan. И не картинкой, а файлом. Тот, который показан, не соответствует обсуждаемому запросу.
...
Рейтинг: 0 / 0
13.12.2017, 16:27:05
    #39569132
annetby
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация запроса
Гигабайт Мегабайтович Килобайтов,
для уточнения - текст данного запроса уходит с клиента или таки это всё на сервере?
пользователи работают с ade файлом, который находится локально на компе пользователя.
CASE WHEN A.State = 'В работе' THEN CAST(A.DaysToEventEnd AS integer) ELSE '9999' END
вы тут приводите к типу varchar(сколько то ) а потом сортируете этот varchar , что происходит очень медленно. это при условии что "когда вы убрали сортировку результат приемлем".


в этом наверное намудрила, пользователю непонятно 9999, поэтому у меня 2 поля формируется одно int- сортирую по нему, а на экран в форме подтягиваеьтся другое поле с "--". В сортировке не нужен CAST.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / оптимизация запроса / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]