Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Новости сайта "Упражнения по SQL" (http://www.sql-ex.ru) 160


Новости сайта "Упражнения по SQL (http://www.sql-ex.ru)" Выпуск 160 (19 октября 2007 г.)

Новым посетителям сайта

SQL Exercises Сайт посвящен изучению языка, с помощью которого осуществляется взаимодействие с реляционными (и не только) СУБД. Суть обучения состоит в выполнении заданий на написание запросов к учебным базам данных; при этом система контролирует правильность выполнения заданий. В настоящее время реализованы все операторы подъязыка манипуляции данными (DML), которые включают в себя оператор извлечения данных SELECT, а также операторы модификации данных - INSERT, DELETE и UPDATE.

Мы надеемся, что справочного материала сайта окажется достаточно для самостоятельного обучения. Кроме того, свои решения вы можете обсудить на форуме сайта. Опытных же специалистов приглашаем проверить (продемонстрировать) свое мастерство и принять участие в соревновании, обеспечиваемом рейтинговой системой учета времени выполнения заданий. Фактически, рейтинг ведется на втором этапе тестирования, который начинается сейчас после решения 57-ти задач первого этапа. При подсчете рейтинга каждого участника отбрасывается один самый худший показатель среди всех решенных им упражнений.

Демонстрация плана выполнения запроса и сравнительная оценка эффективности решений поможет вам освоить принципы оптимизации запросов, которые пригодятся на третьем рейтинговом этапе, который начинается после 138 задачи.

Имеется возможность получить сертификат по SQL DML при выполнении определенного количества заданий.


Новости сайта

§ SQL Server User Group и Факультет высоких технологий Южного Федерального Университета проводят в Ростове-на-Дону семинар.
Будут представлены доклады:

Проект SQL-EX.RU и опыт использования Microsoft SQL Server
Моисеенко С.И. (ФВТ ЮФУ)

Новые возможности SQL в реализации Microsoft SQL Server 2008
Шуленин А. (Microsoft, Москва)

Приглашаются все желающие.
Семинар проводится по адресу:
ул. Мильчакова 10 (здание НКТБ Пьезоприбор),
Факультет высоких технологий ЮФУ, а. 510 (5 этаж)
Проезд: авт. 26, 67, 71, 94, 96; маршрут. такси 23, 25, 40, 52, 67, 71, 93, 94, 96.
Остановка Кустанайская (8-этажное здание за рынком Привоз)

§ Обращаюсь через рассылку к Кузьминой Е. (Fiction) с просьбой сообщить индекс местожительства, необходимый для оправки сертификата.

§ 143 задача поддалась vlksm, награда - первое место в рейтинге.
Продолжила восхождение Katy_Ekb. После решения 142 задачи у нее 3 место.
Одна задача осталась Faust_zp до третьего этапа (задач 137, время 16.002).

§ Новые лица в сотне или вернулись в нее:
Gleb (121, 142.038)
zerga (120, 1.377)
AlexFJ (120, 75.065)
Отметим, что zerga сохраняет первое место на этом этапе.

§ Продвинулись в рейтинге:
SoVa (136,258.018)
cmalex (133, 68.403)
Онуфрий Голохвастов (127, 115.297)

§ На этой неделе сертифицированы:
FedorStalker (A07021639) [BK] - г.Краснодар, Россия
Orbie (A07020146) [BK] - г. Реутов, МО, Россия

§ Число подписчиков - 3648

Число участников рейтинга - 11790

Число участников второго этапа - 1097

Сертифицировано на сайте - 190

Лучшие результаты (ТОР 20)

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Карасёва Н.В. (vlksm) 143 143 21 345 529 38.118 12.414 17 17 Oct 2007 19 Oct 2007
2 Северюхин Ю.А. (Venser) 142 142 21 342 200 4.950 .655 14 19 Sep 2007 19 Oct 2007
3 Белогурова (Katy_Ekb) 142 142 21 342 144 7.204 2.315 14 16 Oct 2007 17 Oct 2007
4 Тарасов Д.Б. (Gavrila) 142 142 21 342 755 23.423 2.501 14 20 Sep 2007 17 Oct 2007
5 Солдатенков Ю.С. (SolYUtor) 142 142 21 342 490 17.853 2.695 14 20 Sep 2007 19 Oct 2007
6 Шептунов П.П. (Dzen) 142 142 21 342 279 8.186 3.499 14 02 Oct 2007 16 Oct 2007
7 Мурашкин И.В. (lepton) 142 142 21 342 544 15.800 5.539 14 18 Sep 2007 19 Oct 2007
8 Мальцев А.В. (Палкин) 142 128 21 342 422 49.738 7.690 14 13 Oct 2007 17 Oct 2007
9 Бураков С.Г. (burakov58) 142 142 21 342 974 51.702 19.814 14 30 Sep 2007 30 Sep 2007
10 Голубин Р.С. (Roman S. Golubin) 142 142 21 342 761 59.419 34.203 14 18 Sep 2007 19 Oct 2007
11 Агапов В. (KERBEROS) 135 141 20 326 89 6.143 1.262 11 20 Nov 2006 27 Jul 2007
12 Кувалкин К.С. (Cyrilus) 139 141 20 334 1014 12.506 2.519 11 04 Sep 2007 18 Oct 2007
13 Зверев Д.Л. (dimzv) 135 141 20 326 1141 9.278 4.938 11 19 Dec 2006 22 Dec 2006
14 Войнов П.Е. (pаparome) 141 142 21 338 765 2.788 .049 10 28 Sep 2007 16 Oct 2007
15 Креславский О.М. (Arcan) 141 142 21 338 253 12.066 2.272 10 10 Oct 2007 19 Oct 2007
16 Любченко В.А. (IAS56) 141 142 21 338 377 177.859 20.130 10 16 Sep 2007 28 Sep 2007
17 Васьков Е.В. (Johan) 138 140 21 332 402 12.733 11.402 7 25 Aug 2007 25 Aug 2007
18 Валуев Д.И. (Fiolent) 138 140 21 330 1476 117.100 62.302 4 19 Sep 2007 19 Oct 2007
19 Радар Ю.В. (inkerman) 139 143 21 331 60 5.354 .000 3 07 Oct 2007 19 Oct 2007
20 Юлдашев М.Р. (Snowbear) 139 139 21 331 791 4.162 .000 3 17 Sep 2007 16 Oct 2007

Лучшие результаты за неделю

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Iaremchuk А.В. (Alla) 49 49 91 34 125 883 19 Oct 2007
2 Дудов Д.Е. (Slaador) 49 49 93 11 104 1228 19 Oct 2007
3 >Kalenyuk (iGorK0) 33 55 71 29 100 661 19 Oct 2007
4 М Т.Ю. (йайош) 39 39 68 26 94 1506 19 Oct 2007
5 >Печатнов В.В. (pvv) 40 40 75 5 80 1907 19 Oct 2007
6 >Ермилов И. (Alien) 34 48 79 0 79 1486 19 Oct 2007
7 Постаногова Е.В. (KattPost) 40 40 76 0 76 2054 18 Oct 2007
8 Denisov A. (Cruel Bear) 34 34 56 17 73 2166 14 Oct 2007
9 Семенов А.Ю. (=VVV=) 30 49 67 0 67 1570 18 Oct 2007
10 >Туренко Ю.Л. (nebiros) 15 81 36 29 65 285 19 Oct 2007
11 >Шутов А. (alex55) 32 32 60 5 65 2559 19 Oct 2007
12 >Багров Д.С. (nsk) 13 60 25 34 59 576 19 Oct 2007
13 >Береснев А.Е. (Asis) 31 31 58 0 58 2966 19 Oct 2007
14 Чиликов В.А. (Vovchik) 26 44 56 0 56 1650 15 Oct 2007
15 Morev A. (amopeb) 30 30 56 0 56 3129 18 Oct 2007
16 Салахетдинов Т.Ш. (Timberland) 24 38 55 0 55 2219 17 Oct 2007
17 Тюкинеева Н.П. (tnp) 30 30 55 0 55 3214 19 Oct 2007
18 Онищенко A.A. (AnnON) 30 30 53 0 53 3428 18 Oct 2007
19 Хомченко П.Г. (вся сила в Oracle) 22 36 52 0 52 2443 17 Oct 2007
20 >Дроздов А.С. (Alex1981) 30 30 51 1 52 3473 19 Oct 2007
21 Sedelnikova M. (masha) 28 28 49 0 49 3698 14 Oct 2007
22 Chelidze K.L. (guzi) 27 27 48 0 48 3820 16 Oct 2007
23 >Архипов П.С. (Петр) 21 25 39 8 47 3565 19 Oct 2007
24 Виноградов К.Ю. (Vinos) 27 27 47 0 47 3934 14 Oct 2007
25 Smolin D. (xds) 23 23 46 1 47 3937 18 Oct 2007
26 Telichko (Kulibin) 8 67 16 30 46 453 19 Oct 2007
27 N A.A. (g-nome) 25 25 41 5 46 3977 18 Oct 2007
28 Хубаева Ю.Х. (julia_hubaeva) 18 40 44 0 44 1784 18 Oct 2007
29 Дмитров (DDA) 24 24 40 0 40 4365 14 Oct 2007

Изучаем SQL

Графический план выполнения запросов SQL Server в действии (окончание, начало в вып.159)

Tim Chapman (оригинал: See SQL Server graphical execution plans in action )
Перевод Моисеенко С.И.

Планы выполнения - один из лучших инструментов для настройки ваших запросов на SQL Server. В этой статье я остановлюсь на нескольких основных моментах в графическом плане выполнении, чтобы помочь Вам лучше понять, как SQL Server использует индексы. Я также предлагаю идеи относительно того, как сделать ваши запросы быстрее.

Я удаляю индекс, так как он никак не изменит результатов остальных моих примеров.

 

DROP INDEX SalesHistory.idx_SalesHistory_Product

 

SaleDate в таблице SalesHistory преднамеренно уникален, что видно из скрипта, который я использовал для генерации данных. Если я создам индекс на SaleDate и буду искать конкретные данные, следует ожидать, что мой поиск будет использовать этот индекс намного более эффективно, чем мои индексы на столбце Product.

 

CREATE NONCLUSTERED INDEX idx_SalesHistory_SaleDate
 ON SalesHistory(SaleDate ASC)

 SELECT SaleDate, Product FROM SalesHistory
 WHERE SaleDate = '1971-05-11 00:00:00.000'

 

План выполнения ниже подтверждает мое ожидание. Из-за более высокой селективности столбца SaleDate использовался поиск по индексу (index seek). Этот план выполнения также демонстрирует то, что известно как Поиск Закладки (Bookmark Lookup). Bookmark Lookup имеет место, когда SQL Server нашел запись в некластерном индексе, которая удовлетворяет поисковому запросу, но требуемые столбцы в списке столбцов предложения SELECT, не включены в индекс, таким образом SQL Server должен обратиться к диску и найти дополнительные данные. В этом плане выполнения Index Seek находит строку, а поиск в кластерном индексе (Clustered Index Seek) есть поиск закладки (Bookmark Lookup). В SQL Server 2000 для этого используется описание Bookmark Lookup, а в SQL Server 2005 SP2 - Key Lookup (поиск ключа).

Обычно следует по возможности избегать поиска закладок из-за дополнительных операций чтения, присутствующих в поиске необходимых данных. Типичное решение проблемы - это включение дополнительных столбцов, которые Вы читаете, в индекс, используемый для поиска данных. Это будет работать не в каждом случае, поэтому нужно приложить некоторые усилия, чтобы найти сбалансированное решение. См. рисунок D.

Рисунок D

Table 'SalesHistory'. Scan count 1, logical reads 5, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Теперь я хочу видеть план выполнения для того же самого запроса, но без кластерного индекса на столбце SaleID, для этого мне нужно удалить кластерный индекс.

 

DROP INDEX SalesHistory.idx_SalesHistory_SaleID

 SELECT SaleDate, Product FROM SalesHistory
 WHERE SaleDate = '1971-05-11 00:00:00.000'

 

В плане выполнения вы можете увидеть, что поиск по кластерному индексу (Clustered Index Seek) превращается в поиск ID записи (RID Lookup). Это тот же поиск закладки, но иначе названный, поскольку таблица не имеет кластерного индекса. Здесь есть один очень интересный момент, связанный с числом выполненных логических операций чтения. Данный запрос выполняет только четыре операции логического чтения, в то время как предыдущий запрос с кластерным индексом выполнял пять логических операций чтения. Лишнее чтение обусловлено тем фактом, что кластерный индекс должен был использоваться для нахождения строки данных. Всякий раз, когда некластерный индекс получает доступ на таблице, которая имеет кластерный индекс, последний, в конечном счете, используется, чтобы найти нужные строки. Поскольку таблица SalesHistory в настоящее время не имеет кластерного индекса, этот запрос стал на одно логическое чтение быстрее. См. рисунок E.

Рисунок E

Table 'SalesHistory'. Scan count 1, logical reads 4, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

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

Поскольку моя таблица сейчас не имеет кластерного индекса, я хочу повторно создать его. См. следующий код:

 

CREATE CLUSTERED INDEX idx_SalesHistory_SaleID
 ON SalesHistory(SaleID ASC)

 

Table 'SalesHistory'. Scan count 1, logical reads 811, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesHistory'. Scan count 1, logical reads 814, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

К таблице SalesHistory было два обращения при воссоздании кластерного индекса, потому что когда кластерный индекс добавляется к таблице, любые некластерные индексы на той же таблице должны быть перестроены. Некластерный индекс должен сначала получить доступ к кластерному индексу, прежде чем он сможет возвратить данные. Некластерный индекс, который у меня был на столбце SaleDate, был перестроен после уже того, как был построен кластерный индекс. См. рисунок F.

Рисунок F

Настройка ваших запросов

Примеры в этой статье не являются категорическим руководством для построения индексов или чтения планов выполнения и настройки запросов. Моя цель состоит в том, чтобы указать Вам правильное направление для изучения настройки ваших собственных запросов. Настройка запросов - не точная наука, и потребности вашей базы данных будут изменяться с течением времени. Чем больше Вы экспериментируете с возможными комбинациями индексов, тем более успешно Вы будете их использовать.

В следующий раз я планирую еще раз обратиться к графическим планам выполнения и их чтению для запросов, в которых выполняется соединение таблиц.

01-10-2007

Полезная информация

§ Все статьи, публикуемые в рассылке, затем выкладываются на сайте Книги и статьи по SQL.

§ В рамках Премии Рунета проводится "народное голосование". Если вы считаете, что наш сайт заслуживает большей известности в рунете, проголосуйте за него. Для этого
- Пройдите по ссылке www.premiaruneta.ru/narod/vote/.
- Поставьте флажок напротив sql-ex.ru (ближе к концу списка).
- Поставьте флажок "Я согласен с правилами..." ниже списка участников.
- Нажмите кнопку Проголосовать!
Вы можете проголосовать сразу за нескольких участников.

§ Желающих поспособствовать популяризации сайта прошу проголосовать/поставить закладку в социальных сетях:
del.icio.us
dzone.com
Digg.com
Reddit.com
stumbleupon.com

Контакты

По всем вопросам, связанным с функционированием сайта, проблемами при решении упражнений, идеями вы можете обращаться к Сергею И.Моисеенко msi77@yandex.ru. Вы также можете предложить свои задачи для публикации на сайте.

Подписка Subscribe.Ru
Новости сайта "Упражнения по SQL"

В избранное