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

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


Новости сайта "Упражнения по SQL (http://www.sql-ex.ru)" Выпуск 197 (05 июля 2008 г.)

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

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

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

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

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


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

§ Автор - vlksm - усилила проверку 74 задачи. Теперь эта задача будет проверяться на отдельной базе.
Для своей задачи 89 _Bkmz_ также подготовил обновление проверочной базы, в результате чего многие решения перестали проходить.
Как справедливо заметил Solnceklesh, в задаче 25 стали приниматься неверные решения. Я добавил данные, но боюсь, что теперь собьется проверка какой-нибудь другой задачи. Просьба сообщать о таких случаях. Тогда созрею для создания отдельной проверочной базы для 25 задачи :-).
В конечном итоге для каждой задачи будет своя база, а общая будет использоваться для дополнительной проверки.

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
2. Arcan (147) - третий решивший все задачи на сегодняшний день.

§ Мы принимаем участие в конкурсе Ростовских сайтов. Голосовать можно один раз в день, если, конечно, есть желание :-).
Чтобы голосовать требуется авторизация.

§ Новые лица в ТОР 100 и вернувшиеся туда:
100. Чих (задач 123, время 40.060)

§ Продвинулись в рейтинге:
33. AKudrakov (137, 36.220)
34. ABEgorov (134, 6.918)
35. Shadow77 (136, 13.243)
36. DeadLock5 (136, 124.177)
37. Ozzy (136, 23.624)
45. Angellore (134, 46.335)
47. Scorpion (134, 64.954)
50. TomGolab (133, 44.648)
52. marishkin (129, 18.932)
63. Fomichev (130, 14.203)
70. denzel (129, 112.021)
75. Чумазик (128, 101.471)
85. lexaNRJ (126, 86.633)
94. Vetaleg (124, 51.101)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
120. anddros (120, 1.906)
121. _Bkmz_ (120, 2.706)
134. HandKot_ (118, 169.493)
148. Rash ST (114, 7.141)
152. ЕО (113, 19.148)
167. shadon (110, 13.828)

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

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Сальников С.А. ($erges) 147 147 21 357 118 2.842 3.359 31 23 Jun 2008 04 Jul 2008
2 Креславский О.М. (Arcan) 147 89 21 357 517 37.671 27.498 31 30 Jun 2008 04 Jul 2008
3 Карасёва Н.В. (vlksm) 147 147 21 357 778 73.340 46.383 31 22 Jun 2008 04 Jul 2008
4 Печатнов В.В. (pvv) 146 89 21 354 257 19.426 6.326 28 02 Jul 2008 04 Jul 2008
5 Держальцев В.А. (MadVet) 142 146 21 347 1128 60.815 28.482 28 18 May 2008 23 Jun 2008
6 Любченко В.А. (IAS56) 142 146 21 347 615 403.439 373.617 28 11 May 2008 08 Jun 2008
7 Голубин Р.С. (Roman S. Golubin) 144 74 21 348 1044 92.981 58.822 25 27 Jun 2008 04 Jul 2008
8 Мурашкин И.В. (lepton) 139 146 21 338 767 37.107 26.815 21 28 Apr 2008 02 Jul 2008
9 Белогурова К. (Katy_Ekb) 138 143 21 335 361 10.714 4.673 18 20 May 2008 27 May 2008
10 Войнов П.Е. (pаparome) 143 146 21 343 1034 3.103 .213 17 23 Jun 2008 04 Jul 2008
11 Северюхин Ю.А. (Venser) 134 142 21 326 335 4.925 .655 14 01 Feb 2008 04 Feb 2008
12 Борисенков Д.В. (xuser) 137 142 21 331 92 3.217 .926 14 02 May 2008 30 May 2008
13 Мишин С.А. (CepbIu) 140 55 21 335 69 9.772 2.148 14 26 Jun 2008 04 Jul 2008
14 Тарасов Д.Б. (Gavrila) 138 15 21 331 1039 23.531 2.501 14 30 Jun 2008 04 Jul 2008
15 Солдатенков Ю.С. (SolYUtor) 135 142 21 327 703 17.844 2.695 14 20 Apr 2008 04 Jul 2008
16 Кувалкин К.С. (Cyrilus) 135 142 21 327 1207 13.037 2.782 14 15 Mar 2008 01 Jul 2008
17 Шептунов П.П. (Dzen) 133 142 21 325 279 8.120 3.499 14 02 Oct 2007 15 Nov 2007
18 Селезнёв А.С. (Артём С.) 136 142 21 330 127 15.589 4.279 14 14 Mar 2008 31 Mar 2008
19 iglbeat (iglbeat) 140 55 21 335 318 27.448 6.641 14 27 Jun 2008 27 Jun 2008
20 Мальцев А.В. (Палкин) 133 142 21 325 422 48.779 7.690 14 13 Oct 2007 18 Jun 2008

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Хлусов П.В. (lamort1985) 52 52 98 0 98 1586 04 Jul 2008
2 >Миронович Н.В. (NikolayW) 34 45 74 0 74 1996 04 Jul 2008
3 >Cherepanov D. (Simplex) 24 24 39 28 67 2912 04 Jul 2008
4 >Matisov A. (yoj) 13 71 31 34 65 447 04 Jul 2008
5 Васьковская Т. (Tatiana Vaskovskaya) 34 34 62 0 62 3265 02 Jul 2008
6 Сушина Ю.А. (Liyas) 27 41 61 0 61 2376 03 Jul 2008
7 >Васьковский С.А. (vaskovskiy) 27 40 61 0 61 2500 04 Jul 2008
8 Vildanov M. (mar_vi) 24 86 55 0 55 281 03 Jul 2008
9 Курин Д. (Умклайдет) 9 54 19 32 51 875 04 Jul 2008
10 >Цаплин С.В. (Allgood) 15 15 19 32 51 4187 04 Jul 2008
11 Митков М. (msg) 23 35 50 0 50 3231 03 Jul 2008
12 Хачатуров С.А. (Хачатуров) 26 26 48 1 49 4425 04 Jul 2008
13 Фадеев (GrailKeeper) 27 27 45 3 48 4515 04 Jul 2008
14 >Нестеров (WyrM) 27 27 48 0 48 4521 04 Jul 2008
15 Травулько К.М. (kiryl_t) 20 33 47 0 47 3335 02 Jul 2008
16 >Gordeev A. (AndryG) 28 28 47 0 47 4608 04 Jul 2008
17 >Михайлова (viki_sql) 26 26 47 0 47 4611 04 Jul 2008
18 >Wos T. (twos1) 25 25 43 3 46 4746 04 Jul 2008
19 Штапнов А.И. (SetStar) 13 51 29 16 45 1240 04 Jul 2008
20 Чашников А. (kunio-kun) 18 32 43 2 45 3348 02 Jul 2008
21 Козлов А.С. (Avtolik) 24 24 35 9 44 4955 03 Jul 2008
22 >Царьков И.Г. (ts1234) 17 50 34 9 43 1459 04 Jul 2008
23 >Муравщик (muravacyb) 25 25 43 0 43 5122 04 Jul 2008
24 >Голованов Д. (DiGo) 25 25 43 0 43 5134 04 Jul 2008
25 Tatarenko (=marinos=) 8 67 19 23 42 701 03 Jul 2008
26 >Царьков А.Г. (Skypchel) 15 55 27 15 42 814 04 Jul 2008
27 Глазырин Д. (glassman) 11 41 21 20 41 1532 04 Jul 2008
28 Фёдоров В. (Nihr0M) 14 29 32 8 40 3256 30 Jun 2008

Изучаем SQL

Требования к SQL Server по усилению поддержки: предложение OVER() и упорядоченные вычисления (продолжение, начало в вып.195)

Itzik Ben-Gan и Sujata Mehta (оригинал: SQL Server Feature Enhancement Request - OVER Clause and Ordered Calculations )
Перевод Карасева Н.В.

Немного отвлечемся и обратим внимание на недостаток оптимизатора в отношении подзапросов. Это не основная тема статьи, поэтому вы вполне можете пропустить это отступление. Допустим, пользователь изменил запрос и теперь желает увидеть, помимо общего количества, еще и среднее значение, минимальное количество и максимальное количество на работника по месяцам от начала деятельности работника до текущего месяца. Изменения довольно просты, поэтому мы просто и добавляем вычисления всех агрегатов с помощью подзапросов.

----------------------------------------------------------
-- Агрегация с накоплением
-- Решение 1 : Использование коррелированных подзапросов
-- многочисленные агрегаты
----------------------------------------------------------

SELECT O1.empid, O1.ordermonth, O1.qty,
  (SELECT SUM(O2.qty)
   FROM EmpOrders AS O2
   WHERE O2.empid = O1.empid
     AND O2.ordermonth <= O1.ordermonth) AS cumulativeqty,
 (SELECT CAST (AVG(1.0 * O2.qty) AS DECIMAL (12,2))
   FROM EmpOrders AS O2
   WHERE O2.empid = O1.empid
     AND O2.ordermonth <= O1.ordermonth) AS avgqty,
  (SELECT MAX (O2.qty)
   FROM EmpOrders AS O2
   WHERE O2.empid = O1.empid
     AND O2.ordermonth <= O1.ordermonth) AS maxqty,
  (SELECT MIN (O2.qty)
   FROM EmpOrders AS O2
   WHERE O2.empid = O1.empid
     AND O2.ordermonth <= O1.ordermonth) AS minqty
FROM EmpOrders AS O1
ORDER BY O1.empid, O1.ordermonth;

GO

Рисунок 1-2: План выполнения для запроса, использующего коррелированные подзапросы для вычисления многочисленных агрегатов с накоплением

Теперь мы видим, что каждый подзапрос требует повторного сканирования данных (даже если всем подзапросам нужны одни и те же строки). Если обозначить количество агрегатов вычисляемых подобным образом за A, ценой этого плана, выраженной в количестве частичных сканирований, будет A*P* (N+N^2) /2 (min и max будут исключениями, для них нужны только первая и последняя строка в выборке). Дефект оптимизатора состоит в том, что он не догадывается, что может использовать одно и то же сканирование для разных агрегатов. Этот недостаток можно преодолеть за счет соединения таблицы EmpOrders с самой собой, что, по-видимому, интуитивно не так понятно, чем подзапрос.

--------------------------------------------
--Множественная агрегация с накоплением
-- Решение 2: Использование самосоединения
 -------------------------------------------
SELECT O1.empid, O1.ordermonth, O1.qty,
  SUM(O2.qty) AS cumulativeqty,
  CAST (AVG(1.0 * O2.qty) AS DECIMAL (12,2)) AS avgqty,
  MAX(O2.qty) AS maxqty,
  MIN(O2.qty) AS minqty
FROM EmpOrders AS O1
  JOIN EmpOrders AS O2
    ON O2.empid = O1.empid
    AND O2.ordermonth <= O1.ordermonth
GROUP BY O1.empid, O1.ordermonth, O1.qty
ORDER BY O1.empid, O1.ordermonth;

Рисунок 1-3: План выполнения для запроса, использующего самосоединение для вычисления множественных агрегатов с накоплением

План запроса похож на план на рисунке 1-1. Здесь одно и то же частичное сканирование данных обслуживает все агрегатные запросы. Но стоимость по-прежнему P* (N+N^2) /2, и то благодаря индексу на (empid, ordermonth). Без такого индекса, оценка стоимости была бы просто (P*N) ^2.

Даже если мы, как программисты, принимаем этот стиль мышления и получаем все преимущества, создавая решения на основе теоретико-множественного подхода, сам язык SQL (без предложения OVER) не имеет достаточно богатого "словаря" для легкого перевода реальных задач бизнеса на SQL, когда дело касается вычислений над упорядоченными данными (временными или другими последовательностями).

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

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

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

§ Онлайновый выпуск рассылки можно почитать на сайте.

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

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

Контакты

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

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

В избранное