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

Откуда:
Сообщений: 75
Задача: имеем массивы данных, собранных по разным периодам: часовые, суточные, месячные.
Очевидно, что месячных намного меньше часовых, а хочется иметь к ним быстрый доступ.
К тому же часовые нам нужны только за последний год.

Имеем базу:
CREATE TABLE [dbo].[MyData](
	[ID] [int] NOT NULL,
	[code] [int] NOT NULL,
	[Range] [tinyint] NOT NULL,
 CONSTRAINT [PK_MyData] PRIMARY KEY CLUSTERED ([ID] ASC)
)
GO

CREATE UNIQUE NONCLUSTERED INDEX [IX_MyData] ON [dbo].[MyData] 
(
	[code] ASC,
	[Range] ASC
) 
GO

CREATE TABLE [dbo].[MyDataHour](
	[DataID] [int] NOT NULL,
	[Time] [smalldatetime] NOT NULL,
	[Val] [float] NULL,
	[Status] [int] NULL,
 CONSTRAINT [PK_MyDataHour] PRIMARY KEY CLUSTERED ([DataID] ASC,[Time] ASC)
)
GO

CREATE TABLE [dbo].[MyDataDay](
	[DataID] [int] NOT NULL,
	[Time] [smalldatetime] NOT NULL,
	[Val] [float] NULL,
	[Status] [int] NULL,
 CONSTRAINT [PK_MyDataDay] PRIMARY KEY CLUSTERED ([DataID] ASC,[Time] ASC) 
) 
GO

CREATE TABLE [dbo].[MyDataMonth](
	[DataID] [int] NOT NULL,
	[Time] [smalldatetime] NOT NULL,
	[Val] [float] NULL,
	[Status] [int] NULL,
 CONSTRAINT [PK_MyDataMonth] PRIMARY KEY CLUSTERED ([DataID] ASC,[Time] ASC) ON [PRIMARY]
)
GO

CREATE VIEW [dbo].[vwMyData] AS
WITH M AS (
SELECT id.Code,id.Range,m.* FROM MyData id 
INNER JOIN MyDataMonth m on m.DataID=id.ID
WHERE id.Range=3
UNION ALL
SELECT id.Code,id.Range,m.* FROM MyData id 
INNER JOIN MyDataDay m on m.DataID=id.ID
WHERE id.Range=2
UNION ALL
SELECT id.Code,id.Range,m.* FROM MyData id 
INNER JOIN MyDataHour m on (m.DataID=id.ID)
WHERE id.Range=1
)
SELECT * FROM M
GO

CREATE PROCEDURE [dbo].[GetData]
@Code int,
@Range int
AS
BEGIN
	SELECT * FROM vwMyData WHERE (Code=@Code)and(Range=@Range)
END
GO
Range=1,2,3 - это час, сутки и месяц соответственно.

Проблема: сильно различается производительность при выборке через вьюшку (быстрее) и через процедуру (медленно).
Глянул планы: обомлел.
Запрос
SELECT * FROM vwMyData WHERE Code=1 and Range=3
имеет план:
  |--Compute Scalar(DEFINE:([id].[code]=[Test2].[dbo].[MyData].[code] as [id].[code], [id].[Range]=[Test2].[dbo].[MyData].[Range] as [id].[Range], [m].[DataID]=[Test2].[dbo].[MyDataMonth].[DataID] as [m].[DataID], [m].[Time]=[Test2].[dbo].[MyDataMonth].[Time] as [m].[Time], [m].[Val]=[Test2].[dbo].[MyDataMonth].[Val] as [m].[Val], [m].[Status]=[Test2].[dbo].[MyDataMonth].[Status] as [m].[Status]))
       |--Nested Loops(Inner Join, OUTER REFERENCES:([id].[ID]))
            |--Index Seek(OBJECT:([Test2].[dbo].[MyData].[IX_MyData] AS [id]), SEEK:([id].[code]=(1) AND [id].[Range]=(3)),  WHERE:([Test2].[dbo].[MyData].[Range] as [id].[Range]=(3)) ORDERED FORWARD)
            |--Clustered Index Seek(OBJECT:([Test2].[dbo].[MyDataMonth].[PK_MyDataMonth] AS [m]), SEEK:([m].[DataID]=[Test2].[dbo].[MyData].[ID] as [id].[ID]) ORDERED FORWARD)
А запрос
EXEC GetData @Code=1,@Range=3
такой:
       |--Concatenation
            |--Filter(WHERE:(STARTUP EXPR([@Range]=(3))))
            |    |--Nested Loops(Inner Join, OUTER REFERENCES:([id].[ID]))
            |         |--Index Seek(OBJECT:([Test2].[dbo].[MyData].[IX_MyData] AS [id]), SEEK:([id].[code]=[@Code] AND [id].[Range]=[@Range]),  WHERE:([Test2].[dbo].[MyData].[Range] as [id].[Range]=(3)) ORDERED FORWARD)
            |         |--Clustered Index Seek(OBJECT:([Test2].[dbo].[MyDataMonth].[PK_MyDataMonth] AS [m]), SEEK:([m].[DataID]=[Test2].[dbo].[MyData].[ID] as [id].[ID]) ORDERED FORWARD)
            |--Filter(WHERE:(STARTUP EXPR([@Range]=(2))))
            |    |--Nested Loops(Inner Join, OUTER REFERENCES:([id].[ID]))
            |         |--Index Seek(OBJECT:([Test2].[dbo].[MyData].[IX_MyData] AS [id]), SEEK:([id].[code]=[@Code] AND [id].[Range]=[@Range]),  WHERE:([Test2].[dbo].[MyData].[Range] as [id].[Range]=(2)) ORDERED FORWARD)
            |         |--Clustered Index Seek(OBJECT:([Test2].[dbo].[MyDataDay].[PK_MyDataDay] AS [m]), SEEK:([m].[DataID]=[Test2].[dbo].[MyData].[ID] as [id].[ID]) ORDERED FORWARD)
            |--Filter(WHERE:(STARTUP EXPR([@Range]=(1))))
                 |--Nested Loops(Inner Join, OUTER REFERENCES:([id].[ID]))
                      |--Index Seek(OBJECT:([Test2].[dbo].[MyData].[IX_MyData] AS [id]), SEEK:([id].[code]=[@Code] AND [id].[Range]=[@Range]),  WHERE:([Test2].[dbo].[MyData].[Range] as [id].[Range]=(1)) ORDERED FORWARD)
                      |--Clustered Index Seek(OBJECT:([Test2].[dbo].[MyDataHour].[PK_MyDataHour] AS [m]), SEEK:([m].[DataID]=[Test2].[dbo].[MyData].[ID] as [id].[ID]) ORDERED FORWARD)
Получается, независимо от значения параметра на входе, процедура шарит по всем таблицам:-(
Почему так? WITH RECOMPILE у процедуры не помогает.
29 сен 11, 19:18    [11357893]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение в хранимых процедурах при выборке из view в схеме сегментации  [new]
LeadyGaaga
Member

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

SELECT * 
FROM vwMyData WHERE Code=1 and Range=3
OPTION(RECOMPILE)
29 сен 11, 19:48    [11358028]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение в хранимых процедурах при выборке из view в схеме сегментации  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Как минимум, аккуратнее надо с типами. В таблице Range - tinyint, в процедура параметр - int.

darkexpert
WITH RECOMPILE у процедуры не помогает.
Зато option (recompile) помогает. :)

if object_id('GetData') is not null
    drop proc [dbo].[GetData]
go    
CREATE PROCEDURE [dbo].[GetData]
@Code int,
@Range tinyint
AS
BEGIN
	SELECT * FROM vwMyData WHERE (Code=@Code)and(Range=@Range) option (recompile)
END
GO
set statistics profile on
go
EXEC GetData @Code=1,@Range=3
go
set statistics profile off
go
Rows                 Executes             StmtText                                                                                                                                                                                                                                                                                StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                                                                                                                                                                                           DefinedValues                                                                                                                                                                                                                                             EstimateRows  EstimateIO    EstimateCPU   AvgRowSize  TotalSubtreeCost OutputList                                                                    Warnings Type                                                             Parallel EstimateExecutions
-------------------- -------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------- ------------- ------------- ----------- ---------------- ----------------------------------------------------------------------------- -------- ---------------------------------------------------------------- -------- ------------------
0                    1                    SELECT * FROM vwMyData WHERE (Code=@Code)and(Range=@Range) option (recompile)                                                                                                                                                                                                           1           1           0           NULL                           NULL                           NULL                                                                                                                                                                                                                                                               NULL                                                                                                                                                                                                                                                      1             NULL          NULL          NULL        0,00657058       NULL                                                                          NULL     SELECT                                                           0        NULL
0                    0                      |--Compute Scalar(DEFINE:([Union1014]=[Test].[dbo].[MyDataMonth].[DataID] as [m].[DataID], [Union1015]=[Test].[dbo].[MyDataMonth].[Time] as [m].[Time], [Union1016]=[Test].[dbo].[MyDataMonth].[Val] as [m].[Val], [Union1017]=[Test].[dbo].[MyDataMonth].[Status] as [m].[Status]))  1           2           1           Compute Scalar                 Compute Scalar                 DEFINE:([Union1014]=[Test].[dbo].[MyDataMonth].[DataID] as [m].[DataID], [Union1015]=[Test].[dbo].[MyDataMonth].[Time] as [m].[Time], [Union1016]=[Test].[dbo].[MyDataMonth].[Val] as [m].[Val], [Union1017]=[Test].[dbo].[MyDataMonth].[Status] as [m].[Status])  [Union1014]=[Test].[dbo].[MyDataMonth].[DataID] as [m].[DataID], [Union1015]=[Test].[dbo].[MyDataMonth].[Time] as [m].[Time], [Union1016]=[Test].[dbo].[MyDataMonth].[Val] as [m].[Val], [Union1017]=[Test].[dbo].[MyDataMonth].[Status] as [m].[Status]  1             0             1E-07         32          0,00657058       [Union1012], [Union1013], [Union1014], [Union1015], [Union1016], [Union1017]  NULL     PLAN_ROW                                                         0        1
0                    1                           |--Nested Loops(Inner Join, OUTER REFERENCES:([id].[ID]))                                                                                                                                                                                                                        1           3           2           Nested Loops                   Inner Join                     OUTER REFERENCES:([id].[ID])                                                                                                                                                                                                                                       NULL                                                                                                                                                                                                                                                      1             0             4,18E-06      32          0,00657048       [m].[DataID], [m].[Time], [m].[Val], [m].[Status], [Union1012], [Union1013]   NULL     PLAN_ROW                                                         0        1
0                    0                                |--Compute Scalar(DEFINE:([Union1012]=[Test].[dbo].[MyData].[code] as [id].[code], [Union1013]=[Test].[dbo].[MyData].[Range] as [id].[Range]))                                                                                                                              1           4           3           Compute Scalar                 Compute Scalar                 DEFINE:([Union1012]=[Test].[dbo].[MyData].[code] as [id].[code], [Union1013]=[Test].[dbo].[MyData].[Range] as [id].[Range])                                                                                                                                        [Union1012]=[Test].[dbo].[MyData].[code] as [id].[code], [Union1013]=[Test].[dbo].[MyData].[Range] as [id].[Range]                                                                                                                                        1             0             1E-07         16          0,0032832        [id].[ID], [Union1012], [Union1013]                                           NULL     PLAN_ROW                                                         0        1
0                    1                                |    |--Index Seek(OBJECT:([Test].[dbo].[MyData].[IX_MyData] AS [id]), SEEK:([id].[code]=(1) AND [id].[Range]=(3)) ORDERED FORWARD)                                                                                                                                         1           5           4           Index Seek                     Index Seek                     OBJECT:([Test].[dbo].[MyData].[IX_MyData] AS [id]), SEEK:([id].[code]=(1) AND [id].[Range]=(3)) ORDERED FORWARD                                                                                                                                                    [id].[ID], [id].[code], [id].[Range]                                                                                                                                                                                                                      1             0,003125      0,0001581     16          0,0032831        [id].[ID], [id].[code], [id].[Range]                                          NULL     PLAN_ROW                                                         0        1
0                    0                                |--Clustered Index Seek(OBJECT:([Test].[dbo].[MyDataMonth].[PK_MyDataMonth] AS [m]), SEEK:([m].[DataID]=[Test].[dbo].[MyData].[ID] as [id].[ID]) ORDERED FORWARD)                                                                                                           1           11          3           Clustered Index Seek           Clustered Index Seek           OBJECT:([Test].[dbo].[MyDataMonth].[PK_MyDataMonth] AS [m]), SEEK:([m].[DataID]=[Test].[dbo].[MyData].[ID] as [id].[ID]) ORDERED FORWARD                                                                                                                           [m].[DataID], [m].[Time], [m].[Val], [m].[Status]                                                                                                                                                                                                         1             0,003125      0,0001581     27          0,0032831        [m].[DataID], [m].[Time], [m].[Val], [m].[Status]                             NULL     PLAN_ROW                                                         0        1

29 сен 11, 19:48    [11358030]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение в хранимых процедурах при выборке из view в схеме сегментации  [new]
darkexpert
Member

Откуда:
Сообщений: 75
У меня recompile ничего не меняет:( по-прежнему шарим во всех таблицах
0	1	SELECT * FROM vwMyData WHERE (Code=@Code)and(Range=@Range) option (recompile)	1	1	0	NULL	NULL	NULL	NULL	3	NULL	NULL	NULL	0,01971288	NULL	NULL	SELECT	0	NULL
0	1	  |--Concatenation	1	2	1	Concatenation	Concatenation	NULL	[Union1012] = ([id].[code], [id].[code], [id].[code]), [Union1013] = ([id].[Range], [id].[Range], [id].[Range]), [Union1014] = ([m].[DataID], [m].[DataID], [m].[DataID]), [Union1015] = ([m].[Time], [m].[Time], [m].[Time]), [Union1016] = ([m].[Val], [m].[Val], [m].[Val]), [Union1017] = ([m].[Status], [m].[Status], [m].[Status])	3	0	3E-07	32	0,01971288	[Union1012], [Union1013], [Union1014], [Union1015], [Union1016], [Union1017]	NULL	PLAN_ROW	0	1
0	1	       |--Filter(WHERE:(STARTUP EXPR([@Range]=(3))))	1	3	2	Filter	Filter	WHERE:(STARTUP EXPR([@Range]=(3)))	NULL	1	0	4,18E-06	32	0,00657086	[id].[code], [id].[Range], [m].[DataID], [m].[Time], [m].[Val], [m].[Status]	NULL	PLAN_ROW	0	1
0	1	       |    |--Nested Loops(Inner Join, OUTER REFERENCES:([id].[ID]))	1	4	3	Nested Loops	Inner Join	OUTER REFERENCES:([id].[ID])	NULL	1	0	4,18E-06	32	0,00657086	[id].[code], [id].[Range], [m].[DataID], [m].[Time], [m].[Val], [m].[Status]	NULL	PLAN_ROW	0	1
0	1	       |         |--Index Seek(OBJECT:([Test2].[dbo].[MyData].[IX_MyData] AS [id]), SEEK:([id].[code]=[@Code] AND [id].[Range]=[@Range]),  WHERE:([Test2].[dbo].[MyData].[Range] as [id].[Range]=(3)) ORDERED FORWARD)	1	5	4	Index Seek	Index Seek	OBJECT:([Test2].[dbo].[MyData].[IX_MyData] AS [id]), SEEK:([id].[code]=[@Code] AND [id].[Range]=[@Range]),  WHERE:([Test2].[dbo].[MyData].[Range] as [id].[Range]=(3)) ORDERED FORWARD	[id].[ID], [id].[code], [id].[Range]	1	0,003125	0,0001581	16	0,0032831	[id].[ID], [id].[code], [id].[Range]	NULL	PLAN_ROW	0	1
0	0	       |         |--Clustered Index Seek(OBJECT:([Test2].[dbo].[MyDataMonth].[PK_MyDataMonth] AS [m]), SEEK:([m].[DataID]=[Test2].[dbo].[MyData].[ID] as [id].[ID]) ORDERED FORWARD)	1	6	4	Clustered Index Seek	Clustered Index Seek	OBJECT:([Test2].[dbo].[MyDataMonth].[PK_MyDataMonth] AS [m]), SEEK:([m].[DataID]=[Test2].[dbo].[MyData].[ID] as [id].[ID]) ORDERED FORWARD	[m].[DataID], [m].[Time], [m].[Val], [m].[Status]	1	0,003125	0,0001581	27	0,0032831	[m].[DataID], [m].[Time], [m].[Val], [m].[Status]	NULL	PLAN_ROW	0	1
0	1	       |--Filter(WHERE:(STARTUP EXPR([@Range]=(2))))	1	8	2	Filter	Filter	WHERE:(STARTUP EXPR([@Range]=(2)))	NULL	1	0	4,18E-06	32	0,00657086	[id].[code], [id].[Range], [m].[DataID], [m].[Time], [m].[Val], [m].[Status]	NULL	PLAN_ROW	0	1
0	0	       |    |--Nested Loops(Inner Join, OUTER REFERENCES:([id].[ID]))	1	9	8	Nested Loops	Inner Join	OUTER REFERENCES:([id].[ID])	NULL	1	0	4,18E-06	32	0,00657086	[id].[code], [id].[Range], [m].[DataID], [m].[Time], [m].[Val], [m].[Status]	NULL	PLAN_ROW	0	1
0	0	       |         |--Index Seek(OBJECT:([Test2].[dbo].[MyData].[IX_MyData] AS [id]), SEEK:([id].[code]=[@Code] AND [id].[Range]=[@Range]),  WHERE:([Test2].[dbo].[MyData].[Range] as [id].[Range]=(2)) ORDERED FORWARD)	1	10	9	Index Seek	Index Seek	OBJECT:([Test2].[dbo].[MyData].[IX_MyData] AS [id]), SEEK:([id].[code]=[@Code] AND [id].[Range]=[@Range]),  WHERE:([Test2].[dbo].[MyData].[Range] as [id].[Range]=(2)) ORDERED FORWARD	[id].[ID], [id].[code], [id].[Range]	1	0,003125	0,0001581	16	0,0032831	[id].[ID], [id].[code], [id].[Range]	NULL	PLAN_ROW	0	1
0	0	       |         |--Clustered Index Seek(OBJECT:([Test2].[dbo].[MyDataDay].[PK_MyDataDay] AS [m]), SEEK:([m].[DataID]=[Test2].[dbo].[MyData].[ID] as [id].[ID]) ORDERED FORWARD)	1	11	9	Clustered Index Seek	Clustered Index Seek	OBJECT:([Test2].[dbo].[MyDataDay].[PK_MyDataDay] AS [m]), SEEK:([m].[DataID]=[Test2].[dbo].[MyData].[ID] as [id].[ID]) ORDERED FORWARD	[m].[DataID], [m].[Time], [m].[Val], [m].[Status]	1	0,003125	0,0001581	27	0,0032831	[m].[DataID], [m].[Time], [m].[Val], [m].[Status]	NULL	PLAN_ROW	0	1
0	1	       |--Filter(WHERE:(STARTUP EXPR([@Range]=(1))))	1	13	2	Filter	Filter	WHERE:(STARTUP EXPR([@Range]=(1)))	NULL	1	0	4,18E-06	32	0,00657086	[id].[code], [id].[Range], [m].[DataID], [m].[Time], [m].[Val], [m].[Status]	NULL	PLAN_ROW	0	1
0	0	            |--Nested Loops(Inner Join, OUTER REFERENCES:([id].[ID]))	1	14	13	Nested Loops	Inner Join	OUTER REFERENCES:([id].[ID])	NULL	1	0	4,18E-06	32	0,00657086	[id].[code], [id].[Range], [m].[DataID], [m].[Time], [m].[Val], [m].[Status]	NULL	PLAN_ROW	0	1
0	0	                 |--Index Seek(OBJECT:([Test2].[dbo].[MyData].[IX_MyData] AS [id]), SEEK:([id].[code]=[@Code] AND [id].[Range]=[@Range]),  WHERE:([Test2].[dbo].[MyData].[Range] as [id].[Range]=(1)) ORDERED FORWARD)	1	15	14	Index Seek	Index Seek	OBJECT:([Test2].[dbo].[MyData].[IX_MyData] AS [id]), SEEK:([id].[code]=[@Code] AND [id].[Range]=[@Range]),  WHERE:([Test2].[dbo].[MyData].[Range] as [id].[Range]=(1)) ORDERED FORWARD	[id].[ID], [id].[code], [id].[Range]	1	0,003125	0,0001581	16	0,0032831	[id].[ID], [id].[code], [id].[Range]	NULL	PLAN_ROW	0	1
0	0	                 |--Clustered Index Seek(OBJECT:([Test2].[dbo].[MyDataHour].[PK_MyDataHour] AS [m]), SEEK:([m].[DataID]=[Test2].[dbo].[MyData].[ID] as [id].[ID]) ORDERED FORWARD)	1	16	14	Clustered Index Seek	Clustered Index Seek	OBJECT:([Test2].[dbo].[MyDataHour].[PK_MyDataHour] AS [m]), SEEK:([m].[DataID]=[Test2].[dbo].[MyData].[ID] as [id].[ID]) ORDERED FORWARD	[m].[DataID], [m].[Time], [m].[Val], [m].[Status]	1	0,003125	0,0001581	27	0,0032831	[m].[DataID], [m].[Time], [m].[Val], [m].[Status]	NULL	PLAN_ROW	0	1
29 сен 11, 21:18    [11358306]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение в хранимых процедурах при выборке из view в схеме сегментации  [new]
iljy
Member

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

а чего в плане смущает-то? Что такое Filter Startup Expression знаете? Смотрите актуальные планы и количество реальных выполнений.
29 сен 11, 21:21    [11358316]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение в хранимых процедурах при выборке из view в схеме сегментации  [new]
Crimean
Member

Откуда:
Сообщений: 13147
совет для попробовать
привнести поле range в таблицы
включить его в ПК
повесить на него check - да - поле будет константным для каждой из таблиц
представление от этого станет вести себя чуть по-другому, тем более у вас это поле в запросах фигурирует
29 сен 11, 21:25    [11358326]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение в хранимых процедурах при выборке из view в схеме сегментации  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31970
darkexpert
Проблема: сильно различается производительность при выборке через вьюшку (быстрее) и через процедуру (медленно).
Глянул планы: обомлел.
Версия то какая?
29 сен 11, 23:00    [11358723]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение в хранимых процедурах при выборке из view в схеме сегментации  [new]
darkexpert
Member

Откуда:
Сообщений: 75
alexeyvg
Версия то какая?

Microsoft SQL Server 2005 - 9.00.5057.00 (Intel X86) Mar 25 2011 13:50:04 Copyright (c) 1988-2005 Microsoft Corporation Developer Edition on Windows NT 6.1 (Build 7601: Service Pack 1)
29 сен 11, 23:29    [11358860]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение в хранимых процедурах при выборке из view в схеме сегментации  [new]
darkexpert
Member

Откуда:
Сообщений: 75
iljy
darkexpert,

а чего в плане смущает-то? Что такое Filter Startup Expression знаете? Смотрите актуальные планы и количество реальных выполнений.

Смущает то, что он все равно лезет в ненужные таблицы, показывает кол-во соответствующих на запрашиваемом интервале записей для других Range, хотя и не читает их. И скорость исполнения отличается, заметно на глаз. В реальной таблице часовых сейчас порядка 1 млрд записей, общий объем базы около 200 Gb. Хотел уж было сегментировать часовые еще по месяцам, но они нужны реально редко, в основном аналитика идет на сутках и месяцах
29 сен 11, 23:34    [11358873]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение в хранимых процедурах при выборке из view в схеме сегментации  [new]
iljy
Member

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

он никуда не лезет, вы же видете - том 0 записей! Он просто проверяет условие. В запросе он это условия проверяет при компиляции, а в процедуре - на может, и оставляет на период исполнения. Но съэкономленное на перекомпиляциях время явно перекрывает время этой проверки. Если уж настолько она вас смущает - вам уже сказали, добавьте OPTION(RECOMPILE).

А вообще - хрустальный шар подсказывает мне, что дело тут не в Range, а в Code. Но так ка данных нет, а реальные планы вы скрываете, проверить это не могу.
30 сен 11, 00:45    [11359154]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение в хранимых процедурах при выборке из view в схеме сегментации  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31970
darkexpert
alexeyvg
Версия то какая?

Microsoft SQL Server 2005 - 9.00.5057.00 (Intel X86) Mar 25 2011 13:50:04 Copyright (c) 1988-2005 Microsoft Corporation Developer Edition on Windows NT 6.1 (Build 7601: Service Pack 1)
Вроде в 2008 решена эта проблема с работой сегментированных представлений при использовании переменных, конечно, при упомянутом Crimean создании check для таблиц.

Или в 2005-м была решена, и просто не выполнены какие то условия??? Что то не могу найти...
30 сен 11, 09:35    [11359607]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение в хранимых процедурах при выборке из view в схеме сегментации  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31970
darkexpert
И скорость исполнения отличается, заметно на глаз.
Вы лучьше в профайлере посмотрите, а не на глаз. Может, не такая уж большая разница, хотя на большом количестве таблиц наверное большая.
darkexpert
У меня recompile ничего не меняет
Вы точно на запросе опцию ставите, не на процедуре?
30 сен 11, 09:38    [11359626]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение в хранимых процедурах при выборке из view в схеме сегментации  [new]
darkexpert
Member

Откуда:
Сообщений: 75
alexeyvg
Вы точно на запросе опцию ставите, не на процедуре?

Точно.
30 сен 11, 14:03    [11362418]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить