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

Откуда:
Сообщений: 8768
Добрый день! Есть 2 таблицы и хп, вопрос - какой лучше создать индекс кластерный ИЛИ некластерный? Весь код ниже.
Объем таблиц: SETUP_TABLE - порядка 10-100 записей, обновляются редко.POOL_TABLE - записи постоянно добавляются и обновляются, до 20000 в день.
Код:
Таблицы:
CREATE TABLE [dbo].[SETUP_TABLE](
	[SM_ID] [int] NOT NULL,
	[SUMM1] [money] NULL,
	[SUMM2] [money] NULL,
	[SUMM3] [money] NULL,
	[SUMM4] [money] NULL,
	[COUNT1] [money] NULL,
	[COUNT2] [money] NULL,
	[COUNT3] [money] NULL,
	[COUNT4] [money] NULL,
	[IS_BLOCKED] [bit] NOT NULL,
 CONSTRAINT [PK_SETUP_TABLE] PRIMARY KEY CLUSTERED 
(
	[SM_ID] 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

CREATE TABLE [dbo].[POOL_TABLE](
	[SM_ID] [int] NOT NULL,
	[NUMBER] [nvarchar](60) NOT NULL,
	[CURRENT_SUMM1] [money] NULL,
	[CURRENT_SUMM2] [money] NULL,
	[CURRENT_SUMM3] [money] NULL,
	[CURRENT_SUMM4] [money] NULL,
	[CURRENT_COUNT1] [money] NULL,
	[CURRENT_COUNT2] [money] NULL,
	[CURRENT_COUNT3] [money] NULL,
	[CURRENT_COUNT4] [money] NULL,
	[IS_BLOCKED] [bit] NOT NULL,
	[UPDATE_DATE] [datetime] NOT NULL
) 
GO

процедура:
CREATE PROCEDURE [dbo].[CheckLimits]
	-- Add the parameters for the stored procedure here
	@smid int,
	@phone nvarchar(60),
	@summ money,
	@errcode int output
AS
BEGIN
	
	UPDATE dbo.POOL_TABLE
	SET CURRENT_SUMM1=CURRENT_SUMM1 +@summ,
		CURRENT_SUMM2=CURRENT_SUMM2 + @summ,
		CURRENT_SUMM3=CURRENT_SUMM3 + @summ,
		CURRENT_SUMM4=CURRENT_SUMM4 + @summ,
		CURRENT_COUNT1=CURRENT_COUNT1+1,
		CURRENT_COUNT2=CURRENT_COUNT2+1,
		CURRENT_COUNT3=CURRENT_COUNT3+1,
		CURRENT_COUNT4=CURRENT_COUNT4+1
	FROM dbo.POOL_TABLE p
	JOIN dbo.SETUP_TABLE s on s.SM_ID=p.SM_ID
	WHERE p.SM_ID=@smid AND p.NUMBER=@phone AND p.IS_BLOCKED=0 AND
	(CURRENT_SUMM1+@summ < SUMM1) AND(CURRENT_SUMM2+@summ < SUMM2) --и тд еще аналогично на COUNT
	
	IF (@@ROWCOUNT =0)
	BEGIN
	SELECT @errcode =
	CASE
	
	WHEN (CURRENT_SUMM1+@summ >= SUMM1) THEN 1
	WHEN (CURRENT_SUMM2+@summ >= SUMM2) THEN 2
	--еще аналогичные проверки
	ELSE 0--все хорошо
			
	END
	FROM dbo.POOL_TABLE p
	LEFT JOIN dbo.SETUP_TABLE s on s.SM_ID=p.SM_ID
	WHERE p.SM_ID=@smid AND p.number=@phone AND p.IS_BLOCKED=0 
	END
	IF (@@ROWCOUNT>0 AND @errcode<>0) RETURN
	ELSE
	BEGIN --делаем вставку записи
	INSERT INTO [tempdb].[dbo].[POOL_TABLE]
           ([SM_ID]
           ,[NUMBER]
           ,[CURRENT_SUMM1]
           ,[CURRENT_SUMM2]
           ,[CURRENT_SUMM3]
           ,[CURRENT_SUMM4]
           ,[CURRENT_COUNT1]
           ,[CURRENT_COUNT2]
           ,[CURRENT_COUNT3]
           ,[CURRENT_COUNT4]
           ,[IS_BLOCKED]
           ,[UPDATE_DATE])
     VALUES
           (@smid
           ,@phone
           ,@summ
           ,@summ
           ,@summ
           ,@summ
           ,1
           ,1
           ,1
           ,1
           ,0
           ,getdate())
	END
END


GO

Индексы :
CREATE CLUSTERED INDEX [IX_CLUSTER_SM_NUM] ON [dbo].[POOL_TABLE] 
(
	[SM_ID] ASC,
	[NUMBER] 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]
GO
CREATE NONCLUSTERED INDEX [IX_NONCLUSTERED] ON [dbo].[POOL_TABLE] 
(
	[SM_ID] ASC,
	[NUMBER] ASC
)
INCLUDE ( [CURRENT_SUMM1],
[CURRENT_SUMM2],
[CURRENT_SUMM3],
[CURRENT_SUMM4],
[CURRENT_COUNT1],
[CURRENT_COUNT2],
[CURRENT_COUNT3],
[CURRENT_COUNT4],
[IS_BLOCKED]) 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]
GO

заранее спасибо за комментарии.
13 янв 12, 16:28    [11900801]     Ответить | Цитировать Сообщить модератору
 Re: какой лучше индекс- CLUSTERED / NONCLUSTERED  [new]
netivan
Member

Откуда:
Сообщений: 8768
много букв смущает?:( реально совет нужен, мучаюсь сижу.
13 янв 12, 17:39    [11901437]     Ответить | Цитировать Сообщить модератору
 Re: какой лучше индекс- CLUSTERED  [new]
Glory
Member

Откуда:
Сообщений: 104751
netivan
реально совет нужен, мучаюсь сижу.

а взглянуть на план запроса, не ?
13 янв 12, 17:44    [11901491]     Ответить | Цитировать Сообщить модератору
 Re: какой лучше индекс- CLUSTERED / NONCLUSTERED  [new]
netivan
Member

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

а что план-то. Он приблизительно одинаков везде.
13 янв 12, 17:50    [11901538]     Ответить | Цитировать Сообщить модератору
 Re: какой лучше индекс- CLUSTERED  [new]
Glory
Member

Откуда:
Сообщений: 104751
netivan
а что план-то. Он приблизительно одинаков везде.

И везде без использования индекса ?
13 янв 12, 17:53    [11901564]     Ответить | Цитировать Сообщить модератору
 Re: какой лучше индекс- CLUSTERED / NONCLUSTERED  [new]
netivan
Member

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

везде с использованием :)
13 янв 12, 18:09    [11901722]     Ответить | Цитировать Сообщить модератору
 Re: какой лучше индекс- CLUSTERED / NONCLUSTERED  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8880
Мне кажется или процедура реально выдаёт какую-то хню?
Тогда индекс, ИМБО, тут ни при чём...
Селекта из Pool_Table не вижу...
Яб из индекса выкинул бы NUMBER - ибо с какого перепугу он там. И индекс сделал бы некластерным - нафик реорганизация страниц после каждой вставки (ну, про каждую я конечно спизднул, ).
А вот по "нумбер", возможно, Вам и пригодится (отдельный) клястерный индекс - если на него потом ляжет много-много обработок - так что Glory был прав - смотреть, смотреть и ыщо рз смотреть...
13 янв 12, 19:54    [11902299]     Ответить | Цитировать Сообщить модератору
 Re: какой лучше индекс- CLUSTERED / NONCLUSTERED  [new]
netivan
Member

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

как же, есть Селект.
SELECT @errcode =
	CASE
	
	WHEN (CURRENT_SUMM1+@summ >= SUMM1) THEN 1
	WHEN (CURRENT_SUMM2+@summ >= SUMM2) THEN 2
	--еще аналогичные проверки
	ELSE 0--все хорошо
			
	END
	FROM dbo.POOL_TABLE p
	LEFT JOIN dbo.SETUP_TABLE s on s.SM_ID=p.SM_ID
	WHERE p.SM_ID=@smid AND p.number=@phone AND p.IS_BLOCKED=0 

Проводил тесты, что кластерный что некластерный дают вроде бы одинаковый результат...
16 янв 12, 10:46    [11909092]     Ответить | Цитировать Сообщить модератору
 Re: какой лучше индекс- CLUSTERED / NONCLUSTERED  [new]
aleks2
Guest
[quot netivan]
	FROM dbo.POOL_TABLE p
	LEFT JOIN dbo.SETUP_TABLE s on s.SM_ID=p.SM_ID
	WHERE p.SM_ID=@smid AND p.number=@phone AND p.IS_BLOCKED=0 


Ежели записей p.SM_ID=@smid AND p.number=@phone мало, то
p.SM_ID=@smid AND p.number=@phone AND p.IS_BLOCKED=0
действительно не будет отличаться кластерный-некластерный.
16 янв 12, 12:20    [11909842]     Ответить | Цитировать Сообщить модератору
 Re: какой лучше индекс- CLUSTERED / NONCLUSTERED  [new]
netivan
Member

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

ну результат выборки будет 1 запись, а в целом в таблице их будет много.
16 янв 12, 14:11    [11910895]     Ответить | Цитировать Сообщить модератору
 Re: какой лучше индекс- CLUSTERED / NONCLUSTERED  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
netivan,

Я что-то не совсем понимаю вопрос.
Вот смотрите, вы делаете кластерный индекс, с ключем (SM_ID, NUMBER). И не кластерный с таким же ключем, плюс включаете все колонки. Допустим сочетание SM_ID, NUMBER достаточно уникально и обеспечивает хорошую селективность, т.е. при выборке по этим сочетаниям всегда будет мало запией, опять же вопрос, широкие диапазоны выбираться будут? Допустим нет. Допустим и в том и в другом случае дополнительный bookmark lookup операций быть не должно, т.к. все данные либо уже в кластерном, либо включены. Тогда получается, что у нас с точки зрения чтения без разницы.
Теперь. с точки зрения записи.
Во первых, насколько уникально сочетание SM_ID, NUMBER? Желательно чтобы ключ кластерного индекса был уникальным, т.к. если нет, сервер будет проделывать дополнительную работу для унификации значения.
Во вторых, насколько узкий. Все-таки [NUMBER] [nvarchar](60), это 120 байт+4 для инта, итого 124. Таблица большая, если будут еще индексы, то они все будут работать с ключем в 124 байта. Соотв.вопрос, индексы другие будут?
В третьих, насколько статичны эти значения. Если вы говорите про частые апдейты, и если в них участвуют ключи индекса, то придется делать постоянные перемещения. То же само е касается новых значений, если они не всевозрастающие, и будут добавляться на заполненные страницы, возможны расщепления и т.д.
Вот ответьте себе на все эти вопросы и исходя из этого - решайте.
16 янв 12, 15:01    [11911342]     Ответить | Цитировать Сообщить модератору
 Re: какой лучше индекс- CLUSTERED / NONCLUSTERED  [new]
netivan
Member

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

ну вот приблизительно я так и думаю, насчет уникальности видимо забыл. Запись (SM_ID, NUMBER) уникальна. Varchar увы так и будет,не я придумал. Место непринципиально,массив большой:) По поводу обновлений и вставок - будут и те и те, причем скорее всего вставок первое время будет сильно больше. Вот что с этим делать чтобы не были тормоза я и хотел бы узнать. Обновление статистики, дефрагментация? Буду благодарен за советы и/или ссылки на материал.
16 янв 12, 17:36    [11912983]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить