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

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


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

Выпуск 233 от 14 марта 2009 г.

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

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

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

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

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


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

§ Функциональность сайта после сбоя почти восстановлена. Еще некоторое результаты требуют корректировки, и я буду продолжать этим заниматься.

§ Ростовчан приглашаем посетить семинар, посвященный SQL Server 2008 Express.
Два доклада сделает Алексей Шуленин (Майкрософт):
1. Express - бесплатная редакция SQL Server. Обзор возможностей.
2. Подготовка отчетов с помощью SQL Server.
Семинар состоится 25 марта (начало в 15:40) по адресу:
ул. Мильчакова 10 (здание НКТБ Пьезоприбор), Факультет высоких технологий ЮФУ, а. 514 (5 этаж)

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
7. Ozzy (149)

§ Подошли к третьему этапу:
47. SCAT (задач 138, время 9.860)

§ Продвинулись в рейтинге:
50. _Bkmz_ (136, 4.864)
55. B o r i s (135, 188.704)

§ Новые лица в ТОР 100 и вернувшиеся туда:
91. Elz (125, 16.901)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
106. EffEct (125, 92.271)
120. shock (122, 36.941)
148. maar (115, 87.521)
162. GrImago (115, 14.632)
164. vitaliiS (115, 87.231)
178. Lohmatyi (113, 2.163)

§ На этой неделе сертифицированы:
lilyok (A09037918) [BK] - г.Старый Оскол, Россия
Андрей Козлов (A09043905) [AR] - г.Севастополь, Украина

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

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Креславский О.М. (Arcan)1 153 153 21 372 763 62.969 44.093 49 03 Mar 2009 13 Mar 2009
2 Карасёва Н.В. (vlksm)1 153 153 21 372 1032 88.313 59.250 49 03 Mar 2009 13 Mar 2009
3 Сальников С.А. ($erges)1 152 152 21 369 356 3.781 4.118 46 16 Feb 2009 13 Mar 2009
4 Сенкевич С.В. (GreyC)1 152 152 21 369 358 57.860 27.102 46 26 Jan 2009 13 Mar 2009
5 Селезнёв А.С. (Артём С.)1 150 152 21 363 444 47.248 37.524 46 25 Jan 2009 03 Mar 2009
6 Никотин В.М. (@Nikotin)1 150 150 21 363 108 8.371 3.751 40 13 Dec 2008 13 Mar 2009
7 Зотов П.Г. (Ozzy)7 145 153 21 349 363 117.377 135.092 39 08 Mar 2009 13 Mar 2009
8 Печатнов В.В. (pvv)1 146 149 21 350 357 30.849 17.490 36 10 Oct 2008 13 Mar 2009
9 Муллаханов Р.Х. (rem)9 149 152 21 358 483 14.427 20.056 35 05 Jan 2009 13 Mar 2009
10 Умрихина Е.В. (Umrikhina)10 148 148 21 356 316 18.299 20.658 33 06 Mar 2009 13 Mar 2009
11 Мурашкин И.В. (lepton)1 143 152 21 343 1059 68.477 57.992 33 14 Feb 2009 15 Feb 2009
12 Дроздков А.Н. (anddros)12 147 151 21 354 260 6.074 6.723 31 11 Feb 2009 13 Mar 2009
13 Шиндин А.В. (AlShin)10 147 150 21 353 79 20.458 7.203 30 05 Jan 2009 28 Jan 2009
14 Держальцев В.А. (MadVet)7 137 146 21 331 1257 60.783 28.482 28 24 Sep 2008 30 Dec 2008
15 Любченко В.А. (IAS56)6 136 146 21 330 615 403.343 373.617 28 11 May 2008 01 Dec 2008
16 Голубин Р.С. (Roman S. Golubin)3 141 145 21 336 1260 93.162 58.822 25 29 Jan 2009 08 Feb 2009
17 Nikolaenko A.V. (Shadow77)12 142 147 21 337 436 77.451 14.010 23 22 Oct 2008 11 Dec 2008
18 Солдатенков Ю.С. (SolYUtor)2 138 146 21 329 819 22.615 6.102 20 14 Aug 2008 23 Oct 2008
19 Белогурова К. (Katy_Ekb)19 133 143 21 319 552 10.666 4.673 18 27 Nov 2008 18 Jan 2009
20 Егоров А.Б. (ABEgorov)20 137 144 21 327 180 12.897 8.815 18 03 Aug 2008 12 Aug 2008

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Мартынюк (Wiedzmen) 50 50 94 15 109 1401 13 Mar 2009
2 >Williams (BW) 56 57 103 0 103 1569 13 Mar 2009
3 >Симакин В.А. (Rybak) 50 68 100 2 102 1056 13 Mar 2009
4 >Подкорытов Е.Н. (e-inventor) 42 51 85 3 88 1729 13 Mar 2009
5 >Титкин А.А. (Creol) 29 68 49 34 83 587 13 Mar 2009
6 Фрис А.Р. (ARF) 41 41 78 0 78 2504 13 Mar 2009
7 Зиновьев Д.В. (DimkaZ) 30 47 66 10 76 1499 13 Mar 2009
8 >Мелентьев И.А. (Trotil) 38 43 74 0 74 2493 13 Mar 2009
9 >Vashkervich N.I. (Natasha_Vashkevich) 36 36 69 0 69 3111 13 Mar 2009
10 >Романов (kostik) 36 36 68 0 68 3195 13 Mar 2009
11 Telichko I. (squared) 27 33 57 0 57 3639 12 Mar 2009
12 >Levadnyaya T. (T.Levadnyaya) 27 27 51 0 51 4700 13 Mar 2009
13 Волков (LehVolk) 13 43 28 19 47 1562 12 Mar 2009
14 Валеев М.А. (mksv) 19 29 45 0 45 4206 13 Mar 2009
15 >Филипцов А.В. (AlexPhil) 20 88 44 0 44 303 13 Mar 2009
16 Пустохайлов А.А. (Pustohaylov) 19 45 40 3 43 2036 11 Mar 2009
17 Баткаев Р. (yorcky) 20 44 43 0 43 2273 13 Mar 2009
18 >Trofimenko E. (tee2009) 23 23 41 1 42 5895 13 Mar 2009
19 Сыровец В.А. (Log1c) 8 67 16 23 39 634 13 Mar 2009
20 >Будыльский А.В. (BAV88) 17 48 36 3 39 1814 13 Mar 2009
21 Santovito F. (#MementoMori#) 17 29 37 0 37 4722 13 Mar 2009
22 Волканин Л.С. (Леонид Волканин) 13 25 32 2 34 4835 08 Mar 2009
23 Суханов А. (asukhanov) 13 26 32 0 32 5205 11 Mar 2009
24 kozlova (irene87) 21 21 32 0 32 7027 10 Mar 2009

Изучаем SQL

Массивы и списки в SQL Server 2005 (начало в вып.217-229, 231-232)

Erland Sommarskog (оригинал: Arrays and Lists in SQL Server 2005 )
Перевод: Моисеенко С.И.

Один возможный недостаток строк фиксированной длины заключается в том, что этот метод более чувствителен к порче данных на входе. Если Вы потеряете где-нибудь один символ или передадите неправильное значение в @itemlen, то весь список будет неправильно интерпретирован. Однако в предположении программного построения списка, это не должно быть серьезным препятствием.

Вы могли заметить, что я не приводил len(@str) к int, как делал это в inline_split_me. Это неплохая идея, и я не обнаружил какого-либо влияния на производительность в этом случае. Чтобы сделать процедуры фиксированной длины простыми для чтения, я решил убрать здесь convert.

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

Неограниченный вход

Когда я представил inline_split_me, то отметил, что эта встраиваемая функция в большинстве случаев не обладает хорошей производительностью по причине использования операций charindex и substring со значениями типа nvarchar(MAX). Это не так для fixstring_single: метод не использует никаких операций charindex и не выполняет substring для каждого символа. Короче говоря, нет никакой потребности в версии fixstring_single с разбиениями; метод хорош и в таком виде.

Риск, что мы исчерпаем все числа, существует и здесь, но он меньше, так как используется всего по одному числу на каждый элемент списка, а не на каждый символ. Так с таблицей Numbers, приведенной выше, мы можем обработать один миллион элементов списка, что достаточно много. Однако можно написать и функцию, которая будет "водонепроницаемой" в этом отношении. Стив Касс (Steve Kass) предложил функцию, которая выполняет самосоединение таблицы Numbers, что возводит в квадрат максимально возможное число. Таким образом, с одним миллионом чисел в таблице, Вы получаете всего 1E12 чисел для работы.

CREATE FUNCTION fixstring_multi(@str nvarchar(MAX), @itemlen tinyint)
   RETURNS TABLE AS
RETURN(SELECT listpos = n1.Number + m.maxnum * (n2.Number - 1),
              str = substring(@str,
                    @itemlen *
                        (n1.Number + m.maxnum * (n2.Number - 1) - 1) + 1,
                    @itemlen)
       FROM   Numbers n1
       CROSS JOIN (SELECT maxnum = MAX(Number) FROM Numbers) AS m
       JOIN   Numbers n2 ON
              @itemlen *
                   (n1.Number + m.maxnum * (n2.Number - 1) - 1) + 1 <=
              len(@str)
       WHERE  n2.Number <= len(@str) / (m.maxnum * @itemlen) + 1
         AND  n1.Number <= CASE WHEN len(@str) / @itemlen <= m.maxnum
                                THEN len(@str) / @itemlen +
                                     CASE len(@str) % @itemlen
                                          WHEN 0 THEN 0
                                          ELSE 1
                                     END
                                ELSE m.maxnum
                           END
)

Это более сложная функция, чем fixstring_single, но для экономии места я оставляю в качестве упражнения читателю разобраться в том, как она работает; замечу лишь одно - что строка с CROSS JOIN спасает меня от излишнего кодирования большого числа строк в Numbers.

Вы можете подумать, что самосоединение, которое позволяет получить 1E12 чисел, должно дорого обойтись, и действительно, если ваши списки, по большей части, коротки (менее 200 элементов), то увеличение нагрузки будет значительным. Однако в моих тестах были случаи, когда fixstring_multi выигрывал у fixstring_single с большим запасом на машине с 4-мя центральными процессорами. Так же, как и в случае с inline_split_me, причина этому - параллелизм. В случае fixstring_multi, оптимизатор использует параллельное выполнение даже для такого запроса:

SELECT * FROM fixstring_multi ('000000123000000456', 9)

Что касается inline_split_me, то оптимизатор не использует длину входного параметра для своих оценок.

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

CREATE FUNCTION fixstring_multi2(@str nvarchar(MAX), @itemlen tinyint)
  RETURNS TABLE AS
RETURN(
     SELECT listpos = (s.sliceno - 1) * (s.maxnum / @itemlen) + n.Number,
            str = substring(s.slice, @itemlen * (n.Number - 1) + 1, @itemlen)
     FROM   (SELECT m.maxnum,
                    sliceno = n.Number,
                    slice = substring(@str,
                                      (m.maxnum - m.maxnum % @itemlen) *
                                            (n.Number - 1) + 1,
                                      m.maxnum - m.maxnum % @itemlen)
             FROM   Numbers n
             CROSS  JOIN (SELECT maxnum = MAX(Number) FROM Numbers) AS m
             WHERE  n.Number <= len(@str) /
                    (m.maxnum - m.maxnum % @itemlen) +
                    CASE len(@str) % (m.maxnum - m.maxnum % @itemlen)
                         WHEN 0 THEN 0
                         ELSE 1
                    END) AS s
     JOIN   Numbers n ON n.Number <= len(s.slice) / @itemlen +
              CASE len(s.slice) % @itemlen WHEN 0 THEN 0 ELSE 1 END
   )

Производительность практически такая же, как и для fixstring_multi, включая хорошие показатели на многопроцессорных машинах благодаря параллелизму.

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

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

§ Приглашаем вас посетить новый проект - Интерактивный учебник по SQL.
   Ресурс позиционируется как "справочное обеспечение" для сайта SQL-EX.RU, но может использоваться и независимо от него.

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

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

§ Хотите поддержать проект? Вот инструкция по применению. :-)

Контакты

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

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

В избранное