Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 NULL Значения  [new]
ArtMan
Member

Откуда:
Сообщений: 143
Добрый день.
Перерыл кучу инфы, так и не нашел на свой ответ на свой вопрос, строится ли некластерный индекс по NULL значениям?
14 мар 13, 09:42    [14045901]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
Гость333
Member

Откуда:
Сообщений: 3683
ArtMan
строится ли некластерный индекс по NULL значениям?

Строится. Какую-либо ссылку искать лень, но вот вам простой эксперимент:
use tempdb
go
create table dbo.null_test(id int identity, num int null);
create index null_index on dbo.null_test(num);
insert dbo.null_test(num) values(1);
insert dbo.null_test(num) values(2);
insert dbo.null_test(num) values(null);
go
set showplan_text on;
go
-- Проверим, используется ли индекс для поиска NULL'ов
select num from dbo.null_test where num is null;
go
set showplan_text off;
go

План запроса
|--Index Seek(OBJECT:([tempdb].[dbo].[null_test].[null_index]), SEEK:([tempdb].[dbo].[null_test].[num]=NULL) ORDERED FORWARD)
14 мар 13, 09:54    [14045937]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
ArtMan
Member

Откуда:
Сообщений: 143
Мне не лень.... В оракле черным по белому написано, что не строится, по ms sql я такого не нашел, планы я свои изучал и пришел к выводу, что строится, потому как берутся индексы для случаев с NULL. Вот и решил уточнить, не показалось ли мне.
14 мар 13, 09:56    [14045940]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
Гость333
Member

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

Нет, вам не показалось. Это одно из отличий MSSQL и Oracle. Не уверен, указано ли об этом прямо в документации по MSSQL, вот удалось найти нечто близкое в доке по CREATE INDEX:
BOL, CREATE INDEX
multiple null values are considered duplicates when a unique index is created
14 мар 13, 10:06    [14045974]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
ArtMan
Member

Откуда:
Сообщений: 143
Спасибо тебе, Гость333.
14 мар 13, 10:09    [14045985]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
Добрый Э - Эх
Guest
ArtMan,

в оракле есть разные индексы. В битмапах нуллы ещё как хранятся. Ну и есть свои нюансы с составными индексами... Про fbi не говорю, так как ими можно вообще всё что угодно заиндексировать, в том числе и нулл
14 мар 13, 10:09    [14045987]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
ArtMan
Member

Откуда:
Сообщений: 143
Кстати, я тему поднимал про индексацию вычисляемых полей, так вот, сделал индекс по вычисляемому полю, но в плане есть шаг по вычислению поля, я не понял почему, должен же был просто индекс прочитаться, вычисляемое поле уже храниться.
14 мар 13, 10:26    [14046068]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Добрый Э - Эх
Про fbi не говорю, так как ими можно вообще всё что угодно заиндексировать, в том числе и нулл

Поясните вашу мысль, пожалуйста. Вот я создаю уникальный fbi и пытаюсь вставить в него несколько null-значений. Если бы по ним строился индекс, я вправе был бы ожидать "ORA-00001: unique constraint (TEST.UI_TEST1) violated", так? Но этого не происходит:
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 
Connected as test@test
 
SQL> 
SQL> create table test1(name varchar2(100));
 
Table created
SQL> create unique index ui_test1 on test1 (upper(name));
 
Index created
SQL> insert into test1 values(null);
 
1 row inserted
SQL> insert into test1 values(null);
 
1 row inserted
SQL> insert into test1 values(null);
 
1 row inserted
SQL> select count(*) from test1;
 
  COUNT(*)
----------
         3
SQL> drop table test1;
 
Table dropped
14 мар 13, 10:27    [14046077]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ArtMan
Кстати, я тему поднимал про индексацию вычисляемых полей, так вот, сделал индекс по вычисляемому полю, но в плане есть шаг по вычислению поля, я не понял почему, должен же был просто индекс прочитаться, вычисляемое поле уже храниться.
Вычисляемое поле хранится, если оно PERSISTED
14 мар 13, 10:30    [14046097]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
ArtMan
Кстати, я тему поднимал про индексацию вычисляемых полей, так вот, сделал индекс по вычисляемому полю, но в плане есть шаг по вычислению поля, я не понял почему, должен же был просто индекс прочитаться, вычисляемое поле уже храниться.
Вычисляемое поле хранится, если оно PERSISTED
Кстати, это обязательно, если оно входит в состав FK или PK
14 мар 13, 10:31    [14046108]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
ArtMan
Member

Откуда:
Сообщений: 143
А индекс нельзя создать по полю не PERSISTED. Тут без вариантов.
14 мар 13, 10:34    [14046131]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ArtMan
А индекс нельзя создать по полю не PERSISTED. Тут без вариантов.
Я вчера создал...
Пример:
USE tempdb;
SET NOCOUNT ON;
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
CREATE TABLE T(X INT, F AS X*X);
CREATE INDEX iT_F ON T(F);
14 мар 13, 10:40    [14046165]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
Гость333
Member

Откуда:
Сообщений: 3683
ArtMan
А индекс нельзя создать по полю не PERSISTED. Тут без вариантов.

Можно. Значение поля будет вычислено и помещено в индекс:
use tempdb;
go
create table dbo.computed_test(name varchar(100) primary key, upper_name as upper(name));
create index i_computed_test on dbo.computed_test(upper_name);
insert dbo.computed_test(name) values ('Иванов');
insert dbo.computed_test(name) values ('Петров');
insert dbo.computed_test(name) values ('Сидоров');
-- Проверим, что поле не является persisted
select name, is_computed, is_persisted from sys.computed_columns where object_id = object_id('dbo.computed_test') and name = 'upper_name';
go
set showplan_text on;
go
-- Здесь используется индекс по не-persisted вычисляемому полю
select name from dbo.computed_test where upper(name) = 'ИВАНОВ';
-- И здесь используется индекс по не-persisted вычисляемому полю
select name from dbo.computed_test where upper_name = 'СИДОРОВ';
go
set showplan_text off;
go
drop table dbo.computed_test;
go

name          is_computed is_persisted
------------- ----------- ------------
upper_name 1 0

|--Index Seek(OBJECT:([tempdb].[dbo].[computed_test].[i_computed_test]), SEEK:([tempdb].[dbo].[computed_test].[upper_name]='ИВАНОВ') ORDERED FORWARD)

|--Index Seek(OBJECT:([tempdb].[dbo].[computed_test].[i_computed_test]), SEEK:([tempdb].[dbo].[computed_test].[upper_name]=[@1]) ORDERED FORWARD)
14 мар 13, 10:42    [14046180]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
Гость333
Member

Откуда:
Сообщений: 3683
iap
ArtMan
должен же был просто индекс прочитаться, вычисляемое поле уже храниться.
Вычисляемое поле хранится, если оно PERSISTED

Вычисленное значение вычисляемого поля хранится в индексе независимо от PERSISTED'ности :-)

ArtMan,
покажите скрипты создания таблицы и запрос, в котором не использовался индекс.
14 мар 13, 10:46    [14046196]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Гость333
Вычисляемое поле хранится, если оно PERSISTED

Вычисленное значение вычисляемого поля хранится в индексе независимо от PERSISTED'ности :-)[/quot]А разве речь шла не о хранении вычислемого поля в таблице?
14 мар 13, 10:52    [14046225]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Гость333
iap
Вычисляемое поле хранится, если оно PERSISTED

Вычисленное значение вычисляемого поля хранится в индексе независимо от PERSISTED'ности :-)
А разве речь шла не о хранении вычислемого поля в таблице?
14 мар 13, 10:53    [14046232]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
Добрый Э - Эх
Guest
Гость333,

ты неправильно пытаешься заиндексировать нуллы. Само себе применение некой функции не делает нулл - хранимым в индексе. В том виде как ты написал - индекс нуллы содержать не будет. Моя же мысль была лишь в том, что при желании и в оракле можно заиндексировать нуллы. Более того, можно даже только нуллы и заиндексировать, исключив строки с остальными значениями из индекса. Нужно лишь функцию преобразования столбца выбрать такую, которая будет нулл "материализовывать" в нечто определенное, а определенное - транслировать в нулл. Конкретный же способ индексации будет зависеть от решаемой задачи и преследуемых индексацией целей..
14 мар 13, 10:56    [14046246]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Добрый Э - Эх
Гость333,

