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

Откуда: Москва
Сообщений: 4927
ГУРы, ответьте пожалуйста! Вы ЛИЧНО используете нидексы по битовым (bit) полям?

Стоит ли поля со значениями "1 либо 0" делать INT, чтобы можно было по ним строить индексы?

З.Ы. Столько споров было, а мнения делятся 50 на 50. Хочется узнать на чьей стороне наши ГУРы...
21 май 05, 19:53    [1561967]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62912
Теория говорит, что делать этого не стоит, неэффективно.
А вот насчет MSSQL сервер, думаю еще будет хуже, поскольку такие поля комбинирует в одно по 8 штук за раз.
21 май 05, 20:02    [1561973]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
Anatoly Podgoretsky
такие поля комбинирует в одно по 8 штук за раз.

Это как ?)
21 май 05, 20:06    [1561980]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62912
Тип бит, занимает один бит, тип байт, как минимальная величина может хранить 8 бит. Поэтому если есть возможность, то поля упаковываются в 1, 2 и т.д. байт в пределах записи. Документировано в BOL
21 май 05, 20:13    [1561987]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62912
Вот выписка из справки, кстати и ответ на вопрос про индексацию данного поля

Remarks
Columns of type bit cannot have indexes on them.

Microsoft® SQL Server™ optimizes the storage used for bit columns. If there are 8 or fewer bit columns in a table, the columns are stored as 1 byte. If there are from 9 through 16 bit columns, they are stored as 2 bytes, and so on.
21 май 05, 20:17    [1561993]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
Anatoly Podgoretsky
Вот выписка из справки, кстати и ответ на вопрос про индексацию данного поля

Remarks
Columns of type bit cannot have indexes on them.

Microsoft® SQL Server™ optimizes the storage used for bit columns. If there are 8 or fewer bit columns in a table, the columns are stored as 1 byte. If there are from 9 through 16 bit columns, they are stored as 2 bytes, and so on.

Это не ответ на вопрос. Я и сам знаю что их нельзя индексировать.
Неспроста же я спросил: Стоит ли поля со значениями "1 либо 0" делать INT, чтобы можно было по ним строить индексы?
21 май 05, 20:23    [1561996]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62912
BusyMan
Это не ответ на вопрос. Я и сам знаю что их нельзя индексировать.
Неспроста же я спросил: Стоит ли поля со значениями "1 либо 0" делать INT, чтобы можно было по ним строить индексы?

Ответ был приведен "Теория говорит, что делать этого не стоит, неэффективно." Прислушиваться к этому или нет тебе решать.

Выписка была приведена по поводу группировки, про индексации здесь уже так к слову.
21 май 05, 20:30    [1562001]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
Я то понимаю что не стоит этого делать, но в приведенном куске из БОЛ говорится всеголишь, что сервер этого НЕ ПОЗВОЛИТ сделать (... cannot ...)
Все таки там ни слова о том что это - плохая затея!

З.Ы. Плюс еще интересно: В чем причины? Почему такие индексы не эффективны?
21 май 05, 20:47    [1562015]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62912
Ну не позволит он это делать не из-за неэффетивности, а из-за "невозможности".
Индекс неэффетивен когда много повторяющих значений. Индекс же предназначен для ускорения поиска/выборки. Тут видимо еще накладывается и внутреннее организация индексов, он из дерева превращается в вектор.

Лучше конечно почитать кого либо из авторитетов, чем слушать меня. Кого именно я читал не помню, но читал про это на протяжении очень многих лет. Да и здравый смысл мне говорит тоже самое.
21 май 05, 21:02    [1562026]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
https://www.sql.ru/forum/actualthread.aspx?tid=186042#1562025
21 май 05, 21:03    [1562029]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
Прочитал. А вот про BIT там не нашел.
Вы просто ответье ДА или НЕТ (вы лично делаете или нет).
21 май 05, 21:18    [1562054]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62912
BusyMan
Прочитал. А вот про BIT там не нашел.
Вы просто ответье ДА или НЕТ (вы лично делаете или нет).

Так и не найдель, поскольку сервер не позволит по полю BIT построить индекс, я же привел выписку и вылелил этот момент.

Ответ да или нет, не делаю по аналогичным полям, еще со старых десктопных систем, просто для себя не вижу смысла, даже не читая статей по этому поводу. Может у меня смысл извращеный :-)

Но ты подожди, придут зубры и возможно высскажут свое мнение тоже.
21 май 05, 21:40    [1562073]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
Так вот я ГАС и спрашиваю...
А зубры придут и топик удалят
21 май 05, 21:46    [1562077]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
Тьфу ты... опять я перепутал ГСА и ГАС
21 май 05, 21:46    [1562079]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
автор
Ответ да или нет, не делаю по аналогичным полям, еще со старых десктопных систем, просто для себя не вижу смысла, даже не читая статей по этому поводу. Может у меня смысл извращеный :-)

Тут вот дело ведь какое ... Вот есть, допустим, табла. В ней 100 тыщ записей и поле битовое кроме остальных. 100 единиц и остальные - нули. Хочу выбирать только единицы... И говори потом, что индекс по биту смысла не имеет.
З.Ы. Бит может входить в составной индекс.
З.Ы.Ы. По поводу статьи - там есть критерий определения эффективности индекса, по этому критерию индекс по биту будет всегда неэффективен.
21 май 05, 21:49    [1562083]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
Гавриленко Сергей Алексеевич
Вот есть, допустим, табла. В ней 100 тыщ записей и поле битовое кроме остальных. 100 единиц и остальные - нули. Хочу выбирать только единицы...

Ну и??? Так вот именно для такого случая индекс стоит делать?
Если в исходные условия, добавить еще что эти 100 записей распределены по всей ширине кластерного индекса... Ну вы поняли... т.е., грубо говоря, первый из тех ста - в самом начале, а последний - в самом конце тиблички...
21 май 05, 21:53    [1562086]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
BusyMan
Гавриленко Сергей Алексеевич
Вот есть, допустим, табла. В ней 100 тыщ записей и поле битовое кроме остальных. 100 единиц и остальные - нули. Хочу выбирать только единицы...

Ну и??? Так вот именно для такого случая индекс стоит делать?
Если в исходные условия, добавить еще что эти 100 записей распределены по всей ширине кластерного индекса... Ну вы поняли... т.е., грубо говоря, первый из тех ста - в самом начале, а последний - в самом конце тиблички...

Какая разница, как они распределены??? Чтобы найти эту сотню серверу все равно придется сканить всю таблицу.
21 май 05, 22:06    [1562098]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
Гавриленко Сергей Алексеевич
Какая разница, как они распределены??? Чтобы найти эту сотню серверу все равно придется сканить всю таблицу.

Вот о чем речь! Т.е. с индексом он найдет почеловечески?
21 май 05, 22:14    [1562104]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62912
Гавриленко Сергей Алексеевич

Тут вот дело ведь какое ... Вот есть, допустим, табла. В ней 100 тыщ записей и поле битовое кроме остальных. 100 единиц и остальные - нули. Хочу выбирать только единицы... И говори потом, что индекс по биту смысла не имеет.

А теперь возьмем вторую равноправную ситуацию, Хочу выбирать только нули... :-)
Ну и конечно надо рассматривать не такой особый случай, а все таки статистику, то есть 50 на 50. И нафига такие гигантские выборки и зачем нужен по ним индекс? Это то что я говорил про свой здравый смысл.
21 май 05, 22:20    [1562110]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62912
К автору - ты что хочешь абсолютное решение? Так его нет.
21 май 05, 22:22    [1562112]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
Anatoly Podgoretsky
К автору - ты что хочешь абсолютное решение? Так его нет.

Говорить "ОНИ БЕСПОЛЕЗНЫ" - это абсолютное заявление, которое означает, что не существует таких случаев, когда они полезны.

А если в случае 100 единиц из 1000000 записей индекс полезен по INT полю (в котором 0 или 1): тогда эта частность демонстрирует что индексы полезны.
21 май 05, 22:24    [1562115]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Готовим данные.
if exists ( select * from tempdb..sysobjects where id = object_id('tempdb..#t'))
	drop table #t
create table #t (id int identity primary key, name varchar(128), foo smallint default 0, flag bit)

declare @i int
set @i = 100
while @i > 0 begin
	insert #t(name, flag)
	select 
		name,
		case
			when id < 2 then 1 else 0
		end
	from master..sysobjects
	set @i = @i-1
end
go

Без индекса:
select flag
from #t
where flag = 1

-- |--Clustered Index Scan(OBJECT:-([tempdb].[dbo].[#t_..._0000000002E3].[PK__#t__1AC9DC03]), WHERE:-(Convert([#t].[flag])=1))
-- Scan count 1, logical reads 778, physical reads 0, read-ahead reads 0.
С индексом:
create index t1 on #t(flag, foo) 
go
update statistics #t
go
select flag
from #t
where flag = 1
go
--  |--Index Scan(OBJECT:-([tempdb].[dbo].[#t_..._0000000002E3].[t1]),  WHERE:-(Convert([#t].[flag])=1))
-- Scan count 1, logical reads 253, physical reads 0, read-ahead reads 0.
21 май 05, 22:28    [1562118]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
УРА!!!! ИНС НУЖНЫ!!!
21 май 05, 22:32    [1562125]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62912
BusyMan
Anatoly Podgoretsky
К автору - ты что хочешь абсолютное решение? Так его нет.

Говорить "ОНИ БЕСПОЛЕЗНЫ" - это абсолютное заявление, которое означает, что не существует таких случаев, когда они полезны.

Этим ты и подверждаешь данное утверждения, что данная проблема не имеет абсолютного решения.
21 май 05, 22:34    [1562126]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к знатокам  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
BusyMan
УРА!!!! ИНС НУЖНЫ!!!

А теперь включите в обе выборки поле name и понаблюдайте за результатом.
21 май 05, 22:35    [1562128]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить