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

Откуда:
Сообщений: 506
приветы! подскажите пожалуйста, есть таблица в mssql2005
+
+
CREATE TABLE [dbo].[KodT](
	[KodT]          [int] NOT NULL,
	[KodAB]		[int] NOT NULL,
	[Price]		[decimal](18, 2) NOT NULL,
	[Data]		[datetime] NOT NULL,
	[Srok]		[datetime] NULL,
	[SerNumber]     [char](50) COLLATE Cyrillic_General_CI_AS NULL,
 CONSTRAINT [kodT_unique] UNIQUE NONCLUSTERED 
(
	[KodT] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

для получение результата вот такого запроса
+
+
SELECT *						
	FROM
		dbo.Jurnal J
	left join 
		(SELECT MAX(Data) AS Data,KodT,KodAB,Price,Srok,SerNumber							
			FROM dbo.KodT 
				GROUP BY KodT,KodAB,Price,Data,Srok,SerNumber)K

		on  J.KodAB = K.KodAB								
		and J.Price = K.Price	
		and J.Data< K.Data
		and isnull(J.Srok,0)=isnull(K.Srok,0)				
		and isnull(J.SerNumber,0)=isnull(K.SerNumber,0)	
	WHERE J.Kod=5

имеет ли смысл создать представление или просто повесить индекс на базовую таблицу? если да, то где и по каким полям? в индексированные представления MAX() плачет. есть ли обход, через функции или как нить еще?

Модератор: Тема перенесена из форума "Проектирование БД".


Сообщение было отредактировано: 28 мар 12, 10:34
28 мар 12, 01:30    [12324423]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
up
28 мар 12, 10:50    [12325331]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Агрегаты только денормализовывать и поддерживать в отдельных таблицах триггерами или еще чем. В индексы вы их не засунете (хотя в представление что-то можно, читайте справку внимательно).

З.Ы. И, да. Для ваших условий and isnull(J.Srok,0) = isnull(K.Srok,0) and isnull(J.SerNumber,0)=isnull(K.SerNumber,0) индексы помогут не особо. Разве что засовывать ваши isnull в вычисляемые поля.
28 мар 12, 11:19    [12325581]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Гавриленко Сергей Алексеевич
Агрегаты только денормализовывать и поддерживать в отдельных таблицах триггерами или еще чем. В индексы вы их не засунете (хотя в представление что-то можно, читайте справку внимательно).

З.Ы. И, да. Для ваших условий and isnull(J.Srok,0) = isnull(K.Srok,0) and isnull(J.SerNumber,0)=isnull(K.SerNumber,0) индексы помогут не особо. Разве что засовывать ваши isnull в вычисляемые поля.
EXISTS(SELECT J.Srok, J.SerNumber INTERSECT SELECT K.Srok, K.SerNumber)
Скорее всего, будут использоваться индексы
28 мар 12, 11:22    [12325626]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
iap,Гавриленко Сергей Алексеевич
ну, ребята, мне оставить все как есть или все таки создать что нибудь(индекс,представление)???
28 мар 12, 12:19    [12326126]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ZVER-10,

а что не устраивает?
Ну а без индексов как вообще-то жить можно?!
28 мар 12, 12:24    [12326169]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
ZVER-10
iap,Гавриленко Сергей Алексеевич
ну, ребята, мне оставить все как есть или все таки создать что нибудь(индекс,представление)???
Вас производительность не устраивает? Показывайте план запроса и скрипты всех таблиц с индексами.
28 мар 12, 12:35    [12326290]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
Гавриленко Сергей Алексеевич,
как раз и интересно производительность. пока таблицы пустые. но сразу хочу сделать так , чтоб потом не менять/добавлять
28 мар 12, 14:00    [12327096]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
а вот таблицы:
+
/****** Object:  Table [dbo].[Jurnal]    Script Date: 03/28/2012 15:01:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Jurnal](
	[Kod] [int] IDENTITY(1,1) NOT NULL,
	[KodAB] [int] NULL,
	[KodT] [int] NULL,
	[NameT] [char](50) COLLATE Cyrillic_General_CI_AS NULL,
	[NN] [int] NULL,
	[Data] [datetime] NULL,
	[Name] [char](50) COLLATE Cyrillic_General_CI_AS NULL,
	[dataMade] [datetime] NULL,
	[Srok] [datetime] NULL,
	[PricePribRos] [decimal](18, 2) NULL,
	[SummaPribRos] [decimal](18, 2) NULL,
	[PerRas] [decimal](18, 2) NULL,
	[PriceSebRos] [decimal](18, 2) NULL,
	[SummaSebRos] [decimal](18, 2) NULL,
	[KursRD] [decimal](18, 2) NULL,
	[PriceSebDol] [decimal](18, 2) NULL,
	[SummaSebDol] [decimal](18, 2) NULL,
	[KursDS] [decimal](18, 2) NULL,
	[PriceSebSom] [decimal](18, 2) NULL,
	[SummaSebSom] [decimal](18, 2) NULL,
	[PerNakr] [decimal](18, 2) NULL,
	[Price] [decimal](18, 2) NULL CONSTRAINT [DF_Jurnal_Praice]  DEFAULT ((0)),
	[Kol] [int] NULL CONSTRAINT [DF_Jurnal_Kol]  DEFAULT ((0)),
	[Summa] [decimal](18, 2) NULL,
	[KodOtv1] [int] NULL,
	[KodOtv2] [int] NULL,
	[N] [int] NULL,
	[IsCount] [bit] NULL,
	[Selected] [bit] NULL,
	[Razn] [int] NULL,
	[Dohod] [int] NULL,
	[PerDohod] [int] NULL,
	[Doc] [int] NULL,
	[NotCount] [int] NULL,
	[RP] [int] NULL,
	[PriceSel] [decimal](18, 2) NULL,
	[DataPere] [datetime] NULL,
	[OstN1] [int] NULL CONSTRAINT [DF__Jurnal__OstN1__68487DD7]  DEFAULT ((0)),
	[OstNS1] [decimal](18, 2) NULL CONSTRAINT [DF__Jurnal__OstNS1__693CA210]  DEFAULT ((0)),
	[OstN2] [int] NULL CONSTRAINT [DF__Jurnal__OstN2__6A30C649]  DEFAULT ((0)),
	[OstNS2] [decimal](18, 2) NULL CONSTRAINT [DF__Jurnal__OstNS2__6B24EA82]  DEFAULT ((0)),
	[OstK1] [int] NULL CONSTRAINT [DF__Jurnal__OstK1__6C190EBB]  DEFAULT ((0)),
	[OstKS1] [decimal](18, 2) NULL CONSTRAINT [DF__Jurnal__OstKS1__6D0D32F4]  DEFAULT ((0)),
	[OstK2] [int] NULL CONSTRAINT [DF__Jurnal__OstK2__6E01572D]  DEFAULT ((0)),
	[OstKS2] [decimal](18, 2) NULL CONSTRAINT [DF__Jurnal__OstKS2__6EF57B66]  DEFAULT ((0)),
	[SerNumber] [char](50) COLLATE Cyrillic_General_CI_AS NULL,
 CONSTRAINT [PK_Jurnal] PRIMARY KEY CLUSTERED 
(
	[Kod] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
USE [Elik]
GO
ALTER TABLE [dbo].[Jurnal]  WITH CHECK ADD  CONSTRAINT [FK_Jurnal_Documents] FOREIGN KEY([N])
REFERENCES [dbo].[Documents] ([code])


/****** Object:  Index [PK_Jurnal]    Script Date: 03/28/2012 15:05:15 ******/
ALTER TABLE [dbo].[Jurnal] ADD  CONSTRAINT [PK_Jurnal] PRIMARY KEY CLUSTERED 
(
	[Kod] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
-------------------------------------------------------------------------------------------------------------
--====================================================================================
USE [Elik]
GO
/****** Object:  Table [dbo].[KodT]    Script Date: 03/28/2012 15:03:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[KodT](
	[KodT] [int] NOT NULL,
	[KodAB] [int] NOT NULL,
	[Price] [decimal](18, 2) NOT NULL,
	[Data] [datetime] NOT NULL,
	[Srok] [datetime] NULL,
	[SerNumber] [char](50) COLLATE Cyrillic_General_CI_AS NULL,
 CONSTRAINT [kodT_unique] UNIQUE NONCLUSTERED 
(
	[KodT] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF


/****** Object:  Index [kodT_unique]    Script Date: 03/28/2012 15:06:19 ******/
ALTER TABLE [dbo].[KodT] ADD  CONSTRAINT [kodT_unique] UNIQUE NONCLUSTERED 
(
	[KodT] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]


/****** Object:  Index [indexColumns]    Script Date: 03/28/2012 15:06:09 ******/
CREATE CLUSTERED INDEX [indexColumns] ON [dbo].[KodT] 
(
	[KodAB] ASC,
	[Price] ASC,
	[Srok] ASC,
	[SerNumber] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]



и вот запрос:
+
SELECT *						
	FROM
		dbo.Jurnal J
	left join 
		(SELECT MAX(Data) AS Data,KodT,KodAB,Price,Srok,SerNumber							
			FROM dbo.KodT 
				GROUP BY KodT,KodAB,Price,Data,Srok,SerNumber)K

		on  J.KodAB = K.KodAB								
		and J.Price = K.Price	
		and J.Data< K.Data
		and isnull(J.Srok,0)=isnull(K.Srok,0)				
		and isnull(J.SerNumber,0)=isnull(K.SerNumber,0)	
	WHERE J.Kod=5

и вот план:

К сообщению приложен файл. Размер - 16Kb
28 мар 12, 14:12    [12327216]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ZVER-10,

то есть, у Вас два констрейнта [kodT_unique] в [dbo].[KodT]?
Не верю! ©
28 мар 12, 14:38    [12327479]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
iap, ну один кластерный а другой нет, в чем подвох то?
28 мар 12, 15:00    [12327700]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ZVER-10
iap, ну один кластерный а другой нет, в чем подвох то?
Не может быть двух объектов с одним и тем же именем
Этот скрипт в самом деле работает?
28 мар 12, 15:04    [12327748]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
ZVER-10
iap, ну один кластерный а другой нет, в чем подвох то?
Не может быть двух объектов с одним и тем же именем
Этот скрипт в самом деле работает?
Кстати говоря, оба описания - некластерные...
28 мар 12, 15:05    [12327760]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
iap, аааааааааа. извиняюсь. это повторение идет))). я в менеджмент студио взял по табл отдельно и индексов отдельно. моя вина(
28 мар 12, 15:08    [12327790]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
а вот этот индекс: indexColumns ON dbo.KodT, мне что нибудь даст или я зря существует?
28 мар 12, 15:14    [12327841]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
может его удалить/изменить?
28 мар 12, 15:15    [12327849]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
меня интересует табл KodT, оставить как есть или как быть. я малограмотный. подскажите плиз
28 мар 12, 15:41    [12328083]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ZVER-10
меня интересует табл KodT, оставить как есть или как быть. я малограмотный. подскажите плиз
Так что, INTERSECT пробовали?
Хотя, от значений в полях Srok и SerNumber зависит...
По дате в запросе условие есть, а в индексах её нет. Но это надо пробовать
28 мар 12, 15:53    [12328213]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
iap, значит дату тоже включить в индекс?
28 мар 12, 16:03    [12328300]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
а INTERSECT использовать, чтоб избавиться от джоина?
28 мар 12, 16:09    [12328358]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ZVER-10
iap, значит дату тоже включить в индекс?
Попробовать-то можете? По-всякому.
Неужели больше верите словам с форума, чем прямому эксперименту?
Как можно ответить на абстрактный вопрос?
Может, для даты свой индекс нужен? И именно его выберет сервер (зависит от данных).
28 мар 12, 16:14    [12328410]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
iap,
)))))))вам больше верю. шутка. вечером попробую. просто думал там всего 5-колонок и один запрос и ответ очивиден для професианалов, я же новичок. спс за отклик)
28 мар 12, 16:21    [12328469]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ZVER-10
а INTERSECT использовать, чтоб избавиться от джоина?
Чтобы избавиться от отдельной проверки на NULL.
При этом может быть использован индекс.
У Вас же нет индекса по ISNULL(Srok,0)?
А по Srok - есть! Если, конечно, накладываете ограничения в запросе на KodAB и Price
 ON EXISTS(SELECT J.KodAB,J.Price,J.Srok,J.SerNumber INTERSECT SELECT K.KodAB,K.Price,K.Srok,K.SerNumber)
AND J.Data<K.Data
Хотя, не факт, что будет лучше
28 мар 12, 16:23    [12328494]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
iap,
спс)
28 мар 12, 16:41    [12328658]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить