Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Индексация таблиц

11
19 декабря 2007 года
oxotnik333
2.9K / / 03.08.2007
1. Есть таблица:
 
Код:
CREATE TABLE base(
   IDKey int CONSTRAINT PK_base PRIMARY KEY CLUSTERED IDENTITY(1,1) NOT NULL,
   ParentIndex int NULL,
   ItemLevel int NULL,
   ItemName varchar(254) NULL,
   Vers bit NOT NULL CONSTRAINT DF_base_Vers DEFAULT ((0)),
   Pos float NULL)

поиск идет по полям: IDKey, ParentIndex, Vers с упорядочиванием по Pos.
для ускорения поиска, как лучше проиндексировать:
а). Сделать составной PrimaryKey по полям IDKey и ParentIndex + вторичный по Vers и Pos
б). Сделать PrimaryKey по полю IDKey + вторичный по ParentIndex, Vers и Pos


2. Таблица:
 
Код:
CREATE TABLE PermissionRecord(
    Id_User int NOT NULL,
    Id_Base int NOT NULL,
    Id_PermissionType int NULL,
 CONSTRAINT PK_Permissions_1 PRIMARY KEY CLUSTERED
(
    Id_User ASC,
    Id_Base ASC
)WITH (IGNORE_DUP_KEY = OFF) ON PRIMARY
) ON PRIMARY

поиск по полям: Id_User, Id_Base.
стоит ли создавать вторичный ключ на поля: Id_User и Id_Base?
1
19 декабря 2007 года
kot_
7.3K / / 20.01.2000
Цитата: oxotnik333
1. Есть таблица:
 
Код:
CREATE TABLE base(
   IDKey int CONSTRAINT PK_base PRIMARY KEY CLUSTERED IDENTITY(1,1) NOT NULL,
   ParentIndex int NULL,
   ItemLevel int NULL,
   ItemName varchar(254) NULL,
   Vers bit NOT NULL CONSTRAINT DF_base_Vers DEFAULT ((0)),
   Pos float NULL)

поиск идет по полям: IDKey, ParentIndex, Vers с упорядочиванием по Pos.
для ускорения поиска, как лучше проиндексировать:
а). Сделать составной PrimaryKey по полям IDKey и ParentIndex + вторичный по Vers и Pos
б). Сделать PrimaryKey по полю IDKey + вторичный по ParentIndex, Vers и Pos


2. Таблица:
 
Код:
CREATE TABLE PermissionRecord(
    Id_User int NOT NULL,
    Id_Base int NOT NULL,
    Id_PermissionType int NULL,
 CONSTRAINT PK_Permissions_1 PRIMARY KEY CLUSTERED
(
    Id_User ASC,
    Id_Base ASC
)WITH (IGNORE_DUP_KEY = OFF) ON PRIMARY
) ON PRIMARY

поиск по полям: Id_User, Id_Base.
стоит ли создавать вторичный ключ на поля: Id_User и Id_Base?



Все зависит от данных которые содержаться в данных полях. Если вариабельность данных менее 10% индекс зачастую будет не эффективен. Для того что бы более полно ответить необходимо видеть план запроса.

11
19 декабря 2007 года
oxotnik333
2.9K / / 03.08.2007
Цитата: kot_
Все зависит от данных которые содержаться в данных полях. Если вариабельность данных менее 10% индекс зачастую будет не эффективен. Для того что бы более полно ответить необходимо видеть план запроса.



для первой таблицы запросы:

 
Код:
SELECT IDKey, ParentIndex, ItemName, ItemLevel, Vers, Pos FROM base WHERE ParentIndex = @ParentIndex and Vers <> 1 order by Pos ASC


SELECT * FROM base WHERE IDKey = @IDKey


т.е. в 1-м запросе 0-50%, во втором вообще одна запись.

для 1 и 2-й совместно:

Код:
WITH tree(ID_Key, Parent_Index, Item_Level, Item_Name)
AS (SELECT     IDKey, ParentIndex, ItemLevel, ItemName
  FROM         base
  WHERE     IDKey = @ID
  UNION ALL
  SELECT     Base.IDKey, Base.ParentIndex, Base.ItemLevel, Base.ItemName
  FROM         base AS Base INNER JOIN
  tree AS tr ON tr.Parent_Index = Base.IDKey)
    SELECT     tree.Parent_Index,tree.ID_Key, tree.Item_Level, tree.Item_Name, Users.Id, PermissonType.Id AS Per_Id, PermissonType.PermissionType
     FROM         Users INNER JOIN
                            PermissionRecord ON Users.Id = PermissionRecord.Id_User INNER JOIN
                            tree AS tree ON PermissionRecord.Id_Base = tree.ID_Key INNER JOIN
                            PermissonType ON PermissionRecord.Id_PermissionType = PermissonType.Id
    WHERE Users.Id = @ID_User

здесь соответсвенно выдается одна запись
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог