Я был бы признателен за помощь в создании некластеризованных индексов в базе данных SQL Server 2008 без использования кода — или, скорее, «статически» раз и навсегда, до выполнения любых SQL-запросов (это, возможно, не имеет смысла, но я хочу сказать, что я не хочу запускать команду SQL для создания индексов каждый раз, когда я запускаю SQL-запросы, являющиеся частью моего бизнес-приложения).
То есть, в идеале в Microsoft SQL Server должен быть инструмент, встроенный в Visual Studio 2010 Professional (ПРИМЕЧАНИЕ: У МЕНЯ НЕТ ВЕРСИЙ ENTERPRISE ИЛИ ULTIMATE — ЭТО ВАЖНО ДЛЯ ТОГО, ЧТО Я МОГУ ДЕЛАТЬ С ПОМОЩЬЮ ВСТРОЕННОГО МЕНЕДЖЕРА SQL В ВЕРСИИ PROFESSIONAL), чтобы сделать это — поскольку у меня нет других инструментов (я просто посмотрел и обнаружил, что в Microsoft SQL Server 2008 нет того, что мне нужно — по крайней мере, в моей системе — по-видимому, это урезанная бесплатная версия). Так что, возможно, простая команда SQL для индексации приведенной ниже таблицы оправдана.
Я прочитал приведенные ниже ссылки, но не могу понять, как это сделать.
Вот моя таблица:
Table CUSTOMER
Columns:
CustomerID = GUID - this is a unique primary key
CustomerDecimal1 = decimal- this is not unique, but 99% of the time it is unique
compared to the rest of decimal fields. I wish to index this field 1 of 2
CustomerDecimal2 = decimal- this is not unique, but 99% of the time it is unique
compared to the rest of decimal fields. I wish to index this field 2 of 2
CustomerTextComments = vChar(50)
Десятичные поля часто используются в предложениях WHERE, поэтому они являются идеальными кандидатами для некластеризованного индекса, который, по-видимому, является новой функцией, поддерживаемой в Microsoft SQL Server 2008.
Далее о моей платформе: у меня уже есть таблица с существующими данными, но только несколько записей, в основном пустых. Я работаю из Server Explorer из Visual Studio 2010, который имеет много функций, включая возможность генерировать SQL-запросы. В идеале я хотел бы написать любой метод индексации в Linq-to-entities (только потому, что я не очень хорошо знаю SQL), но если кто-то может дать мне полный список того, как индексировать поля CustomerDecimal1, CustomerDecimal2 в этой таблице, я был бы благодарен.
Использованная литература:
http://blog.sqlauthority.com/2008/09/01/sql-server-2008-introduction-to-filtered-index-improve-performance-with-filtered-index/ (Новое свойство индекса «filtered» в SQL Server 2008 для поиска в предложении WHERE)
http://en.wikipedia.org/wiki/Index_%28database%29#Некластеризованный
-----Обновлено
@mrdenny -- Я благодарю вас за ваше время, и я вижу, что у вас безупречная репутация, но я не могу поверить в то, что вы говорите -- да, я упрям и называю это отрицанием! :-) Я оставлю эту ветку открытой еще немного в надежде, что кто-то еще ее увидит. Кроме того, поскольку я не запускаю SQL изначально, а только Linq-to-сущности изнутри Entity Framework (EF 4.0), я даже не знаю, куда поместить код, который вы любезно предоставили ("T/SQL для создания некластеризованного индекса по двум десятичным столбцам"). Я всегда использую оба десятичных столбца в своем поиске WHERE -- поэтому ваша первая команда SQL мне подходит.
Может ли кто-нибудь перевести первый SQL-код мистера Денни в Linq-to-Entities? Если это не получится, я разведу руками и скажу, что не верю (это противоречит тому, что я читал о том, что индексация — это своего рода сбалансированное дерево, которое должно автоматически встраиваться в систему), или, в качестве альтернативы, я прочитал между строк, что индексация сэкономит вам максимум около 20% производительности — хорошо, но не так уж и сильно заморачиваться. Да, это кислый виноград!
решение1
Первые некластеризованные индексы не являются новинкой в SQL Server 2008. Они существуют уже давно. Фильтрованные индексы являются новинкой в SQL Server 2008.
Невозможно заставить систему определить, какие индексы необходимо создать до выполнения каких-либо запросов к SQL Server.
Существует два способа создания индексов в SQL Server. Один из них — с помощью T/SQL, а другой — с помощью SQL Server Management Studio, в котором есть графический редактор. Графический редактор просто сгенерирует T/SQL и запустит T/SQL в базе данных.
Код T/SQL для создания некластеризованного индекса по двум десятичным столбцам будет выглядеть примерно так, как показано ниже.
CREATE INDEX IX_CustomerDecimal1_CustomerDecimal2 on dbo.CUSTOMER
(CustomerDecimal1, CustomerDecimal2)
INCLUDE (CustomerTextComments)
WITH (FILLFACTOR=70)
Нет, если вы планируете использовать два поля CustomerDecimal независимо при поиске в таблице базы данных, то вам понадобится отдельный индекс для каждого из них.
CREATE INDEX IX_CustomerDecimal1 on dbo.CUSTOMER
(CustomerDecimal1)
INCLUDE (CustomerTextComments)
WITH (FILLFACTOR=70)
CREATE INDEX IX_CustomerDecimal2 on dbo.CUSTOMER
(CustomerDecimal2)
INCLUDE (CustomerTextComments)
WITH (FILLFACTOR=70)
В любом случае вам необходимо будет добавить возвращаемые столбцы в список включенных столбцов, чтобы минимизировать генерируемый ввод-вывод.