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

есть секционированное представление.

если при выборке я задаю фильтр по дате через параметры, то сканируются все таблицы но идет index seek по нужному индексу, стоит мне сделать запрос без парамтеров, используются только те таблицы, в которых есть нужная дата, но скан идет как clustered index scan, в результате второй, вроде бы верный запрос отрабатывается медленнее. в чем может быть проблема?
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)

планы запросов

declare @d1 varchar(20),
        @d2 varchar(20)

select @d1 = '5/20/2009', @d2 = '5/25/2009'

SELECT	progid, 
	webid, 
	sum(hits) as clicks, 
	sum(impressions) as impressions, 
	sum(leads) as leads 
	from	hitsreport1_20090524 as hitsreport1 
	where	hitsreport1.afusername = 'Olga'			
            and hitsreport1.date between @d1 and @d2  
	group by 
	progid, 
           webid


  |--Parallelism(Gather Streams)
       |--Compute Scalar(DEFINE:([Expr1001]=If ([Expr1025]=0) then NULL else [Expr1026], [Expr1002]=If ([Expr1027]=0) then NULL else [Expr1028], [Expr1003]=If ([Expr1029]=0) then NULL else [Expr1030]))
            |--Hash Match(Aggregate, HASH:([hitsreport1].[progId], [hitsreport1].[webid]), RESIDUAL:([hitsreport1].[progId]=[hitsreport1].[progId] AND [hitsreport1].[webid]=[hitsreport1].[webid]) DEFINE:([Expr1025]=COUNT_BIG([hitsreport1].[hits]), [Expr1026]=SUM([hitsreport1].[hits]), [Expr1027]=COUNT_BIG([hitsreport1].[impressions]), [Expr1028]=SUM([hitsreport1].[impressions]), [Expr1029]=COUNT_BIG([hitsreport1].[leads]), [Expr1030]=SUM([hitsreport1].[leads])))
                 |--Parallelism(Repartition Streams, PARTITION COLUMNS:([hitsreport1].[progId], [hitsreport1].[webid]))
                      |--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([DBCAFF].[dbo].[hitsreport1_20090524] AS [hitsreport1]) WITH PREFETCH)
                           |--Filter(WHERE:(STARTUP EXPR(Convert([@d2])>='May 16 2009 12:00AM' AND Convert([@d1])<'May 24 2009 12:00AM')))
                                |--Index Seek(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090524].[IX_hitsreport1_20090524] AS [hitsreport1]), SEEK:([hitsreport1].[afusername]='Olga'),  WHERE:([hitsreport1].[date]<=Convert([@d2]) AND [hitsreport1].[date]>=Convert([@d1])) ORDERED FORWARD)

второй

SELECT	progid, 
	webid, 
	sum(hits) as clicks, 
	sum(impressions) as impressions, 
	sum(leads) as leads 
	from	hitsreport1_20090524 as hitsreport1 
	where	hitsreport1.afusername = 'Olga'			
           and hitsreport1.date between '5/20/2009' and '5/25/2009' 
           group by 
	progid, 
	webid

  |--Parallelism(Gather Streams)
       |--Compute Scalar(DEFINE:([Expr1001]=If ([Expr1022]=0) then NULL else [Expr1023], [Expr1002]=If ([Expr1024]=0) then NULL else [Expr1025], [Expr1003]=If ([Expr1026]=0) then NULL else [Expr1027]))
            |--Hash Match(Aggregate, HASH:([hitsreport1].[progId], [hitsreport1].[webid]), RESIDUAL:([hitsreport1].[progId]=[hitsreport1].[progId] AND [hitsreport1].[webid]=[hitsreport1].[webid]) DEFINE:([Expr1022]=COUNT_BIG([hitsreport1].[hits]), [Expr1023]=SUM([hitsreport1].[hits]), [Expr1024]=COUNT_BIG([hitsreport1].[impressions]), [Expr1025]=SUM([hitsreport1].[impressions]), [Expr1026]=COUNT_BIG([hitsreport1].[leads]), [Expr1027]=SUM([hitsreport1].[leads])))
                 |--Parallelism(Repartition Streams, PARTITION COLUMNS:([hitsreport1].[progId], [hitsreport1].[webid]))
                      |--Clustered Index Scan(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090524].[PK_hitsreport1_20090524] AS [hitsreport1]), WHERE:([hitsreport1].[date]>='May 20 2009 12:00AM' AND [hitsreport1].[afusername]='Olga'))

25 май 09, 16:37    [7224169]     Ответить | Цитировать Сообщить модератору
 Re: partitioned view and indexes  [new]
Mayh
Guest
Сори, написал применительно к одной таблице а не к вьюшке, но тем не менее, вопрос остается в силе.
25 май 09, 16:47    [7224255]     Ответить | Цитировать Сообщить модератору
 Re: partitioned view and indexes  [new]
Glory
Member

Откуда:
Сообщений: 104760
Для переменных и констант оптимизатор может использовать разные планы. Он так устроен.
И по-моему ваши планы от других запросов. Потому что даты из планов не совпадают с датами из запросов
25 май 09, 16:54    [7224296]     Ответить | Цитировать Сообщить модератору
 Re: partitioned view and indexes  [new]
Mayh
Guest
Glory
Для переменных и констант оптимизатор может использовать разные планы. Он так устроен.
И по-моему ваши планы от других запросов. Потому что даты из планов не совпадают с датами из запросов


Планы верные, на таблице hitsreport1_20090524 есть check по дате (она входит в секционированное представлнеие) его он и использует в плане.
вопрос - можно ли оптимизатору подсказать использовать индекс IX_hitsreport1_20090524? для одной таблицы можно, но есть ли возможность подсказать для всей view?
25 май 09, 17:01    [7224340]     Ответить | Цитировать Сообщить модератору
 Re: partitioned view and indexes  [new]
Glory
Member

Откуда:
Сообщений: 104760
Mayh
Glory
Для переменных и констант оптимизатор может использовать разные планы. Он так устроен.
И по-моему ваши планы от других запросов. Потому что даты из планов не совпадают с датами из запросов


Планы верные, на таблице hitsreport1_20090524 есть check по дате (она входит в секционированное представлнеие) его он и использует в плане.
вопрос - можно ли оптимизатору подсказать использовать индекс IX_hitsreport1_20090524? для одной таблицы можно, но есть ли возможность подсказать для всей view?

Мне кажется, что у вас просто неправильно построено секциионированное представление.
Вернее даже неизвсестно, как вы вообще его построили и соответствует ли секции тем запросам, что вы хотите использовать
25 май 09, 17:06    [7224369]     Ответить | Цитировать Сообщить модератору
 Re: partitioned view and indexes  [new]
Mayh
Guest
вот план по всему представлению


declare @d1 varchar(20),
        @d2 varchar(20)

select @d1 = '5/20/2009', @d2 = '5/25/2009'

SELECT	progid, 
	webid, 
	sum(hits) as clicks, 
	sum(impressions) as impressions, 
	sum(leads) as leads 
	from	hitsreport1 
	where	hitsreport1.afusername = 'Olga'			
            and hitsreport1.date between @d1 and @d2
	group by 
	progid, 
           webid


  |--Compute Scalar(DEFINE:([Expr1254]=If ([globalagg1260]=0) then NULL else [globalagg1262], [Expr1255]=If ([globalagg1264]=0) then NULL else [globalagg1266], [Expr1256]=If ([globalagg1268]=0) then NULL else [globalagg1270]))
       |--Parallelism(Gather Streams)
            |--Stream Aggregate(GROUP BY:([hitsreport1_20090208].[webid], [hitsreport1_20090208].[progId]) DEFINE:([globalagg1260]=SUM([partialagg1259]), [globalagg1262]=SUM([partialagg1261]), [globalagg1264]=SUM([partialagg1263]), [globalagg1266]=SUM([partialagg1265]), [globalagg1268]=SUM([partialagg1267]), [globalagg1270]=SUM([partialagg1269])))
                 |--Sort(ORDER BY:([hitsreport1_20090208].[webid] ASC, [hitsreport1_20090208].[progId] ASC))
                      |--Parallelism(Repartition Streams, PARTITION COLUMNS:([hitsreport1_20090208].[webid], [hitsreport1_20090208].[progId]))
                           |--Hash Match(Partial Aggregate, HASH:([hitsreport1_20090208].[progId], [hitsreport1_20090208].[webid]), RESIDUAL:([hitsreport1_20090208].[progId]=[hitsreport1_20090208].[progId] AND [hitsreport1_20090208].[webid]=[hitsreport1_20090208].[webid]) DEFINE:([partialagg1259]=COUNT_BIG([hitsreport1_20090208].[hits]), [partialagg1261]=SUM([hitsreport1_20090208].[hits]), [partialagg1263]=COUNT_BIG([hitsreport1_20090208].[impressions]), [partialagg1265]=SUM([hitsreport1_20090208].[impressions]), [partialagg1267]=COUNT_BIG([hitsreport1_20090208].[leads]), [partialagg1269]=SUM([hitsreport1_20090208].[leads])))
                                |--Table Spool
                                     |--Filter(WHERE:(STARTUP EXPR(Convert([@d1])<'Feb  8 2009 12:00AM' AND Convert([@d2])>='Feb  1 2009 12:00AM')))
                                     |    |--Clustered Index Scan(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090208].[PK_hitsreport1_20090208]), WHERE:(([hitsreport1_20090208].[date]>=Convert([@d1]) AND [hitsreport1_20090208].[date]<=Convert([@d2])) AND [hitsreport1_20090208].[afusername]='Olga'))
                                     |--Filter(WHERE:(STARTUP EXPR(Convert([@d1])<'Feb 16 2009 12:00AM' AND Convert([@d2])>='Feb  8 2009 12:00AM')))
                                     |    |--Clustered Index Scan(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090216].[PK_hitsreport1_20090216]), WHERE:(([hitsreport1_20090216].[date]>=Convert([@d1]) AND [hitsreport1_20090216].[date]<=Convert([@d2])) AND [hitsreport1_20090216].[afusername]='Olga'))
                                     |--Filter(WHERE:(STARTUP EXPR(Convert([@d1])<'Feb 24 2009 12:00AM' AND Convert([@d2])>='Feb 16 2009 12:00AM')))
                                     |    |--Clustered Index Scan(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090224].[PK_hitsreport1_20090224]), WHERE:(([hitsreport1_20090224].[date]>=Convert([@d1]) AND [hitsreport1_20090224].[date]<=Convert([@d2])) AND [hitsreport1_20090224].[afusername]='Olga'))
                                     |--Filter(WHERE:(STARTUP EXPR(Convert([@d1])<'Mar  1 2009 12:00AM' AND Convert([@d2])>='Feb 24 2009 12:00AM')))
                                     |    |--Clustered Index Scan(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090301].[PK_hitsreport1_20090301]), WHERE:(([hitsreport1_20090301].[date]>=Convert([@d1]) AND [hitsreport1_20090301].[date]<=Convert([@d2])) AND [hitsreport1_20090301].[afusername]='Olga'))
                                     |--Bookmark Lookup(BOOKMARK:([Bmk1044]), OBJECT:([DBCAFF].[dbo].[hitsreport1_20090308]) WITH PREFETCH)
                                     |    |--Filter(WHERE:(STARTUP EXPR(Convert([@d2])>='Mar  1 2009 12:00AM' AND Convert([@d1])<'Mar  8 2009 12:00AM')))
                                     |         |--Index Seek(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090308].[IX_hitsreport1_20090308]), SEEK:([hitsreport1_20090308].[afusername]='Olga'),  WHERE:([hitsreport1_20090308].[date]<=Convert([@d2]) AND [hitsreport1_20090308].[date]>=Convert([@d1])) ORDERED FORWARD)
                                     |--Bookmark Lookup(BOOKMARK:([Bmk1058]), OBJECT:([DBCAFF].[dbo].[hitsreport1_20090316]) WITH PREFETCH)
                                     |    |--Filter(WHERE:(STARTUP EXPR(Convert([@d2])>='Mar  8 2009 12:00AM' AND Convert([@d1])<'Mar 16 2009 12:00AM')))
                                     |         |--Index Seek(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090316].[IX_hitsreport1_20090316]), SEEK:([hitsreport1_20090316].[afusername]='Olga'),  WHERE:([hitsreport1_20090316].[date]<=Convert([@d2]) AND [hitsreport1_20090316].[date]>=Convert([@d1])) ORDERED FORWARD)
                                     |--Bookmark Lookup(BOOKMARK:([Bmk1072]), OBJECT:([DBCAFF].[dbo].[hitsreport1_20090324]) WITH PREFETCH)
                                     |    |--Filter(WHERE:(STARTUP EXPR(Convert([@d2])>='Mar 16 2009 12:00AM' AND Convert([@d1])<'Mar 24 2009 12:00AM')))
                                     |         |--Index Seek(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090324].[IX_hitsreport1_20090324]), SEEK:([hitsreport1_20090324].[afusername]='Olga'),  WHERE:([hitsreport1_20090324].[date]<=Convert([@d2]) AND [hitsreport1_20090324].[date]>=Convert([@d1])) ORDERED FORWARD)
                                     |--Bookmark Lookup(BOOKMARK:([Bmk1086]), OBJECT:([DBCAFF].[dbo].[hitsreport1_20090401]) WITH PREFETCH)
                                     |    |--Filter(WHERE:(STARTUP EXPR(Convert([@d2])>='Mar 24 2009 12:00AM' AND Convert([@d1])<'Apr  1 2009 12:00AM')))
                                     |         |--Index Seek(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090401].[IX_hitsreport1_20090401]), SEEK:([hitsreport1_20090401].[afusername]='Olga'),  WHERE:([hitsreport1_20090401].[date]<=Convert([@d2]) AND [hitsreport1_20090401].[date]>=Convert([@d1])) ORDERED FORWARD)
                                     |--Bookmark Lookup(BOOKMARK:([Bmk1100]), OBJECT:([DBCAFF].[dbo].[hitsreport1_20090408]) WITH PREFETCH)
                                     |    |--Filter(WHERE:(STARTUP EXPR(Convert([@d2])>='Apr  1 2009 12:00AM' AND Convert([@d1])<'Apr  8 2009 12:00AM')))
                                     |         |--Index Seek(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090408].[IX_hitsreport1_20090408]), SEEK:([hitsreport1_20090408].[afusername]='Olga'),  WHERE:([hitsreport1_20090408].[date]<=Convert([@d2]) AND [hitsreport1_20090408].[date]>=Convert([@d1])) ORDERED FORWARD)
                                     |--Filter(WHERE:(STARTUP EXPR(Convert([@d1])<'Apr 16 2009 12:00AM' AND Convert([@d2])>='Apr  8 2009 12:00AM')))
                                     |    |--Clustered Index Scan(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090416].[PK_hitsreport1_20090416]), WHERE:(([hitsreport1_20090416].[date]>=Convert([@d1]) AND [hitsreport1_20090416].[date]<=Convert([@d2])) AND [hitsreport1_20090416].[afusername]='Olga'))
                                     |--Bookmark Lookup(BOOKMARK:([Bmk1128]), OBJECT:([DBCAFF].[dbo].[hitsreport1_20090424]) WITH PREFETCH)
                                     |    |--Filter(WHERE:(STARTUP EXPR(Convert([@d2])>='Apr 16 2009 12:00AM' AND Convert([@d1])<'Apr 24 2009 12:00AM')))
                                     |         |--Index Seek(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090424].[IX_hitsreport1_20090424]), SEEK:([hitsreport1_20090424].[afusername]='Olga'),  WHERE:([hitsreport1_20090424].[date]<=Convert([@d2]) AND [hitsreport1_20090424].[date]>=Convert([@d1])) ORDERED FORWARD)
                                     |--Bookmark Lookup(BOOKMARK:([Bmk1142]), OBJECT:([DBCAFF].[dbo].[hitsreport1_20090501]) WITH PREFETCH)
                                     |    |--Filter(WHERE:(STARTUP EXPR(Convert([@d2])>='Apr 24 2009 12:00AM' AND Convert([@d1])<'May  1 2009 12:00AM')))
                                     |         |--Index Seek(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090501].[IX_hitsreport1_20090501]), SEEK:([hitsreport1_20090501].[afusername]='Olga'),  WHERE:([hitsreport1_20090501].[date]<=Convert([@d2]) AND [hitsreport1_20090501].[date]>=Convert([@d1])) ORDERED FORWARD)
                                     |--Bookmark Lookup(BOOKMARK:([Bmk1156]), OBJECT:([DBCAFF].[dbo].[hitsreport1_20090508]) WITH PREFETCH)
                                     |    |--Filter(WHERE:(STARTUP EXPR(Convert([@d2])>='May  1 2009 12:00AM' AND Convert([@d1])<'May  8 2009 12:00AM')))
                                     |         |--Index Seek(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090508].[IX_hitsreport1_20090508]), SEEK:([hitsreport1_20090508].[afusername]='Olga'),  WHERE:([hitsreport1_20090508].[date]<=Convert([@d2]) AND [hitsreport1_20090508].[date]>=Convert([@d1])) ORDERED FORWARD)
                                     |--Bookmark Lookup(BOOKMARK:([Bmk1170]), OBJECT:([DBCAFF].[dbo].[hitsreport1_20090516]) WITH PREFETCH)
                                     |    |--Filter(WHERE:(STARTUP EXPR(Convert([@d2])>='May  8 2009 12:00AM' AND Convert([@d1])<'May 16 2009 12:00AM')))
                                     |         |--Index Seek(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090516].[IX_hitsreport1_20090516]), SEEK:([hitsreport1_20090516].[afusername]='Olga'),  WHERE:([hitsreport1_20090516].[date]<=Convert([@d2]) AND [hitsreport1_20090516].[date]>=Convert([@d1])) ORDERED FORWARD)
                                     |--Bookmark Lookup(BOOKMARK:([Bmk1184]), OBJECT:([DBCAFF].[dbo].[hitsreport1_20090524]) WITH PREFETCH)
                                     |    |--Filter(WHERE:(STARTUP EXPR(Convert([@d2])>='May 16 2009 12:00AM' AND Convert([@d1])<'May 24 2009 12:00AM')))
                                     |         |--Index Seek(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090524].[IX_hitsreport1_20090524]), SEEK:([hitsreport1_20090524].[afusername]='Olga'),  WHERE:([hitsreport1_20090524].[date]<=Convert([@d2]) AND [hitsreport1_20090524].[date]>=Convert([@d1])) ORDERED FORWARD)
                                     |--Bookmark Lookup(BOOKMARK:([Bmk1198]), OBJECT:([DBCAFF].[dbo].[hitsreport1_20090601]) WITH PREFETCH)
                                     |    |--Filter(WHERE:(STARTUP EXPR(Convert([@d2])>='May 24 2009 12:00AM' AND Convert([@d1])<'Jun  1 2009 12:00AM')))
                                     |         |--Index Seek(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090601].[IX_hitsreport1_20090601]), SEEK:([hitsreport1_20090601].[afusername]='Olga'),  WHERE:([hitsreport1_20090601].[date]<=Convert([@d2]) AND [hitsreport1_20090601].[date]>=Convert([@d1])) ORDERED FORWARD)
                                     |--Bookmark Lookup(BOOKMARK:([Bmk1212]), OBJECT:([DBCAFF].[dbo].[hitsreport1_20090608]))
                                     |    |--Parallelism(Distribute Streams)
                                     |         |--Filter(WHERE:(STARTUP EXPR(Convert([@d1])<'Jun  8 2009 12:00AM' AND Convert([@d2])>='Jun  1 2009 12:00AM')))
                                     |              |--Index Seek(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090608].[IX_hitsreport1_20090608]), SEEK:([hitsreport1_20090608].[afusername]='Olga'),  WHERE:([hitsreport1_20090608].[date]>=Convert([@d1]) AND [hitsreport1_20090608].[date]<=Convert([@d2])) ORDERED FORWARD)
                                     |--Bookmark Lookup(BOOKMARK:([Bmk1226]), OBJECT:([DBCAFF].[dbo].[hitsreport1_20090616]))
                                     |    |--Parallelism(Distribute Streams)
                                     |         |--Filter(WHERE:(STARTUP EXPR(Convert([@d1])<'Jun 16 2009 12:00AM' AND Convert([@d2])>='Jun  8 2009 12:00AM')))
                                     |              |--Index Seek(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090616].[IX_hitsreport1_20090616]), SEEK:([hitsreport1_20090616].[afusername]='Olga'),  WHERE:([hitsreport1_20090616].[date]>=Convert([@d1]) AND [hitsreport1_20090616].[date]<=Convert([@d2])) ORDERED FORWARD)
                                     |--Bookmark Lookup(BOOKMARK:([Bmk1240]), OBJECT:([DBCAFF].[dbo].[hitsreport1_20090624]))
                                          |--Parallelism(Distribute Streams)
                                               |--Filter(WHERE:(STARTUP EXPR(Convert([@d1])<'Jun 24 2009 12:00AM' AND Convert([@d2])>='Jun 16 2009 12:00AM')))
                                                    |--Index Seek(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090624].[IX_hitsreport1_20090624]), SEEK:([hitsreport1_20090624].[afusername]='Olga'),  WHERE:([hitsreport1_20090624].[date]>=Convert([@d1]) AND [hitsreport1_20090624].[date]<=Convert([@d2])) ORDERED FORWARD)


и второй


SELECT	progid, 
	webid, 
	sum(hits) as clicks, 
	sum(impressions) as impressions, 
	sum(leads) as leads 
	from	hitsreport1 
	where	hitsreport1.afusername = 'Olga'			
            and hitsreport1.date between '5/20/2009' and '5/25/2009'  
	group by 
	progid, 
           webid


  |--Parallelism(Gather Streams)
       |--Compute Scalar(DEFINE:([Expr1254]=If ([Expr1269]=0) then NULL else [Expr1270], [Expr1255]=If ([Expr1271]=0) then NULL else [Expr1272], [Expr1256]=If ([Expr1273]=0) then NULL else [Expr1274]))
            |--Hash Match(Aggregate, HASH:([Union1245], [Union1246]), RESIDUAL:([Union1245]=[Union1245] AND [Union1246]=[Union1246]) DEFINE:([Expr1269]=COUNT_BIG([Union1248]), [Expr1270]=SUM([Union1248]), [Expr1271]=COUNT_BIG([Union1250]), [Expr1272]=SUM([Union1250]), [Expr1273]=COUNT_BIG([Union1249]), [Expr1274]=SUM([Union1249])))
                 |--Concatenation
                      |--Parallelism(Repartition Streams, PARTITION COLUMNS:([hitsreport1_20090524].[progId], [hitsreport1_20090524].[webid]))
                      |    |--Clustered Index Scan(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090524].[PK_hitsreport1_20090524]), WHERE:([hitsreport1_20090524].[date]>='May 20 2009 12:00AM' AND [hitsreport1_20090524].[afusername]='Olga'))
                      |--Parallelism(Repartition Streams, PARTITION COLUMNS:([hitsreport1_20090601].[progId], [hitsreport1_20090601].[webid]))
                           |--Clustered Index Scan(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090601].[PK_hitsreport1_20090601]), WHERE:([hitsreport1_20090601].[date]<='May 25 2009 12:00AM' AND [hitsreport1_20090601].[afusername]='Olga'))


в первом мне непонятен фильтр по дате - в разных таблицах он разный.
есть 
                                     |--Filter(WHERE:(STARTUP EXPR(Convert([@d1])<'Feb 16 2009 12:00AM' AND Convert([@d2])>='Feb  8 2009 12:00AM')))
                                     |    |--Clustered Index Scan(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090216].[PK_hitsreport1_20090216]), WHERE:(([hitsreport1_20090216].[date]>=Convert([@d1]) AND [hitsreport1_20090216].[date]<=Convert([@d2])) AND [hitsreport1_20090216].[afusername]='Olga'))

и есть

                                     |    |--Filter(WHERE:(STARTUP EXPR(Convert([@d2])>='Mar  1 2009 12:00AM' AND Convert([@d1])<'Mar  8 2009 12:00AM')))
                                     |         |--Index Seek(OBJECT:([DBCAFF].[dbo].[hitsreport1_20090308].[IX_hitsreport1_20090308]), SEEK:([hitsreport1_20090308].[afusername]='Olga'),  WHERE:([hitsreport1_20090308].[date]<=Convert([@d2]) AND [hitsreport1_20090308].[date]>=Convert([@d1])) ORDERED FORWARD)


поменяны местами бОльшая и меньшая даты.

вот констрейны на эти таблицы

ALTER TABLE [dbo].[hitsreport1_20090216]  WITH CHECK ADD  CONSTRAINT [CK_hitsreport1_20090216] CHECK  (([date] >= '2009-02-08' and [date] < '2009-02-16'))

ALTER TABLE [dbo].[hitsreport1_20090308]  WITH CHECK ADD  CONSTRAINT [CK_hitsreport1_20090308] CHECK  (([date] >= '2009-03-01' and [date] < '2009-03-08'))



других констрейнтов нет.
непонятно, почему фильтр так подставляет даты странно?
25 май 09, 17:37    [7224634]     Ответить | Цитировать Сообщить модератору
 Re: partitioned view and indexes  [new]
Glory
Member

Откуда:
Сообщений: 104760
Поле [date] какой тип имеет ?
25 май 09, 17:42    [7224671]     Ответить | Цитировать Сообщить модератору
 Re: partitioned view and indexes  [new]
Mayh
Guest
Glory
Поле [date] какой тип имеет ?


по такой схеме созданы все таблицы
CREATE TABLE [dbo].[hitsreport1_20090208](
	[hour] [smallint] NOT NULL,
	[date] [smalldatetime] NOT NULL,
	[afusername] [varchar](50) NULL,
	[progId] [int] NULL,
	[webid] [int] NULL,
	[banners] [int] NULL,
	[hits] [int] NULL,
	[leads] [int] NULL,
	[impressions] [int] NULL,
	[hrid] [uniqueidentifier] NOT NULL,
	[datetimeIDv2] [bigint] NULL,
	[hitid] [uniqueidentifier] NULL,
 CONSTRAINT [PK_hitsreport1_20090208] PRIMARY KEY CLUSTERED 
(
	[hour] ASC,
	[date] ASC,
	[hrid] ASC
)
) ON [PRIMARY]

25 май 09, 17:49    [7224731]     Ответить | Цитировать Сообщить модератору
 Re: partitioned view and indexes  [new]
Glory
Member

Откуда:
Сообщений: 104760
[date] [smalldatetime]
А почему тогда переменные и константы имеют другой тип данных ?
25 май 09, 17:52    [7224746]     Ответить | Цитировать Сообщить модератору
 Re: partitioned view and indexes  [new]
Mayh
Guest
Glory
[date] [smalldatetime]
А почему тогда переменные и константы имеют другой тип данных ?


пробовал и такой вариант как hitsreport1.date between '2009-05-20 10:00:00' and '2009-05-25 10:00:00', и переменные делал smalldatetime.
результат не меняется.
25 май 09, 18:03    [7224819]     Ответить | Цитировать Сообщить модератору
 Re: partitioned view and indexes  [new]
Crimean
Member

Откуда:
Сообщений: 13148
там явные касты везде поставить бы. в констрейнтах - тоже, кстати, а то мало ли что
25 май 09, 18:06    [7224845]     Ответить | Цитировать Сообщить модератору
 Re: partitioned view and indexes  [new]
Crimean
Member

Откуда:
Сообщений: 13148
P.S.

и - да - при работе с переменными в плане будут все секции, всегда. не нравится - апайте
https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=453075
примеров много можно нарисовать. вот так, к примеру:

use tempdb
go

set nocount on
go

create function dbo.f1( @i int )
returns table
as
return
(		select top 10 1 as row, id, name from sysobjects where @i = 1
union all	select top 10 2 as row, id, name from sysobjects where @i = 2
union all	select top 10 3 as row, id, name from sysobjects where @i = 3
)
go

set showplan_text on
go

select * from dbo.f1( 1 )
go

declare @i int; set @i = 1;
select * from dbo.f1( @i )
go

set showplan_text off
go

drop function dbo.f1
go

в результате:

StmtText                      
----------------------------- 

select * from dbo.f1( 1 )

(1 row(s) affected)

StmtText                                                                                                                  
------------------------------------------------------------------------------------------------------------------------- 
  |--Compute Scalar(DEFINE:([Expr1002]=1, [sysobjects].[id]=[sysobjects].[id], [sysobjects].[name]=[sysobjects].[name]))
       |--Top(10)
            |--Clustered Index Scan(OBJECT:([tempdb].[dbo].[sysobjects].[sysobjects]))

(3 row(s) affected)

StmtText                       
------------------------------ 

declare @i int; set @i = 1;

select * from dbo.f1( @i )

(2 row(s) affected)

StmtText                                                                             
------------------------------------------------------------------------------------ 
  |--Concatenation
       |--Top(10)
       |    |--Filter(WHERE:(STARTUP EXPR([@i]=1)))
       |         |--Index Scan(OBJECT:([tempdb].[dbo].[sysobjects].[ncsysobjects]))
       |--Top(10)
       |    |--Filter(WHERE:(STARTUP EXPR([@i]=2)))
       |         |--Index Scan(OBJECT:([tempdb].[dbo].[sysobjects].[ncsysobjects]))
       |--Top(10)
            |--Filter(WHERE:(STARTUP EXPR([@i]=3)))
                 |--Index Scan(OBJECT:([tempdb].[dbo].[sysobjects].[ncsysobjects]))

(10 row(s) affected)

как видно, при указании "параметра" видим все 3 секции
25 май 09, 18:41    [7225011]     Ответить | Цитировать Сообщить модератору
 Re: partitioned view and indexes  [new]
Mayh
Guest
Crimean
там явные касты везде поставить бы. в констрейнтах - тоже, кстати, а то мало ли что


самое интересное, что сканит только две таблицы в представлении по нужному индексу при таком запросе.


declare @d1 varchar(20),
        @d2 varchar(20)

select @d1 = '2009-05-20 10:00:00', @d2 = '2009-05-25 10:00:00'

SELECT	progid, 
	webid, 
	sum(hits) as clicks, 
	sum(impressions) as impressions, 
	sum(leads) as leads 
	from	hitsreport1 
	where	hitsreport1.afusername = 'Olga'			
            and hitsreport1.date between @d1 and @d2
            and hitsreport1.date between cast('2009-05-20 10:00:00' as smalldatetime) and cast( '2009-05-25 10:00:00' as smalldatetime)
	group by 
	progid, 
           webid

25 май 09, 18:42    [7225019]     Ответить | Цитировать Сообщить модератору
 Re: partitioned view and indexes  [new]
Mayh
Guest
Crimean
P.S.

и - да - при работе с переменными в плане будут все секции, всегда. не нравится - апайте
https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=453075
примеров много можно нарисовать. вот ...


Собственно, из-за этого я и открыл тему - хотел переписать используя динамические запросы, в результате планы стали только хуже.
25 май 09, 18:45    [7225033]     Ответить | Цитировать Сообщить модератору
 Re: partitioned view and indexes  [new]
Crimean
Member

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


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

был бы хинт для запросов какой-нить, чтоп план запроса по значению переменных строил
потому как option (recompile) не совсем то, а точнее - совсем не то :)

перечитав всю тему

а почему дата в ПК не первая стоит? я что-то не вижу обращений к таблице по "hour"
да и логично критерий секционирования поставить первым хоть в какой-то индекс
разумеется, формально условия секционирования выполнены, но для выполнения запроса идет полный скан индекса с применением фильтра и последующим соединением насканеного

опять же, просится индекс как минимум по afusername
если ПК не трогать, то afusername + date
25 май 09, 18:58    [7225089]     Ответить | Цитировать Сообщить модератору
 Re: partitioned view and indexes  [new]
Mayh
Guest
Crimean

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

был бы хинт для запросов какой-нить, чтоп план запроса по значению переменных строил
потому как option (recompile) не совсем то, а точнее - совсем не то :)

перечитав всю тему

а почему дата в ПК не первая стоит? я что-то не вижу обращений к таблице по "hour"
да и логично критерий секционирования поставить первым хоть в какой-то индекс
разумеется, формально условия секционирования выполнены, но для выполнения запроса идет полный скан индекса с применением фильтра и последующим соединением насканеного

опять же, просится индекс как минимум по afusername
если ПК не трогать, то afusername + date



Вы считаете, что если я поставлю дату в ПК первой, то будет не scan а seek? индекс по afusername есть, как раз при параметрическом запросе по нему идет index seek, но в некоторых таблицах (согласно плану), там где в фильтре идет сначала бОльшая дата а потом меньшая, идет уже скан не посредственно кластерного индекса, и вот как раз он и тормозит всю выборку в целом.
25 май 09, 19:08    [7225128]     Ответить | Цитировать Сообщить модератору
 Re: partitioned view and indexes  [new]
Crimean
Member

Откуда:
Сообщений: 13148
2 Mayh

я не знаю всю вашу базу. поэтому предложил "для попробовать" 2 варианта :)
25 май 09, 20:12    [7225361]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить