2013-11-10 4 views
0

я был даны в качестве уступки следующих запросов и как оптимизировать их путем создания индексов:SQL запросов на основе индексов

a)SELECT EmployeeID FROM Employee WHERE Name='John'AND Surname='Brown' 

b)SELECT EmployeeID FROM Employee WHERE Salary=1300 

c)SELECT EmployeeID FROM Employee WHERE Salary BETWEEN 1000 AND 1500 

d)SELECT EmployeeID FROM Employee WHERE Salary+Bonus>1500 

из таблицы Employee: EmployeeID, Имени, Фамилии, Зарплата, Бонус

Я заявлял, что для первого а) составной индекс был бы лучшим и лучше сгруппировался для второго, а частично для третьего и какой-то кластерный в (dI am не уверен, что t мои выборы вы могли бы подтвердить их и исправить, так как я новичок в этом.P.s.indexes лучше быть в Oracle.Thanks заранее.

ответ

3

для первого а) индекс соединения будет лучший

На каких колонках? Фамилия + имя, имя + фамилия? Приказ может иметь значение. В этом случае это, вероятно, не имеет значения, но обычно вы хотите рассмотреть все приложение и подумать о том, как вы обычно будете выполнять поиск. Например, если у вас есть другой запрос, который просматривает только по одной фамилии, вы должны обязательно поместить столбец фамилии сначала в индекс, чтобы этот индекс работал для обоих запросов. Переиндексация может быть почти такой же низкой, как и при индексировании.

кластерный лучше для второго

Опять же, вам необходимо рассмотреть всю таблицу/приложения при выборе индексов. У вас может быть только один кластеризованный индекс в таблице. Весьма вероятно, что ваш кластерный индекс должен находиться в столбце EmployeeID. Даже если мы не видим никаких запросов, использующих его здесь, это наиболее распространенная потребность. Регулярный индекс зарплаты, вероятно, достаточно хорош здесь.

многораздельная для третьего

регулярный индекс Оклад, вероятно, будет достаточно хорошо. База данных сможет перейти к первой записи, а затем «ходить по индексу», пока она больше не будет соответствовать. Но это зависит от размера таблицы ... если таблица огромная (в 10 и 100 миллионы строк), разбиение может иметь смысл (обычно на самой таблице). Я не знаю многих предприятий, которые имеют 10 миллионов сотрудников. Опять же, одна вещь, которую мы хотим сделать, - избегать чрезмерной индексации, и поэтому повторное использование того же индекса из б) является хорошим.

какой-то сгруппированы в (г

Это зависит от двигателя и версии базы данных, но это вряд ли какой-либо индекс сам по себе поможет этот запрос. Причина заключается в том, что выражения очень часто не sargable, то есть оптимизатор запросов не будет достаточно умен, чтобы знать, если индекс будет работать или нет. То, что вы можете сделать, это создать computed column virtual column и поставить индекс по этому столбцу.

I во всех случаях, поскольку вы запрашиваете только столбец EmployeeID, вы хотите добавить EmployeeID в индекс, но на самом деле не индексируете это поле. Просто INCLUDE столбец с индексом.Таким образом, база данных сможет полностью выполнить ваш запрос только из индекса, не возвращаясь к таблице. Причиной просто включить столбец, а не индексировать его, является улучшение производительности инструкций INSERT/UPDATE, чтобы избежать необходимости перестроить индекс.

+0

Привет Joel, ваша ссылка на вычисляемых столбцах для SQL Server. Это ошибка? Я полагаю, вы имели в виду «виртуальные столбцы» для оракула: http://www.oracle-base.com/articles/11g/virtual-columns-11gr1.php – Sebas

+0

@Sebas Я пропустил тег oracle, отвечал главным образом на понятия. Похоже, что INCLUDE - это то, что Oracle не делает. –

+0

Я не уверен, что ваши заметки о «clusterd indexes» применимы, поскольку упоминается только одна таблица. –

2

Для г) индекс функции (ФБР) было бы целесообразно:

CREATE INDEX emp_i3 ON Employee (Salary+Bonus); 
+0

@Sebas (я не могу добавить комментарий к вашему ответу, поэтому я пишу здесь), вы имеете в виду «это _below_ 0,2», а не «выше 0,2», правильно? Многие различные значения Зарплаты (высокая селективность) дали бы высокую ценность для вашего выражения (в направлении 1.0), а не низкое. Кроме того, еще одна вещь, которую следует учитывать, это «фактор кластеризации» индекса (google it, у Тома Ките есть некоторые хорошие тексты) –

+0

Дэвид, ты прав. Я перевернул деление, чтобы отразить правильную логику. спасибо – Sebas

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