2013-04-08 3 views
3

Я получил один вопрос от NET, но не нашел подходящего решения, может ли кто-нибудь сказать , что с этим не так?Запрос интервью сервера SQL по индексу?

Учитывая эту структуру и индекс таблицы, в чем проблема с последующим запросом?

CREATE TABLE dbo.IndexQ (
ID int IDENTITY(1, 1) NOT NULL, 
TestBit bit NOT NULL 
) 
GO 

CREATE NONCLUSTERED INEX IX_IndexQ_TestBit ON dbo.IndexQ (TestBit) 
GO 

* Insert some rows where some bits are 0 and some are 1... 

SELECT * 
FROM dbo.IndexQ 
WHERE TestBit = 1 
* What's the problem with this query? 
+1

На боковой ноте неэффективно иметь «индекс» на столбцах с низкой мощностью. – praveen

ответ

3

Я полагаю, что проблема в вашем индексе NONCLUSTERED на поле бит. Если у вас большая таблица, вы не должны создавать индекс в поле бит, потому что тогда у него больше записей, тем менее эффективный индекс будет работать, но больше даты вы будете использовать на нем.

См https://dba.stackexchange.com/questions/12888/should-i-index-a-bit-field-in-sql-server

+0

Если возможно, вы можете объяснить в глубину. – Luv

+1

@ Luv хорошо, сам индекс полезен (в большинстве случаев), когда у вас разные значения. Это позволяет избежать полного сканирования таблицы, заменив его на сканирование индексных таблиц, что происходит быстрее, поскольку эти таблицы в несколько раз меньше. Их размер зависит от значений столбцов, и их размер варьируется. В случае битового поля SQL будет иметь только два значения, и стоило бы почти одинаково сделать поиск в таблице, кроме таблицы индексов бит. С другой стороны, этот индекс будет хранить ненужные указатели, что обойдется вам в некотором пространстве – Alex

+0

+1 Для ** Объяснение ** – Luv

1

1) Общая практика для создания индекса является то, что первый столбец индекс должен быть столбец с более высокой селективности/низкой плотности (плотность показывает, сколько уникальных значений находятся в пределах столбца или набор столбцов). Более низкая плотность (означает множество уникальных значений) лучше, потому что это способствует Index Seek по сравнению с Index Scan. В этом случае индекс на столбце BIT означает более высокую плотность, что благоприятствует Index Scan.

2) Но SELECT * заставляет сервер возвращать все столбцы, а не только значения (TestBit) от TestBit. Это означает, что для этого запроса SELECT индекс не распространяется (не включает все столбцы, необходимые для этого запроса).

3) Более высокая плотность (1) плюс индекс без покрытия (2) означает, что, скорее всего, "tipping point" для этого индекса заставит сервер не использовать этот индекс и вместо этого выбрать (весьма вероятно) Сканирование таблицы.

Это означает, что этот показатель не является полезным.

+0

Примечание: Это означает, что этот индекс не подходит для ** этого запроса **. –

Смежные вопросы