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 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?
Цитата: oxotnik333
1. Есть таблица:
поиск идет по полям: IDKey, ParentIndex, Vers с упорядочиванием по Pos.
для ускорения поиска, как лучше проиндексировать:
а). Сделать составной PrimaryKey по полям IDKey и ParentIndex + вторичный по Vers и Pos
б). Сделать PrimaryKey по полю IDKey + вторичный по ParentIndex, Vers и Pos
2. Таблица:
поиск по полям: Id_User, Id_Base.
стоит ли создавать вторичный ключ на поля: Id_User и Id_Base?
Код:
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 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 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% индекс зачастую будет не эффективен. Для того что бы более полно ответить необходимо видеть план запроса.
Цитата: 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
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
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
здесь соответсвенно выдается одна запись