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

Откуда:
Сообщений: 38
Завязался жаркий спор по организации индексов:

Есть таблица для хранения уникальных номеров документа. Уникальность хранится по фирме в пределах года.

Структура:
DAT - Дата
FIRMA - Строка(9)
IDDOC- Строка(9)
DOCNOM - Целое (int)

К таблице выполняется запросы:
|SELECT
| [IDDOC]
|FROM
| [MyBase].[DBO].[ВсеНомера]
|WHERE
| (DAT=:НачПериода)
| and
| (FIRMA=:Фирма)
| and
| ([DOCNOM]=:НомерДокумента)
| and
| ([IDDOC]<>:ЭтотДокумент)


Dat - дата начала года (пусть после 3-х лет работы)
FIRMA - до 5 фирм
DocNom - Порядка 5000-10000 за год

как я сказал, номер не может повторяться в одной фирмы в приделах года.

Вопрос: какой индекс эффективнее?

Вариант 1: DOCNOM+FIRMA+DAT
Вариант 2: DAT+FIRMA+DOCNOM
вариант 3:?
13 авг 09, 16:14    [7534633]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
Glory
Member

Откуда:
Сообщений: 104760
vastok


Вопрос: какой индекс эффективнее?

Эффективнее для чего ?
13 авг 09, 16:14    [7534640]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
добавь поле PK identity

и делай индексы дальше
13 авг 09, 16:15    [7534644]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36803
Konst_One
добавь поле PK identity

и делай индексы дальше
Зачем оно надо, поле это?
13 авг 09, 16:16    [7534655]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Немножко не по теме, но все же...
vastok
Уникальность хранится по фирме в пределах года.
Что-то я никак не соображу, какой в этой таблице первичный ключ
13 авг 09, 16:22    [7534708]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
его нет похоже, я и предложил создать
13 авг 09, 16:23    [7534716]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
vastok
Member

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

Для этого запроса.
13 авг 09, 16:25    [7534738]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
vastok
Завязался жаркий спор по организации индексов:

Есть таблица для хранения уникальных номеров документа. Уникальность хранится по фирме в пределах года.

Структура:
DAT - Дата
FIRMA - Строка(9)
IDDOC- Строка(9)
DOCNOM - Целое (int)

К таблице выполняется запросы:
|SELECT
| [IDDOC]
|FROM
| [MyBase].[DBO].[ВсеНомера]
|WHERE
| (DAT=:НачПериода)
| and
| (FIRMA=:Фирма)
| and
| ([DOCNOM]=:НомерДокумента)
| and
| ([IDDOC]<>:ЭтотДокумент)


Dat - дата начала года (пусть после 3-х лет работы)
FIRMA - до 5 фирм
DocNom - Порядка 5000-10000 за год

как я сказал, номер не может повторяться в одной фирмы в приделах года.

Вопрос: какой индекс эффективнее?

Вариант 1: DOCNOM+FIRMA+DAT
Вариант 2: DAT+FIRMA+DOCNOM
вариант 3:?

порядок полей в индексе по идее нужно выбирать по степени селективности. каких различных значений по базе больше, тот первей.
это в целом если.
13 авг 09, 16:25    [7534743]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
vastok
Member

Откуда:
Сообщений: 38
Паганель,

Ключ такой: DAT+FIRMA+DOCNOM
Порядок полей как бы вызывает вопрос.
13 авг 09, 16:28    [7534767]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
если есть ключ, то что у вас не получается? какие-то плохие планы запросов? что за проблема то
13 авг 09, 16:29    [7534779]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 887
автор
|WHERE
| (DAT=:НачПериода)
| and
| (FIRMA=:Фирма)
| and
| ([DOCNOM]=:НомерДокумента)
| and
| ([IDDOC]<>:ЭтотДокумент)

Что-то не пойму.
Если указывается номер документа,то с таким же номером документа есть еще один документ, только другой фирмы?
13 авг 09, 16:31    [7534791]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
vastok
DAT+FIRMA+DOCNOM
Другими словами, в таблице возможны две строки:
DATFIRMADOCNOMIDDOC
1-е янв. 2009 г.MICROSOFT1100
2-е янв. 2009 г.MICROSOFT1200
?
И где же тут
vastok
Уникальность хранится по фирме в пределах года.
?
Какой IDDOC для первого DOCNOM-а фирмы MICROSOFT в 2009 году ?
13 авг 09, 16:33    [7534802]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
vastok
Member

Откуда:
Сообщений: 38
Паганель,

Dat - дата начала года
13 авг 09, 16:41    [7534877]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
мда, лучше выборку данных приложите сюда из вашей таблички, а то ничего не понятно
13 авг 09, 16:42    [7534893]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
vastok
Member

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

Да, в другой фирме может быть документ с таким же номером и/или в другом году.
13 авг 09, 16:43    [7534898]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
Glory
Member

Откуда:
Сообщений: 104760
vastok
Slava_Nik,

Да, в другой фирме может быть документ с таким же номером и/или в другом году.

Так есть у таблицы ПК или нет ?
13 авг 09, 16:43    [7534901]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
vastok,

написать здесь CREATE TABLE [MyBase].[dbo].[ВсеНомера] можно?
Со всеми CONSTRAINTами, INDEXами, TRIGGERами
13 авг 09, 16:47    [7534926]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
vastok
Dat - дата начала года
Надеюсь, есть соответствующий констрейнт (если нет - рекомендую завести)
То же самое касается ссылки на справочник фирм (пресекутся хотя бы очепятки в именах фирм:)
Может, даже есть справочник годонезависимых номеров документов (но это я уже наверное хватил:)

Больше вопросов к модели БД не имею
По теме - поддерживаю Алексея
13 авг 09, 16:48    [7534935]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
vastok
Member

Откуда:
Сообщений: 38
Konst_One
мда, лучше выборку данных приложите сюда из вашей таблички, а то ничего не понятно


например
DAT | FIRMA | IDDOC| DOCNOM
01.01.08| Первая | FAE04| 1
01.01.08| Первая | FAE05| 2
01.01.08| Первая | FAE07| 3

01.01.08| Вторая | FAE01| 1
01.01.08| Вторая | FAE03| 2
01.01.08| Вторая | FAE02| 3

01.01.09| Первая | FFE04| 1
01.01.09| Первая | FFE12| 2
01.01.09| Первая | FFE23| 3

01.01.09| Вторая | FFE01| 1
01.01.09| Вторая | FFE24| 2
01.01.09| Вторая | FFE02| 3
13 авг 09, 16:48    [7534936]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
vastok
Member

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

USE [MyBase]
GO
/****** Object: Table [dbo].[ВсеНомера] Script Date: 08/13/2009 15:51:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ВсеНомераНН](
[Dat] [datetime] NULL,
[Firma] [nchar](9) NULL,
[IDDoc] [nchar](9) NULL,
[DocNom] [int] NULL
) ON [PRIMARY]

USE [MyBase]
GO
/****** Object: Index [LastNom] Script Date: 08/13/2009 15:54:43 ******/
CREATE NONCLUSTERED INDEX [LastNom] ON [dbo].[ВсеНомера]
(
[Dat] ASC,
[Firma] ASC,
[DocNom] 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]
13 авг 09, 16:55    [7534990]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
CREATE TABLE [dbo].[ВсеНомераНН](
[Dat] [datetime] NULL,
[Firma] [nchar](9) NULL,
[IDDoc] [nchar](9) NULL,
[DocNom] [int] NULL
) ON [PRIMARY]


/****** Object: Index [LastNom] Script Date: 08/13/2009 15:54:43 ******/
CREATE NONCLUSTERED INDEX [LastNom] ON [dbo].[ВсеНомера]
(
[Dat] ASC,
[Firma] ASC,
[DocNom] 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]
13 авг 09, 16:57    [7535007]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
vastok
Member

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

Забей - Очепятка. Правильно "ВсеНомера" но за нимательность +1
13 авг 09, 17:09    [7535104]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
с индексом разобрались. только странный он у вас, да и данные в табличке сомнительные. почему поле Dat datetime? а данные в нем только первые дни каждого года?
13 авг 09, 17:11    [7535120]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
Vowk
Member

Откуда:
Сообщений: 7636
По моему мнению, попалам, в каком порядке поля выстраивать. Но я всё-таки DAT поставил бы на первое место как более "конкретный" и менее двусмысленный атрибут по сравнению с названием документа.
13 авг 09, 17:12    [7535130]     Ответить | Цитировать Сообщить модератору
 Re: Спор. Принципы организации индексов  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Таким образом, таблица представляет из себя бардак без уникального индекса, PRIMARY KEY или UNIQUE.
Ни одного CONSTRAINTа
Кстати, вместо даты начала года достаточно хранить номер года в поле CHAR(4). Оно будет во многих случаях конвертироваться сервером в 1 января даже неявно.
CHECK CONSTRAINT на него поставить CHECK(DAT NOT LIKE'%[^0-9]%').
13 авг 09, 17:13    [7535141]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить