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

Откуда:
Сообщений: 55
Коллеги,
Есть таблица в которой скажем несколько сот тысяч записей. И есть столбец с признаком, так вот этот признак выставляется всего лишь для одной строчки. Такова бизнес логика. Имеет ли строить индекс по этому столбцу, если зачастую приходится находить эту строчку, такие запросы есть. Или есть другие решения?
31 май 16, 10:30    [19239452]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Spinifex,

тут лучше запрос показать которым вы ищете эту строку
31 май 16, 10:33    [19239471]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
sti
Member

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

filtered index, если версия позволяет.
31 май 16, 10:39    [19239519]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
Mike_za
Member

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

Если поле заполнено только для 1 строки из 100 000 имеет сиысл завести вторую таблицу с одной строкой содержащей это поле и ссылку на основную таблицу
31 май 16, 10:46    [19239592]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
iljy
Member

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

проще всего, конечно, filtered index, но если сервер не позволяет, то можно сделать вот такой фокус:

use tempdb

create table test (
	id int identity primary key,
	val int
)

create table test_id (id int foreign key references test(id))

insert test(val)
select top(70000) abs(CHECKSUM(newid())) % 1000
from master..spt_values v1, master..spt_values

insert test(val) values(-1)
insert test_id values (SCOPE_IDENTITY())

insert test(val)
select top(70000) ABS(CHECKSUM(newid())) % 1000
from master..spt_values v1, master..spt_values
go
create view ttt as
	select t.* 
	from test t join test_id i on i.id = t.id
	where val = -1
		union all
	select *
	from test
	where val != -1
	
go

select * from ttt where val = -1

select * from ttt where val = 5

select * from ttt where val != -1

go

drop view ttt


drop table test_id drop table test 
31 май 16, 11:09    [19239804]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
Владислав Колосов
Member

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

автор
Или есть другие решения?

нормализовать данные, если на пальцах, то выделить в отдельную таблицу.
31 май 16, 11:16    [19239879]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
vborets
Member

Откуда:
Сообщений: 166
как вариант сделать индекс "вручную", при внесении этой строки или проставления признака, сохранять ID строки и использовать этот ID далее в запросах, или тупо копировать строку в другую таблицу - быстрее будет :-)
31 май 16, 11:24    [19239976]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Spinifex
Коллеги,
Есть таблица в которой скажем несколько сот тысяч записей. И есть столбец с признаком, так вот этот признак выставляется всего лишь для одной строчки. Такова бизнес логика. Имеет ли строить индекс по этому столбцу, если зачастую приходится находить эту строчку, такие запросы есть. Или есть другие решения?

Если такая запись одна, то может быть использовать для её поиска идентификатор?
Либо иной другой уникальный признак записи?
31 май 16, 11:30    [19240024]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Spinifex
Или есть другие решения?
Индексированное представление.
Не нужно заводить доп. таблицу и не будет возможных проблем с фильтрованным индексом.
31 май 16, 11:32    [19240040]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
invm
Spinifex
Или есть другие решения?
Индексированное представление.
Не нужно заводить доп. таблицу и не будет возможных проблем с фильтрованным индексом.

А какие проблемы с фильтрованными индексами?
31 май 16, 22:06    [19243302]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Mike_za
А какие проблемы с фильтрованными индексами?
Не могут быть задействованы при использовании параметров.
31 май 16, 22:34    [19243389]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
Mike_za
Member

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

Так альтернатива - отсутствие индекса. А в данном случае речь о конкретном значении, и параметры не нужны
31 май 16, 23:51    [19243513]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
aleks2
Guest
invm
Mike_za
А какие проблемы с фильтрованными индексами?
Не могут быть задействованы при использовании параметров.

Ну, я когда-то лично изучал этот вопрос на биллинге масштаба национального оператора.
Фильтрованный индекс (WHERE Field is not null) замечательно использовался оптимизатором в запросе с условием where Field = @Field.
1 июн 16, 08:05    [19243843]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
aleks2
Фильтрованный индекс (WHERE Field is not null) замечательно использовался оптимизатором в запросе с условием where Field = @Field.
Ага. При option recompile.
1 июн 16, 11:53    [19244839]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Mike_za
Spinifex,

Если поле заполнено только для 1 строки из 100 000 имеет сиысл завести вторую таблицу с одной строкой содержащей это поле и ссылку на основную таблицу
Это самое правильное решение.
1 июн 16, 12:07    [19244929]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Кстати можно пробовать OPTIMIZE FOR (@val = -1), но про результат не знаю :)
1 июн 16, 12:10    [19244944]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
iap
Это самое правильное решение.
И написать код для поддержания согласованности таблиц.
Что же в этом правильного, если есть способы, позволяющие обойтись без написания кода?
1 июн 16, 12:16    [19244994]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
invm
iap
Это самое правильное решение.
И написать код для поддержания согласованности таблиц.
Что же в этом правильного, если есть способы, позволяющие обойтись без написания кода?
Что за "согласованность таблиц"?
FOREIGN KEY будет не достаточно?
1 июн 16, 12:43    [19245182]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
TaPaK
Member

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

есть подозрение что эта запись неким образом смещается, имхо смысла в таблице для одной записи конечно не много...
1 июн 16, 12:44    [19245192]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
TaPaK
iap,

есть подозрение что эта запись неким образом смещается, имхо смысла в таблице для одной записи конечно не много...
Давайте всё хранить в одном блобе одной таблицы.
Давно предлагали!
1 июн 16, 12:47    [19245209]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
TaPaK
есть подозрение что эта запись неким образом смещается
Вот это вообще непонял. О чём?
1 июн 16, 12:47    [19245211]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
iap
FOREIGN KEY будет не достаточно?
Достаточно. Но только когда "признак" не "путешествует" по строкам основной таблицы.
1 июн 16, 12:50    [19245229]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
invm
iap
FOREIGN KEY будет не достаточно?
Достаточно. Но только когда "признак" не "путешествует" по строкам основной таблицы.
Кто мешает апдейтить поле FK во второй таблице?
Это и будет "путешествием".
1 июн 16, 12:52    [19245232]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
iap
invm
пропущено...
Достаточно. Но только когда "признак" не "путешествует" по строкам основной таблицы.
Кто мешает апдейтить поле FK во второй таблице?
Это и будет "путешествием".

ну предположим, что для таблицы нагруженной массовыми изменениями любой триггер будет всё это ториозить
1 июн 16, 13:00    [19245282]     Ответить | Цитировать Сообщить модератору
 Re: Индекс для одной записи  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
CREATE TABLE T
(
  ID INT NOT NULL IDENTITY CONSTRAINT pkT PRIMARY KEY
, F1 INT NULL
, F2 DATE NULL
---, ...
);
CREATE TABLE Mark
(
  ID INT NOT NULL CONSTRAINT pkMark PRIMARY KEY
, T_ID INT NOT NULL CONSTRAINT fkMarkT FOREIGN KEY REFERENCES T(ID)
, CONSTRAINT cMarkID CHECK(ID=0)
);
INSERT T DEFAULT VALUES;
INSERT Mark(ID,T_ID) VALUES(0,1);
GO
CREATE TRIGGER tInsteadOfDeleteInsert ON Mark INSTEAD OF DELETE,INSERT AS RETURN;
GO
Теперь добавляем записи в T, апдейтим Mark. Сколько угодно.
1 июн 16, 13:04    [19245300]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить