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

Откуда: Israel
Сообщений: 5500
Прежде чем наломать дров с partitioned view, хотел бы выяснить несколько вопросов.
1. Можно ли расчитать оптимальное количество секций. Т.е. в таблице (десятки млн записей) есть дата за несколько лет. Разделить ее по годам или, лучше, по какому-то другому критерию?

2. В исходной таблице создано 5 индексов и с десяток статистик. Стоит ли все индексы и статистики переносить и в секции? Или можно подойти к этому вопросу более рационально?

3. В исходной таблице есть поле счетчика - уникальный индекс. Понятно, что в partitioned view счетчик не прокатит. Но в процедурах это поле участвует во многих местах. Хотелось бы миминизировать изменения в процедурах. Возможно ли это и какие способы существуют.
9 июн 09, 16:43    [7282035]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по partitioned view  [new]
Crimean
Member

Откуда:
Сообщений: 13147
секционировать таблицу с применением функций секционирования или сделать несколько таблиц и накрыть их представлением? это два разных механизма, не очень понятно какой нужен (1)
и (2) - секционирование дает накладные расходы. окупится только если в большинстве запросов ПОТОМ будет ЯВНО указан критерий секционирования. в противном случае запросы "потяжелеют", "облегчится" только администрирование
(3) критерий - чисто прикладушный выбор, никто тут ничо не подскажет, только способы решения проблем
(4) требования к обоим способам оч доступно и детально указаны в БОЛ. точнее к секционированным представлениям требования. а таблицу функцией + схемой по файлгруппам разложить - любую можно
9 июн 09, 17:39    [7282451]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по partitioned view  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5500
Crimean,
1. Ввиду имелось, конечно, разделение существующей таблицы не несколько новых с введением дополнительного CHECK индекса, который и определит секционность в создаваемом partitioned view

2.
автор
секционирование дает накладные расходы...

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

3. Третий свой вопрос снимаю. Поскольку все операции ввода данных идут через процедуру, создание своего счетчика не представляет трудностей.
10 июн 09, 09:49    [7284039]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по partitioned view  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Rivkin Dmitry
Если секции представляют данные, привязаные к определенному году, означает ли это, что запросы, в которых есть фильтр по дате в пределах одного года, будут работать быстрее, а запросы, в которых такой фильтр отсутствует или есть фильтр содержащий дату из более чем одного года, напротив, станут работать медленее (при тех же самых индексах)?


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

а почему именно view? упрощение сопровождения? sql 2000?
10 июн 09, 10:42    [7284307]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по partitioned view  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5500
Crimean
а почему именно view? упрощение сопровождения? sql 2000?

Нет не 2000 - 2005 но Standard Edition пока...
10 июн 09, 11:04    [7284454]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по partitioned view  [new]
Crimean
Member

Откуда:
Сообщений: 13147
просто с партициями больше "вкусностей" но и больше сложностей. а с таблицами конечно все оч просто, но на полученное представление потом много ограничений - я бы проверил сразу все запросы, кой-чего может надо будет переписать
10 июн 09, 11:16    [7284548]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по partitioned view  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5500
Crimean,
А можно чуть подробнее об ограничениях? Вообще, кроме того, о чем здесь говорили, есть еще какие-то подводные камни?
10 июн 09, 11:46    [7284803]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Несколько вопросов по partitioned view  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5500
Опять пришлось заняться подобной задачей. Как будто все делаю правильно. Вот код создания таблиц:

IF NOT EXISTS (SELECT [ID] FROM SYSOBJECTS WHERE [NAME] = 'I_GPS_EVENTS_Y2010' AND sysobjects.type = 'U')
begin

	CREATE TABLE I_GPS_EVENTS_Y2010
		(
		G_COMPANY_ID int NOT NULL,
		G_BB_VEHICLE_ID nvarchar(50) NOT NULL,
		G_DRIVE_DATE smalldatetime NOT NULL,
		G__TRIP_START_DATETIME datetime NOT NULL,
		G_POSITION_DATE smalldatetime NOT NULL,
		G__POS_DATETIME datetime NOT NULL,
		G_EVENT_CODE smallint NOT NULL,
		G_REGION_ID int NOT NULL,
		G_BB_CHARGE_ID varchar(50) NOT NULL,
		G_BB_DRIVER_ID varchar(50) NULL,
		G__TRIP_UID uniqueidentifier NULL,
		G_GPS_STATUS tinyint NULL,
		G_LATITUDE decimal(10, 6) NULL,
		G_LONGITUDE decimal(10, 6) NULL,
		G_HEADING smallint NULL,
		G_DRIVE_TYPE smallint NULL,
		G_CURRENT_ODOMETER decimal(10, 1) NULL,
		G_CURRENT_SPEED smallint NULL,
		G_CURRENT_RPM smallint NULL,
		G_ACCEL_DECELER_VALUE smallint NULL,
		G__TRIP_END_DATETIME datetime NULL,
		G_DESTINATION nvarchar(255) NULL,
		G__POI_ID int NULL,
		G_INSERT_TIME datetime NULL,
		G_BATTERY_LEVEL decimal(5, 1) NULL,
		G_FUEL_LEVEL_PCT tinyint NULL,
		G_ENGINE_TEMPERATURE smallint NULL,
		G_ID uniqueidentifier NULL 
		)  ON [OLD_DATA]

	ALTER TABLE I_GPS_EVENTS_Y2010 WITH CHECK ADD CONSTRAINT
		CK_I_GPS_EVENTS_Y2010 CHECK (G_DRIVE_DATE < '2011-01-01')
	
	ALTER TABLE I_GPS_EVENTS_Y2010 ADD CONSTRAINT
		DF_I_GPS_EVENTS_Y2010_G_INSERT_TIME DEFAULT (getdate()) FOR G_INSERT_TIME
	
	ALTER TABLE I_GPS_EVENTS_Y2010 ADD CONSTRAINT
		DF_I_GPS_EVENTS_Y2010_G_ID DEFAULT (newid()) FOR G_ID

	ALTER TABLE I_GPS_EVENTS_Y2010 ADD CONSTRAINT
		DF_I_GPS_EVENTS_Y2010_REGION_ID DEFAULT ((0)) FOR G_REGION_ID

	ALTER TABLE I_GPS_EVENTS_Y2010 ADD CONSTRAINT
		PK_I_GPS_EVENTS_Y2010 PRIMARY KEY CLUSTERED 
		(
			G_COMPANY_ID,
			G_BB_VEHICLE_ID,
			G_DRIVE_DATE,
			G__TRIP_START_DATETIME,
			G_POSITION_DATE,
			G__POS_DATETIME,
			G_EVENT_CODE,
			G_REGION_ID,
			G_BB_CHARGE_ID
		) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [OLD_DATA]

END


Еще две таблицы для 11 и 12 года создаются подобным образом. Разниуа только в назавниях и в чеках:

ALTER TABLE I_GPS_EVENTS_Y2011 WITH CHECK ADD CONSTRAINT
CK_I_GPS_EVENTS_Y2011 CHECK (G_DRIVE_DATE between '2011-01-01 00:00:00' and '2011-12-31 23:59:59')


ALTER TABLE I_GPS_EVENTS_Y2012 WITH CHECK ADD CONSTRAINT
CK_I_GPS_EVENTS_Y2012 CHECK (G_DRIVE_DATE between '2012-01-01 00:00:00' and '2012-12-31 23:59:59')


Затем создаю вьюху:
IF EXISTS (SELECT name FROM sysobjects 
	WHERE name = N'I_GPS_EVENTS' AND type = 'V')
	DROP VIEW I_GPS_EVENTS
GO

CREATE VIEW I_GPS_EVENTS
AS
	select * from I_GPS_EVENTS_Y2010
	union all
	select * from I_GPS_EVENTS_Y2011
	union all
	select * from I_GPS_EVENTS_Y2012
GO


Все без проблем. Но при попытке внести новые данные получаю ошибку:

Msg 4436, Level 16, State 12, Line 1
UNION ALL view 'EDT_WFL.dbo.I_GPS_EVENTS' is not updatable because a partitioning column was not found.

Что неправильно? Может быть два поля с uniqueidentifier мешают?
SQL Server 2005 Standard Edition
10 дек 12, 20:49    [13609445]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по partitioned view  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Rivkin Dmitry
Что неправильно?
У вас диапазоны дат в чек-констрейнах пересекаются.
10 дек 12, 20:55    [13609461]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по partitioned view  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5500
alexeyvg
Rivkin Dmitry
Что неправильно?
У вас диапазоны дат в чек-констрейнах пересекаются.

Не вижу... Или не понимаю... Покажите, плз
10 дек 12, 20:58    [13609467]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по partitioned view  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Rivkin Dmitry
alexeyvg
пропущено...
У вас диапазоны дат в чек-констрейнах пересекаются.

Не вижу... Или не понимаю... Покажите, плз
Для smalldatetime '2011-12-31 23:59:59' == '2012-01-01 00:00:00'

Кроме того, у вас используются формат даты, зависящий от региональных настроек. В BOL я про это не нашёл, но так сиквел тоже не даст создать ключ секционирования :-)

Используйте формат '20120101 00:00:00' вместо '2012-01-01 00:00:00'

Кроме того, советую отказаться от BETWEEN, используйте точные границы, тогда не будет зависимости от типов данных.

Ну и конечно, нужно прописывать владельца, а то ведь таблицы, к которым обращается вьюха I_GPS_EVENTS, зависит от пользователя, который делает запрос к этой вьюхе - это как бы нехорошо, как сервер может секционировать в таких ужасных условиях? :-)
10 дек 12, 21:27    [13609530]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по partitioned view  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5500
Да, таки дело оказалось в smalldatetime и, соответственно, диапазон чека оказался конфликтным.

Огромное спасибо, alexeyvg !
11 дек 12, 11:00    [13611053]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить