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

Откуда:
Сообщений: 165
1. Пытаюсь научиться тонкой настройке оптимизации запросов. Но с нижеследующим примером не очень получается. Привожу скриншоты вызываемого и основного запросов:

а) SELECT 'Факт' AS ПланФакт, dbo.t_OPU_Adjust_2.RazdelOPU AS Раздел, dbo.t_Sprav.Name_1 AS Статья,
CASE WHEN t_LTr.CURRENCYCODE = 'RUR' THEN t_LTr.AMOUNTMST ELSE (t_LTr.AMOUNTMST * dbo.f_Get_Cur(t_LTr.TRANSDATE, N'USDtoCUR', N'RUR'))
END * - 1 AS СуммаР, CASE WHEN t_LTr.CURRENCYCODE = 'USD' THEN t_LTr.AMOUNTMST ELSE (t_LTr.AMOUNTMST / dbo.f_Get_Cur(t_LTr.TRANSDATE,
N'USDtoCUR', N'RUR')) END * - 1 AS СуммаД, dbo.t_Sprav.Name_4 AS КодГруппыАкс, dbo.t_Sprav.Name_5 AS ГруппаАкс,
dbo.t_GroupOPU.NomGroupOPU AS НомГрОПУ, dbo.t_GroupOPU.GroupOPU AS ГруппаОПУ, dbo.t_GroupOPU.Version AS НаборГрОПУ, 'ОПУ' AS Документ,
dbo.t_BE.Name AS БизнесЕд, dbo.t_BE.DAX_NAME AS DAX_БизнесЕд, dbo.t_BE.[Group] AS ГруппаВЕ, t_LTr.TRANSDATE AS Дата, t_LTr.AMOUNTMST AS Сумма,
t_LTr.CURRENCYCODE AS Валюта, t_LTr.DIMENSION2_, t_LTr.DIMENSION, dbo.t_BE.BE, dbo.t_OPU_Adjust_2.PlanAccount
FROM dbo.t_GroupOPU WITH (NOLOCK) RIGHT OUTER JOIN
dbo.t_OPU_Adjust_2 WITH (NOLOCK) INNER JOIN
dbo.t_LEDGERTRANS AS t_LTr WITH (NOLOCK) INNER JOIN
dbo.t_BE WITH (NOLOCK) ON t_LTr.BE = dbo.t_BE.BE ON dbo.t_OPU_Adjust_2.BE = t_LTr.BE AND dbo.t_OPU_Adjust_2.PlanAccount = t_LTr.ACCOUNTNUM ON
dbo.t_GroupOPU.RasdelOPU = dbo.t_OPU_Adjust_2.RazdelOPU AND dbo.t_GroupOPU.BE = t_LTr.BE AND
dbo.t_GroupOPU.ID_Spr = t_LTr.DIMENSION2_ LEFT OUTER JOIN
dbo.t_Sprav WITH (NOLOCK) ON t_LTr.DIMENSION2_ = dbo.t_Sprav.ID_Spr

б) SELECT * FROM dbo.V_OPU_d_2_t WHERE (Дата BETWEEN '2014-05-01' AND '2014-05-31') AND (BE = N'INR')

2. Подскажите толковое и понятное описание процесса: инструменты, основные правила (особенно увязки с типами создаваемых индексов) и анализ. А то вроде много текстов, но не все толково объясняется. Особенно не хватает примеров: если... то....

К сообщению приложен файл. Размер - 123Kb
17 июл 14, 10:52    [16316845]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
serg0265
Member

Откуда:
Сообщений: 165
... второй скрин
17 июл 14, 10:52    [16316850]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
немного полезной литературы
17 июл 14, 10:57    [16316888]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
serg0265
Member

Откуда:
Сообщений: 165
второй скрин

К сообщению приложен файл. Размер - 91Kb
17 июл 14, 10:57    [16316890]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
serg0265
Member

Откуда:
Сообщений: 165
Maxx,
Спасибо за ссылку, буду изучать.
А по конкретному примеру есть советы?
17 июл 14, 10:59    [16316913]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
serg0265
Привожу скриншоты вызываемого и основного запросов:
Что такое "вызываемый и основной запрос"?

Где текст вьюхи? Что за второй скрин, зачем эта бесполезная картинка?

Где план запроса А) ?

Непонятно объясняете.
17 июл 14, 11:19    [16317111]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
serg0265
Member

Откуда:
Сообщений: 165
alexeyvg,
а) - вызываемый запрос, б) - основной
Вьюха - это а)
Второй скрин - это схема вызываемой вьюхи для облегчения восприятия.

Для упрощения понимания сформировал единый запрос, содержащий вызываемый. Давайте далее анализировать этот единственный единый запрос. План прилагается

К сообщению приложен файл. Размер - 113Kb
17 июл 14, 12:07    [16317579]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
ТС , заканчивайте постить картинки на экран.
выкладывайте тесты в спойлеры и сформатированием
17 июл 14, 12:08    [16317595]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
+ стукруы таблиц и индексы к ним
17 июл 14, 12:10    [16317617]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
serg0265
Member

Откуда:
Сообщений: 165
Maxx, Konst_One,
Замечание про экран учту.
Таблица t_LEDGERTRANS содержит около 40 млн. записей.
А вот по поводу структуры и индексов не пойму как это выдать компактно. Ведь там множество картинок. Может подскажете как извлекать. Или что конкретно интересует в первую очередь.
17 июл 14, 12:21    [16317734]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
serg0265
Maxx, Konst_One,
Замечание про экран учту.
Таблица t_LEDGERTRANS содержит около 40 млн. записей.
А вот по поводу структуры и индексов не пойму как это выдать компактно. Ведь там множество картинок. Может подскажете как извлекать. Или что конкретно интересует в первую очередь.

Плина..жесть какая.. може вам про оптимизацию еще рано думать то ?
Правай клавиша мыши на таблице - Заскриптовать обьет..включатет все олпции и получаетеДДЛ таблицы
17 июл 14, 12:23    [16317747]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
serg0265
Member

Откуда:
Сообщений: 165
Maxx,
Ах Вы про это..
Статистика
+
Client Execution Time 13:20:46
Query Profile Statistics
Number of INSERT, DELETE and UPDATE statements 0 0
Rows affected by INSERT, DELETE, or UPDATE statements 0 0
Number of SELECT statements 4 4
Rows returned by SELECT statements 4331 4331
Number of transactions 0 0
Network Statistics
Number of server roundtrips 3 3
TDS packets sent from client 3 3
TDS packets received from server 474 474
Bytes sent from client 3860 3860
Bytes received from server 1931178 1931178
Time Statistics
Client processing time 23301 23301
Total execution time 23454 23454
Wait time on server replies 153 153

t_LEDGERTRANS
+
CREATE TABLE [dbo].[t_LEDGERTRANS](
[ACCOUNTNUM] [nvarchar](20) NOT NULL,
[TRANSDATE] [datetime] NOT NULL,
[VOUCHER] [nvarchar](20) NOT NULL,
[TXT] [nvarchar](240) NOT NULL,
[AMOUNTMST] [numeric](28, 12) NOT NULL,
[AMOUNTCUR] [numeric](28, 12) NOT NULL,
[CURRENCYCODE] [nvarchar](3) NOT NULL,
[TRANSTYPE] [int] NOT NULL,
[DIMENSION] [nvarchar](20) NOT NULL,
[DIMENSION2_] [nvarchar](20) NOT NULL,
[DIMENSION3_] [nvarchar](20) NOT NULL,
[DIMENSION4_] [nvarchar](20) NOT NULL,
[DIMENSION5_] [nvarchar](20) NOT NULL,
[DIMENSION6_] [nvarchar](20) NOT NULL,
[DIMENSION7_] [nvarchar](20) NOT NULL,
[QTY] [numeric](28, 12) NOT NULL,
[DOCUMENTDATE] [datetime] NOT NULL,
[JOURNALNUM] [nvarchar](20) NOT NULL,
[JOURNALIZESEQNUM] [int] NOT NULL,
[ALLOCATELEVEL] [int] NOT NULL,
[POSTING] [int] NOT NULL,
[CORRECT] [int] NOT NULL,
[CREDITING] [int] NOT NULL,
[DOCUMENTNUM] [nvarchar](20) NOT NULL,
[PAYMREFERENCE] [nvarchar](20) NOT NULL,
[PERIODCODE] [int] NOT NULL,
[OPERATIONSTAX] [int] NOT NULL,
[THIRDPARTYBANKACCOUNTID] [nvarchar](20) NOT NULL,
[COMPANYBANKACCOUNTID] [nvarchar](20) NOT NULL,
[PAYMMODE] [nvarchar](20) NOT NULL,
[JOURNALIZENUM] [nvarchar](20) NOT NULL,
[AMOUNTMSTSECOND] [numeric](28, 12) NOT NULL,
[EUROTRIANGULATION] [int] NOT NULL,
[FURTHERPOSTINGTYPE] [int] NOT NULL,
[LEDGERPOSTINGJOURNALID] [nvarchar](20) NOT NULL,
[TAXREFID] [int] NOT NULL,
[BONDBATCHTRANS_RU] [bigint] NOT NULL,
[BONDBATCH_RU] [nvarchar](20) NOT NULL,
[RTSLFROMCOMPANYID] [nvarchar](4) NOT NULL,
[RTSLSESSIONTRANSID] [nvarchar](20) NOT NULL,
[CREATEDTRANSACTIONID] [bigint] NOT NULL,
[DATAAREAID] [nvarchar](4) NOT NULL,
[RECVERSION] [int] NOT NULL,
[RECID] [bigint] NOT NULL,
[CONSOLIDATEDCOMPANY] [nvarchar](4) NOT NULL,
[REASONREFRECID] [bigint] NOT NULL,
[MODIFIEDDATETIME] [datetime] NOT NULL,
[MODIFIEDBY] [nvarchar](5) NOT NULL,
[CREATEDDATETIME] [datetime] NOT NULL,
[CREATEDBY] [nvarchar](5) NOT NULL,
[BE] AS (case when [DATAAREAID]='soh' then 'wfi' else [DATAAREAID] end),
[ExchCurDay] AS ([dbo].[f_Get_Cur]([TRANSDATE],N'USDtoCUR',N'RUR')),
CONSTRAINT [PK_t_LEDGERTRANS] PRIMARY KEY CLUSTERED
(
[DATAAREAID] ASC,
[RECID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


Индексы
+
/****** Object: Index [Cover_Ind] Script Date: 07/17/2014 13:22:15 ******/
CREATE NONCLUSTERED INDEX [Cover_Ind] ON [dbo].[t_LEDGERTRANS]
(
[BE] ASC,
[TRANSDATE] ASC
)
INCLUDE ( [ACCOUNTNUM],
[AMOUNTMST],
[CURRENCYCODE],
[DIMENSION],
[DIMENSION2_]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

/****** Object: Index [IX_t_LEDG_Dim2] Script Date: 07/17/2014 13:26:42 ******/
CREATE NONCLUSTERED INDEX [IX_t_LEDG_Dim2] ON [dbo].[t_LEDGERTRANS]
(
[ACCOUNTNUM] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]


t_BE
+
CREATE TABLE [dbo].[t_BE](
[BE] [nvarchar](10) NOT NULL,
[DAX_NAME] [varchar](100) NULL,
[IsActive] [varchar](100) NULL,
[OrderInGroup] [varchar](255) NULL,
[Department] [varchar](100) NULL,
[Group] [varchar](100) NULL,
[Name] [nvarchar](100) NULL,
[CustAccount] [nvarchar](255) NULL,
[OrderInCashFlow] [int] NULL,
CONSTRAINT [PK_t_BE] PRIMARY KEY CLUSTERED
(
[BE] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

t_OPU_Adjust_2
+
CREATE TABLE [dbo].[t_OPU_Adjust_2](
[BE] [nvarchar](10) NOT NULL,
[PlanAccount] [nvarchar](20) NOT NULL,
[RazdelOPU] [varchar](50) NOT NULL,
[K_Deb] [int] NOT NULL,
[K_Cre] [int] NOT NULL,
CONSTRAINT [PK_t_OPU_Adjust_2] PRIMARY KEY CLUSTERED
(
[BE] ASC,
[PlanAccount] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[t_OPU_Adjust_2] WITH NOCHECK ADD CONSTRAINT [FK_t_OPU_Adjust_2_t_BE] FOREIGN KEY([BE])
REFERENCES [dbo].[t_BE] ([BE])
ON UPDATE CASCADE
GO

ALTER TABLE [dbo].[t_OPU_Adjust_2] CHECK CONSTRAINT [FK_t_OPU_Adjust_2_t_BE]

t_GroupOPU
+
CREATE TABLE [dbo].[t_GroupOPU](
[ID_GrOPU] [varchar](100) NOT NULL,
[BE] [nvarchar](10) NULL,
[RasdelOPU] [varchar](50) NULL,
[ID_Spr] [varchar](50) NULL,
[NomGroupOPU] [varchar](50) NULL,
[GroupOPU] [varchar](200) NULL,
[Version] [varchar](50) NULL,
[RasdelOPUGroup] [varchar](100) NULL,
CONSTRAINT [PK_t_GroupOPU] PRIMARY KEY CLUSTERED
(
[ID_GrOPU] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

t_Sprav
+

CREATE TABLE [dbo].[t_Sprav](
[ID_Spr] [varchar](50) NOT NULL,
[Tip] [varchar](100) NULL,
[Name_1] [varchar](100) NULL,
[Name_2] [varchar](100) NULL,
[Name_3] [varchar](255) NULL,
[Name_4] [varchar](100) NULL,
[Name_5] [varchar](100) NULL,
[Name_6] [nchar](100) NULL,
CONSTRAINT [PK_t_Sprav] PRIMARY KEY CLUSTERED
(
[ID_Spr] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
17 июл 14, 13:47    [16318378]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
упс..яка краса,а вы с какой целью кластерные индексы делали по текстовым поля то ?
далее зачем в поля некластерных индексов включены поля из кластерного,
И сам запрос не картинкой и сюда и под тег SRC..а то глаза сломать мона
17 июл 14, 13:58    [16318469]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
serg0265
Member

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

Потому что написал в начале: "... Пытаюсь научиться..." Подскажите, как правильно делать.

Запрос
SELECT     'Факт' AS ПланФакт, dbo.t_OPU_Adjust_2.RazdelOPU AS Раздел, dbo.t_Sprav.Name_1 AS Статья, 
                      CASE WHEN t_LTr.CURRENCYCODE = 'RUR' THEN t_LTr.AMOUNTMST ELSE (t_LTr.AMOUNTMST * t_LTr.ExchCurDay) END * - 1 AS СуммаР, 
                      CASE WHEN t_LTr.CURRENCYCODE = 'USD' THEN t_LTr.AMOUNTMST ELSE (t_LTr.AMOUNTMST / t_LTr.ExchCurDay) END * - 1 AS СуммаД, 
                      dbo.t_Sprav.Name_4 AS КодГруппыАкс, dbo.t_Sprav.Name_5 AS ГруппаАкс, dbo.t_GroupOPU.NomGroupOPU AS НомГрОПУ, 
                      dbo.t_GroupOPU.GroupOPU AS ГруппаОПУ, 'ОПУ' AS Документ, dbo.t_BE.Name AS БизнесЕд, dbo.t_BE.DAX_NAME AS DAX_БизнесЕд, 
                      dbo.t_BE.[Group] AS ГруппаВЕ, t_LTr.TRANSDATE AS Дата, t_LTr.AMOUNTMST AS Сумма, t_LTr.CURRENCYCODE AS Валюта, t_LTr.DIMENSION2_, 
                      t_LTr.DIMENSION, dbo.t_BE.BE, dbo.t_OPU_Adjust_2.PlanAccount
FROM         dbo.t_GroupOPU WITH (NOLOCK) RIGHT OUTER JOIN
                      dbo.t_OPU_Adjust_2 WITH (NOLOCK) INNER JOIN
                      dbo.t_LEDGERTRANS AS t_LTr WITH (NOLOCK) INNER JOIN
                      dbo.t_BE WITH (NOLOCK) ON t_LTr.BE = dbo.t_BE.BE ON dbo.t_OPU_Adjust_2.BE = t_LTr.BE AND 
                      dbo.t_OPU_Adjust_2.PlanAccount = t_LTr.ACCOUNTNUM ON 
                      dbo.t_GroupOPU.RasdelOPU = dbo.t_OPU_Adjust_2.RazdelOPU AND dbo.t_GroupOPU.BE = t_LTr.BE AND 
                      dbo.t_GroupOPU.ID_Spr = t_LTr.DIMENSION2_ LEFT OUTER JOIN
                      dbo.t_Sprav WITH (NOLOCK) ON t_LTr.DIMENSION2_ = dbo.t_Sprav.ID_Spr
WHERE     (TRANSDATE BETWEEN '2014-05-01' AND '2014-05-31') AND (dbo.t_BE.BE = N'INR')
17 июл 14, 14:04    [16318523]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
+ напишите по людски... бо составлять за вас откровенно влом.
Т.е.
Одна таблица алиас
JOIN вторая таблица алиас ON условия обьединения

FROM dbo.t_GroupOPU WITH (NOLOCK) 
     RIGHT OUTER JOIN  bo.t_OPU_Adjust_2 WITH (NOLOCK)  
	 INNER JOIN dbo.t_LEDGERTRANS AS t_LTr WITH (NOLOCK) 
	 INNER JOIN  dbo.t_BE WITH (NOLOCK)  
	 ON t_LTr.BE = dbo.t_BE.BE  
	 ON dbo.t_OPU_Adjust_2.BE = t_LTr.BE AND dbo.t_OPU_Adjust_2.PlanAccount = t_LTr.ACCOUNTNUM
	 ON  dbo.t_GroupOPU.RasdelOPU = dbo.t_OPU_Adjust_2.RazdelOPU AND dbo.t_GroupOPU.BE = t_LTr.BE AND dbo.t_GroupOPU.ID_Spr = t_LTr.DIMENSION2_ 
	 LEFT OUTER JOIN dbo.t_Sprav WITH (NOLOCK) ON t_LTr.DIMENSION2_ = dbo.t_Sprav.ID_Spr
17 июл 14, 14:07    [16318544]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
да и зачем вам столько нолоков то ?
Нормальной формой записи джойна считаеться вид
from table 1 t1
 (inner , left.....) join table2 t2 on t1.Field = t2.Field...
 (inner , left.....) join table3 t3 on t2.Field = t1.(t3).Field...
17 июл 14, 14:10    [16318566]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
serg0265
Member

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

SELECT     'Факт' AS ПланФакт, Adj.RazdelOPU AS Раздел, S.Name_1 AS Статья, 
                      CASE WHEN t_LTr.CURRENCYCODE = 'RUR' THEN t_LTr.AMOUNTMST ELSE (t_LTr.AMOUNTMST * t_LTr.ExchCurDay) END * - 1 AS СуммаР, 
                      CASE WHEN t_LTr.CURRENCYCODE = 'USD' THEN t_LTr.AMOUNTMST ELSE (t_LTr.AMOUNTMST / t_LTr.ExchCurDay) END * - 1 AS СуммаД, 
                      S.Name_4 AS КодГруппыАкс, S.Name_5 AS ГруппаАкс, G.NomGroupOPU AS НомГрОПУ, 
                      G.GroupOPU AS ГруппаОПУ, 'ОПУ' AS Документ, b.Name AS БизнесЕд, b.DAX_NAME AS DAX_БизнесЕд, 
                      b.[Group] AS ГруппаВЕ, t_LTr.TRANSDATE AS Дата, t_LTr.AMOUNTMST AS Сумма, t_LTr.CURRENCYCODE AS Валюта, t_LTr.DIMENSION2_, 
                      t_LTr.DIMENSION, b.BE, Adj.PlanAccount
FROM         dbo.t_GroupOPU AS G WITH (NOLOCK) 
					RIGHT OUTER JOIN dbo.t_OPU_Adjust_2 AS Adj WITH (NOLOCK) 
						INNER JOIN dbo.t_LEDGERTRANS AS t_LTr WITH (NOLOCK) 
							INNER JOIN dbo.t_BE AS b WITH (NOLOCK) 
							ON t_LTr.BE = b.BE 
						ON Adj.BE = t_LTr.BE AND Adj.PlanAccount = t_LTr.ACCOUNTNUM 
					ON G.RasdelOPU = Adj.RazdelOPU AND G.BE = t_LTr.BE AND G.ID_Spr=t_LTr.DIMENSION2_ 
					LEFT OUTER JOIN dbo.t_Sprav AS S WITH (NOLOCK) 
					ON t_LTr.DIMENSION2_ = S.ID_Spr
WHERE     (TRANSDATE BETWEEN '2014-05-01' AND '2014-05-31') AND (b.BE = N'INR')
17 июл 14, 14:19    [16318645]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
serg0265
Member

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

Если не ставить нолок на большой t_LTr, то время формирования - очень большое.
На остальных - на всякий случай. Снять?
17 июл 14, 14:22    [16318670]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Maxx
Нормальной формой записи джойна считаеться вид
from table 1 t1
 (inner , left.....) join table2 t2 on t1.Field = t2.Field...
 (inner , left.....) join table3 t3 on t2.Field = t1.(t3).Field...


а как вы нормально запишете такой запрос?

SELECT mt.x, d.y, df.z
FROM MainTable AS mt
LEFT JOIN 
	Details AS d
	INNER JOIN DetailFilter AS df 
	ON df.d_id = d.id
ON d.mt_id = mt.id
17 июл 14, 14:23    [16318678]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
Maxx
Member [скрыт]

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

частности но тоже решаемо..внтурений если позволят обстоятельства заверну и инлайн вью
17 июл 14, 14:33    [16318756]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
с учетом ,что план счетов к фактам идет вообще райт джойном....то яб вообще експерементировал бы с другой стороны
17 июл 14, 14:40    [16318802]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
from dbo.t_OPU_Adjust_2 AS Adj
  left outer join dbo.t_LEDGERTRANS AS t_LTr on  Adj.PlanAccount = t_LTr.ACCOUNTNUM  and Adj.BE = t_LTr.BE
    and t_LTr.BE = N'INR' -- не савсем гуд..но мона попробовать
  left outer join dbo.t_BE AS b t_LTr.BE = b.BE  and b.BE = N'INR' -- не савсем гуд..но мона попробовать
  left outer join ( 
    select
	  RasdelOPU
	  ,BE
	  ,ID_Spr
	  ,GroupOPU
	  ,NomGroupOPU
    from dbo.t_GroupOPU 
	where TRANSDATE BETWEEN '20140501' AND '20140531'
	  and BE = N'INR'
	 )AS G on G.RasdelOPU = Adj.RazdelOPU AND G.BE = t_LTr.BE AND G.ID_Spr=t_LTr.DIMENSION2_ 
  left outer join dbo.t_Sprav AS S on t_LTr.DIMENSION2_ = S.ID_Spr
17 июл 14, 15:00    [16318979]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
serg0265
Member

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

Подправил ошибки. Вышло
SELECT     'Факт' AS ПланФакт, Adj.RazdelOPU AS Раздел, S.Name_1 AS Статья, 
                      CASE WHEN t_LTr.CURRENCYCODE = 'RUR' THEN t_LTr.AMOUNTMST ELSE (t_LTr.AMOUNTMST * t_LTr.ExchCurDay) END * - 1 AS СуммаР, 
                      CASE WHEN t_LTr.CURRENCYCODE = 'USD' THEN t_LTr.AMOUNTMST ELSE (t_LTr.AMOUNTMST / t_LTr.ExchCurDay) END * - 1 AS СуммаД, 
                      S.Name_4 AS КодГруппыАкс, S.Name_5 AS ГруппаАкс, G.NomGroupOPU AS НомГрОПУ, 
                      G.GroupOPU AS ГруппаОПУ, 'ОПУ' AS Документ, b.Name AS БизнесЕд, b.DAX_NAME AS DAX_БизнесЕд, 
                      b.[Group] AS ГруппаВЕ, t_LTr.TRANSDATE AS Дата, t_LTr.AMOUNTMST AS Сумма, t_LTr.CURRENCYCODE AS Валюта, t_LTr.DIMENSION2_, 
                      t_LTr.DIMENSION, b.BE, Adj.PlanAccount
from dbo.t_OPU_Adjust_2 AS Adj
  left outer join dbo.t_LEDGERTRANS AS t_LTr on  Adj.PlanAccount = t_LTr.ACCOUNTNUM  and Adj.BE = t_LTr.BE
     and t_LTr.BE = N'INR' -- не савсем гуд..но мона попробовать
  left outer join dbo.t_BE AS b on t_LTr.BE = b.BE  and b.BE = N'INR' -- не савсем гуд..но мона попробовать
  left outer join ( 
    select
	  RasdelOPU
	  ,BE
	  ,ID_Spr
	  ,GroupOPU
	  ,NomGroupOPU
    from dbo.t_GroupOPU 
	  WHERE BE = N'INR'
	 ) AS G on G.RasdelOPU = Adj.RazdelOPU AND G.BE = t_LTr.BE AND G.ID_Spr=t_LTr.DIMENSION2_ 
  left outer join dbo.t_Sprav AS S on t_LTr.DIMENSION2_ = S.ID_Spr
  	where t_LTr.TRANSDATE BETWEEN '20140501' AND '20140531'

В результате - производительность в среднем такая же, как у исходного запроса. Даже немного хуже.
План (не знаю как завернуть картинку (в атаче) в спойлер)

К сообщению приложен файл. Размер - 73Kb
17 июл 14, 16:04    [16319376]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
serg0265
Member

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

Создал рекомендуемый в плане индекс:
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[t_GroupOPU] ([BE])
INCLUDE ([RasdelOPU],[ID_Spr],[NomGroupOPU],[GroupOPU])

Выиграли пару секунд. Сравнялись по времени с исходным запросом.
17 июл 14, 16:10    [16319433]     Ответить | Цитировать Сообщить модератору
 Re: И снова про оптимизацию  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ну у вас вообще ошибка у вас лефт перевернулся в иннер..но то такое.
Никто и не обещал что все сразу взлетит.
аб при таком расскалде порбовал в инлайн завернуть джойн из
dbo.t_LEDGERTRANS +dbo.t_GroupOPU + dbo.t_BE и сразу его отфильровать ,тем более у вас есть все параметры для ет ого , а патом уже тока фильтрованый наболр джойнить с остальным
17 июл 14, 16:10    [16319439]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить