Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2012, 12:00   #1
Droid
Форумчанин
 
Аватар для Droid
 
Регистрация: 24.04.2008
Сообщений: 440
По умолчанию Создание индексов

Почитал многое про индексы, но не до конца понятно, как ими пользоваться.
У меня есть к примеру таблица table1 и поля в ней (id_user,login,password), она у меня заведена в MSSQL.
Правильно ли я понял, чтобы использовать индекс надо на вкладке indexes создать индекс типа кластера и указать ему поле login, и он про индексирует сам таблицу 1? Или же я вручную создаю поле login_index и отдельную таблицу, уникальными именами пользователей и присвоенным им индексам как в table 2
Что является кластером в table1 ?
Кластерный индекс, это когда у таблице имеется id как инкремент?
Не кластерный, это таблица без поля id (как куча)?

Тут login_index-внешний ключ ?
table1
id_user|login|password|login_index( FK)|
----------------------------------
1 |ivan|123 |1.ivan |
----------------------------------
2 |petr|231 |1.petr |
----------------------------------
3 |oleg|456 |1.oleg |
----------------------------------
4 |kolja|789 |1.kolja |
----------------------------------
5 |griha|101 |1.griha |
----------------------------------
6 |miha|111 |1.miha |
----------------------------------
7 |miha|123 |1.miha |
----------------------------------
8 |miha|123 |1.miha |
----------------------------------


тут поле login, будет уникальным ? а login_index - это будет поле индекса? Для связки с первой таблицей как FK ?
table2
login|login_index|
-----------------
ivan|1.ivan |
-----------------
petr|1.petr |
-----------------
oleg|1.oleg |
-----------------
kolja|1.kolja |
-----------------
griha|1.griha |
-----------------
miha|1.miha |
-----------------


Для чего создаются индексы я понял, не понятно как их использовать на примере. 1 или 2-х таблиц, какие поля в них создавать, а самое главное как создавать индексы. Читал тут но там особо нет примеров и примеры непонятные
http://www.sql.ru/articles/mssql/03013101Indexes.shtml
http://msdn.microsoft.com/ru-ru/library/ms190969.aspx
http://ru.wikipedia.org/wiki/%D0%98%...BD%D1%8B%D1%85)
1 старый программист, лучше новых 2-х
Droid вне форума Ответить с цитированием
Старый 02.02.2012, 12:51   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Дополнительных таблиц не надо, индексы создаются для существующих полей таблицы. Чем кластерный индекс (который только один может быть в таблице) отличается от некластерного можно, например, здесь подглядеть http://www.rsdn.ru/forum/db/765269.all.aspx. Создание индексов командой CREATE INDEX. Команда отработала - индекс создан, дальше не ваша забота, он при редактировании данных обновится. Чем больше индексов в таблице - тем в общем случае быстрее выборка по условию данных из неё и тем медленнее обновление данных. Обычно индексы строятся по полям, наиболее часто используемых во WHERE запросов к этой таблице. UNIQUE-индекс кроме того не даст создать запись с неуникальным ключем указанным при создании индекса
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 02.02.2012 в 12:54.
Аватар вне форума Ответить с цитированием
Старый 02.02.2012, 13:05   #3
Droid
Форумчанин
 
Аватар для Droid
 
Регистрация: 24.04.2008
Сообщений: 440
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Дополнительных таблиц не надо, индексы создаются для существующих полей таблицы.
Чем кластерный индекс (который только один может быть в таблице) отличается от некластерного можно, например, здесь подглядеть http://www.rsdn.ru/forum/db/765269.all.aspx. Создание индексов командой CREATE INDEX.
Команда отработала - индекс создан, дальше не ваша забота, он при редактировании данных обновится.
Чем больше индексов в таблице - тем в общем случае быстрее выборка по условию данных из неё и тем медленнее обновление данных.
Обычно индексы строятся по полям, наиболее часто используемых во WHERE запросов к этой таблице.
UNIQUE-индекс кроме того не даст создать запись с неуникальным ключем указанным при создании индекса
На самом деле все просто: если у таблицы есть кластерный индекс, то записи,
находящиеся в этой таблице, физически (в дисковом файле) упорядочиваются в соответствии с условием индексирования).
Именно поэтому кластерный индекс может быть на таблицу только один.
Некластерный индекс хранит ссылки на местоположение данных в дисковом файле.

Это описание читать про кластерный и не кластерный индекс ?

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


идентификатор(инкремент) в таблице не является индексом ?

Можно из своего опыта привести пример, как вы это понимаете на примере 2 таблиц как будет выглядеть каждая имея кластерный и некластерный индекс? В старых топах не у кого спросить.
1 старый программист, лучше новых 2-х
Droid вне форума Ответить с цитированием
Старый 02.02.2012, 13:42   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
--Основная таблица
CREATE TABLE Table1 (
       Table1Id             int IDENTITY NOT NULL,
       Naim                 varchar(20) NOT NULL,
       Kod1                 int NOT NULL
)

--Кластерный (по умолчанию) индекс для PRIMARY поля
ALTER TABLE Table1
       ADD PRIMARY KEY (Table1Id)

--Не кластерный (по умолчанию) уникальный альтернативный индекс 
CREATE UNIQUE INDEX XAK1Table1 ON Table1
(
       Kod1
)

--Не кластерный не уникальный индекс 
CREATE INDEX XDP1Table1 ON Table1
(
       Naim
)

--Дочерняя таблица
CREATE TABLE Table2 (
       Table2Id             int IDENTITY NOT NULL,
       Table1Id             int NOT NULL,
       Naim                 varchar(20) NULL
)

--Кластерный (по умолчанию) индекс для PRIMARY поля
ALTER TABLE Table2
       ADD PRIMARY KEY (Table2Id)

-- индекс обеспечивающий ссылочную целостность
ALTER TABLE Table2
       ADD FOREIGN KEY (Table1Id)
                             REFERENCES Table1
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 02.02.2012 в 14:51.
Аватар вне форума Ответить с цитированием
Старый 02.02.2012, 16:18   #5
Droid
Форумчанин
 
Аватар для Droid
 
Регистрация: 24.04.2008
Сообщений: 440
По умолчанию

В принципе почитав в рунете инфу, я разобрался, в чем отличие кластерного от некластерного.
И теперь еще последние 2 вопроса заключающие:
1) Уникальный индекс можно создать, для полей содержащих не дублирующие значения, а не уникальный для любых полей ?
2) Для какого поля лучше создавать кластерный индекс, для уникального (PK), или для любого поля таблицы?
1 старый программист, лучше новых 2-х
Droid вне форума Ответить с цитированием
Старый 02.02.2012, 16:30   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Уникальный индекс можно создать, для полей содержащих не дублирующие значения, а не уникальный для любых полей
Прямо в точку. Ограничения при создании индексов есть разумеется, связанные с BLOB-полями и им подобными
Цитата:
Для какого поля лучше создавать кластерный индекс, для уникального (PK), или для любого поля таблицы
Обычно для уникального поля, для не уникального затрудняюсь сказать, никогда не пробовал. А смысл? Вот можно еще почитать http://www.sql.ru/articles/mssql/030...xes.shtml#16_1
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание первичных индексов в db файле paradox7 Nikolay88_x C/C++ Базы данных 2 10.01.2012 20:59
удаление индексов массива TotKtoNado БД в Delphi 13 05.08.2011 17:03
найти добуток индексов misha25525 Помощь студентам 0 11.04.2010 11:57
найти суму индексов misha25525 Помощь студентам 0 11.04.2010 11:51