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

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


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

http://www.sql-ex.ru

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

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

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

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

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


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

§ loki заметил ошибку в скрипте кнопочки с рейтинговой позицией: вместо абсолютного адреса файла-картинки стоял относительный. В результате кнопка не отображалась. Я уже исправил скрипт.

§ Seeker обратил внимание на несоответствие английской и русской формулировок задачи 81. В английской все было с точностью до наоборот. Исправил.

§ На форуме 138 задачи обсуждается третий этап. Попробую реализовать хотя бы первую версию этапа. Пока могу сказать, что он будет оптимизационным. Т.е. чтобы пройти задачу, недостаточно будет ее просто решить. Потребуется еще уложиться в некоторые пределы по времени выполнения, определяемые тестовым решением. Подробности третьего этапа я изложу в рассылке, когда он будет запущен. Заинтересованным лицам следует пройти второй этап, чтобы получить доступ к третьему :-).

§ Сохранили шансы попасть в ТОР 10:
MadVet (задач 135, время 18.614)
SolYUtor (129, 11.062)
loki (121, 9.820)
Johan (117, 6.096)
PS_Sergey (114, 6.726)
Родион1976 (108, 0.962)

§ Продолжили свое восхождение к вершине:
Julia_M (135, 68.887)
Galogen (134, 100.266)
FanOfBeer (123, 78.809)
Ocean (119, 44.021)
imsh (117, 38.627)

§ На этой неделе сертифицированы:
Pavel_yu (A06008576) [BK] (г.Сергиев-Посад, Россия)
loki (B06011209) [AR] (г. Москва, Россия)

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 LastSolved LastVisit
1 Войнов П.Е. (pаparome) 138 47 20 323 348 2.680 07 Aug 2006 01 Sep 2006
2 Юлдашев М.Р. (Snowbear) 138 47 20 323 383 4.055 05 Aug 2006 01 Sep 2006
3 Slobodcicov A.N. (Testo) 138 92 20 323 337 7.180 25 Aug 2006 01 Sep 2006
4 Мурашкин И.В. (lepton) 138 47 20 323 136 10.134 06 Aug 2006 01 Sep 2006
5 Иванов А.Н. (Goapsy) 138 47 20 323 270 18.919 07 Aug 2006 07 Aug 2006
6 Голубин Р.С. (Roman S. Golubin) 138 47 20 323 353 21.138 06 Aug 2006 01 Sep 2006
7 Карасёва Н.В. (vlksm) 138 47 20 323 92 24.922 06 Aug 2006 01 Sep 2006
8 Валуев Д.И. (Fiolent) 138 47 20 323 1085 54.545 24 Aug 2006 01 Sep 2006
9 Кувалкин К.С. (Cyrilus) 137 47 20 321 623 9.768 09 Aug 2006 01 Sep 2006
10 Абашин П.И. (Dizil) 137 47 20 319 348 3.903 07 Aug 2006 31 Aug 2006
11 Самохвалов В. (ValdemarES) 137 47 20 319 273 7.850 17 Aug 2006 25 Aug 2006
12 Тарасов Д.Б. (Gavrila) 136 47 20 318 346 19.382 07 Aug 2006 01 Sep 2006
13 Kamaev V.M. (Heromantor) 135 138 20 316 128 9.044 14 Mar 2006 25 Mar 2006
14 Бураков С.Г. (burakov58) 135 138 20 316 419 17.381 24 Mar 2006 07 Apr 2006
15 frenkental (a2010) 135 137 20 315 110 15.332 19 Jul 2006 26 Jul 2006
16 Крижевич С.А. (yaff) 135 47 20 314 407 14.792 11 Aug 2006 23 Aug 2006
17 Держальцев В.А. (MadVet) 135 47 20 314 498 18.614 27 Aug 2006 30 Aug 2006
18 Зырин В.Е. (Vezyr) 135 47 20 314 204 20.590 05 Aug 2006 12 Aug 2006
19 Страшников А.С. (EffEct) 135 47 20 314 452 59.948 10 Aug 2006 28 Aug 2006
20 Матвеева Ю.Б. (Julia_M) 135 47 20 314 294 68.887 28 Aug 2006 01 Sep 2006

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Корж (KSK) 36 36 65 32 97 931 01 Sep 2006
2 Иванов М.С. (mxi) 40 40 73 15 88 1064 31 Aug 2006
3 >Гребёнкин Ю.И. (ury1) 36 62 69 9 78 326 01 Sep 2006
4 >Lyaskovsky V.L. (Oliver) 41 41 71 7 78 1254 01 Sep 2006
5 >Козлов Е.Н. (Ken_Great) 27 54 53 20 73 556 01 Sep 2006
6 Мальцев А.В. (Палкин) 18 56 44 28 72 442 31 Aug 2006
7 Kaminskyi A. (Kamin) 20 59 38 32 70 346 01 Sep 2006
8 >Шевченко А.Ю. (alexsvk) 24 24 37 32 69 1495 01 Sep 2006
9 >Овечкин М. (Gralph) 19 46 35 32 67 638 01 Sep 2006
10 >Мартиненко Р.М. (nickROMAnt) 21 40 48 17 65 1041 01 Sep 2006
11 >Кальбагаев С.Д. (Sayka) 40 40 65 0 65 1580 01 Sep 2006
12 Kool S. (Koolsql) 36 36 65 0 65 1586 31 Aug 2006
13 >Кузькина Е. (S_n) 39 39 63 0 63 1642 01 Sep 2006
14 >Вавилин А. (S. Peisov) 21 47 40 21 61 614 01 Sep 2006
15 Гильдебрант А.А. (Зембельдович) 26 68 51 9 60 263 31 Aug 2006
16 Агапов В. (KERBEROS) 19 59 36 23 59 347 01 Sep 2006
17 >Козырь М.С. (Mihail_Kozyr) 26 41 57 0 57 1370 01 Sep 2006
18 >Касимов Р.Г. (Ренат) 31 31 56 0 56 1902 01 Sep 2006
19 mar (dr_bye) 31 31 53 0 53 1991 28 Aug 2006
20 nameless (AntonBSE) 16 16 33 17 50 2103 27 Aug 2006
21 Vids I. (Ivars) 27 27 46 3 49 2162 01 Sep 2006
22 Vitaliy L.N. (LeoM89) 20 45 41 7 48 1068 31 Aug 2006
23 >Сергей С.В. (WestDragon) 27 27 46 0 46 2282 01 Sep 2006
24 >Гринев А.В. (AlexxGreen) 24 24 37 8 45 2332 01 Sep 2006
25 zarina D. (fanny) 17 32 34 8 42 1792 31 Aug 2006
26 Шаргородский Е.Ф. (evgen_fed) 23 23 35 7 42 2447 01 Sep 2006
27 Кружков (magnitt) 7 65 12 28 40 283 31 Aug 2006

Изучаем SQL

Настройка операторов SQL на Microsoft SQL Server 2000 (продолжение, начало в вып.99)

Kevin Kline, Claudia Fernandez, Quest Software, Inc. (оригинал: Tuning SQL Statements on Microsoft SQL Server 2000)
Перевод Живенко Н.

Ветвящиеся шаги, демонстрируемые сравнением соединений и подзапросов

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

SELECT au_fname, au_lname
FROM authors
WHERE au_id IN
(SELECT au_id FROM titleauthor)
StmtText
------------------------------------------------------------------------------
|--Nested Loops(Inner Join, OUTER REFERENCES:([titleauthor].[au_id]))
|--Stream Aggregate(GROUP BY:([titleauthor].[au_id]))
| |--Index Scan(OBJECT:([pubs].[dbo].[titleauthor].[auidind]), ORDERED FORWARD)
|--Clustered Index Seek(OBJECT:([pubs].[dbo].[authors].[UPKCL_auidind]),
SEEK:([authors].[au_id]=[titleauthor].[au_id]) ORDERED FORWARD)
Table 'authors'. Scan count 38, logical reads 76, physical reads 0, read-ahead reads 0.
Table 'titleauthor'. Scan count 2, logical reads 2, physical reads 1, read-ahead reads 0.

В этом случае оптимизатор запросов выбирает операцию с вложенным циклом (nested loop). Запрос вынужден считать всю таблицу authors, используя поиск в кластеризованном индексе и ограничиваясь при этом лишь чтением логических страниц.

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

Теперь рассмотрим соединение:

SELECT DISTINCT au_fname, au_lname
FROM authors AS a
JOIN titleauthor AS t ON a.au_id = t.au_id
StmtText
-----------------------------------------------------------------------------
|--Stream Aggregate(GROUP BY:([a].[au_lname], [a].[au_fname]))
|--Nested Loops(Inner Join, OUTER REFERENCES:([a].[au_id]))
|--Index Scan(OBJECT:([pubs].[dbo].[authors].[aunmind] AS [a]), ORDERED FORWARD)
|--Index Seek(OBJECT:([pubs].[dbo].[titleauthor].[auidind] AS [t]),
SEEK:([t].[au_id]=[a].[au_id]) ORDERED FORWARD)
Table 'titleauthor'. Scan count 23, logical reads 23, physical reads 0, readahead
reads 0.
Table 'authors'. Scan count 1, logical reads 1, physical reads 0, read-ahead
reads 0.

Для приведенного запроса число операций логического чтения для таблицы titleauthors увеличивается, а для таблицы authors - уменьшается. Следует обратить внимание, что соединение данных происходит выше (позже) в плане выполнения запроса.

Сравнение планов выполнения запросов

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

В данном примере, сравним два запроса. Первый использует SUBSTRING, а второй - LIKE:

SELECT *
FROM authors
WHERE SUBSTRING( au_lname, 1, 2 )= 'Wh'
StmtText
-----------------------------------------------------------------------------
|--Clustered Index Scan(OBJECT:([pubs].[dbo].[authors].[UPKCL_auidind]),
WHERE:(substring([authors].[au_lname], 1, 2)='Wh'))

Сравним его с аналогичным запросом, использующим LIKE:

SELECT *
FROM authors
WHERE au_lname LIKE 'Wh%'
StmtText
-----------------------------------------------------------------------------
|--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([pubs].[dbo].[authors]))
|--Index Seek(OBJECT:([pubs].[dbo].[authors].[aunmind]),
SEEK:([authors].[au_lname] >= 'WG?' AND [authors].[au_lname] < 'WI'),
WHERE:(like([authors].[au_lname], 'Wh%', NULL)) ORDERED FORWARD)

Очевидно, что второй запрос, использующий операцию INDEX SEEK, имеет более простой план выполнения запроса, чем первый с его CLUSTERED INDEX SCAN.

Для определения лучшего плана выполнения запросов предпочтительней использовать либо SET STATISTICS PROFILE ON, либо опцию SQL Query Analyzer Graphic Execution Plan, а не SET SHOWPLAN_TEXT ON. Эти средства точно покажут вам какую часть обработки данных, в процентах, потребляет каждый шаг в плане выполнения запроса. Это дает возможность сказать, какой вариант является более или менее затратным для оптимизатора запросов. Также можно сразу выполнить два (или более) запроса и сравнить, какой из них является более эффективным.

Также важно использовать SET STATISTICS IO и SET STATISTICS TIME для наиболее полной оценки возможной производительности.

(Продолжение следует...)

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

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

§ Поступила в продажу книга SQL. Задачи и решения, посвященная анализу ошибок, допускаемых при решении задач первого этапа. На сайте издательства Питер можно сделать заказ и познакомиться с содержанием.

Контакты

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

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

В избранное