ты неправильно пытаешься заиндексировать нуллы. Само себе применение некой функции не делает нулл - хранимым в индексе. В том виде как ты написал - индекс нуллы содержать не будет. Моя же мысль была лишь в том, что при желании и в оракле можно заиндексировать нуллы. Более того, можно даже только нуллы и заиндексировать, исключив строки с остальными значениями из индекса. Нужно лишь функцию преобразования столбца выбрать такую, которая будет нулл "материализовывать" в нечто определенное, а определенное - транслировать в нулл. Конкретный же способ индексации будет зависеть от решаемой задачи и преследуемых индексацией целей..
А если в MSSQL сделать фильтрованный индекс по Field с WHERE Field IS NULL - это не будет аналогом вот этого приёма в Oracle?
Чувствую, что глупость спросил, но не спросить - ещё глупее...
14 мар 13, 11:00    [14046267]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Добрый Э - Эх
Нужно лишь функцию преобразования столбца выбрать такую, которая будет нулл "материализовывать" в нечто определенное

Это понятно — при этом на уровне индекса всё равно null'овые значения не будут храниться. И для использования индекса нужно будет писать не "Поле IS NULL", а "Функция(Поле) = НечтоЗаменяющееNULL".

Ок, я понял, что вы имели в виду :-)
14 мар 13, 11:07    [14046297]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
Добрый Э - Эх
Guest
iap
А если в MSSQL сделать фильтрованный индекс по Field с WHERE Field IS NULL - это не будет аналогом вот этого приёма в Oracle?
Наверное да - наиболее близким аналогом именно такое и будет


iap
Чувствую, что глупость спросил, но не спросить - ещё глупее...
"Спросить - стыд пяти минут, не знать - стыд всей жизни"(с) ;)
14 мар 13, 11:14    [14046349]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
Добрый Э - Эх
Guest
Гость333
при этом на уровне индекса всё равно null'овые значения не будут храниться.
Нет, конечно. В Оракле нулл явно будет хранится в индексе, если индекс - битовый (bitmap). В обычном же b-tree-индексе нулл будет хранится лишь в случае составного индекса и пустого значения в "ведущих" полях индекса.
14 мар 13, 11:17    [14046384]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Добрый Э - Эх
В обычном же b-tree-индексе нулл будет хранится лишь в случае составного индекса и пустого значения в "ведущих" полях индекса.

("Пустого значения" — это опечатка?)
Не очень понял про ведущие поля. В доке сказано:
Oracle Concepts
Oracle Database does not index table rows in which all key columns are NULL, except in the case of bitmap indexes or when the cluster key column value is NULL.

То есть, если хотя бы в одном поле индекса есть не-null — строка помещается в индекс. Про ведущие поля ничего не сказано. Например, в составной индекс по трём полям будут помещены значения (1, null, null), (null, 1, null), (null, null, 1), но не (null, null, null).
14 мар 13, 11:43    [14046577]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
Добрый Э - Эх
Guest
Гость333
То есть, если хотя бы в одном поле индекса есть не-null — строка помещается в индекс. Про ведущие поля ничего не сказано. Например, в составной индекс по трём полям будут помещены значения (1, null, null), (null, 1, null), (null, null, 1), но не (null, null, null).
Всё верно, так всё и есть. Про ведущите поля - это я с применимостью и эффективностью индексного доступа в запросах перепутал... Спасибо за поправку ;)
14 мар 13, 12:14    [14046734]     Ответить | Цитировать Сообщить модератору
 Re: NULL Значения  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
ArtMan
Мне не лень.... В оракле черным по белому написано, что не строится, по ms sql я такого не нашел, планы я свои изучал и пришел к выводу, что строится, потому как берутся индексы для случаев с NULL. Вот и решил уточнить, не показалось ли мне.


Из всех известных мне РСУБД только Oracle не включает NULL в индексы. В MSSQL и Sybase ASE NULL-значения включаются в индексы, любые, и кластерные, и некластерные.
14 мар 13, 12:27    [14046829]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить