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

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


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

Выпуск 228 от 07 февраля 2009 г.

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

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

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

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

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


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

§ Выполнил очередную чистку рядов, удалив учетные записи "случайных" посетителей. Таковых оказалось 2500 человек.

§ Усилил проверку задачи 21 (DML) в ответ на сообщение and85.

§ К третьему этапу подошел:
46. Vasilko (задач 138, время 10.434)

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
5. $erges (152)
9. Ozzy (148)
15. Umrikhina (144, 145)

§ Продвинулись в рейтинге:
48. AKudrakov (138, 46.130)
54. Fomichev (134, 20.535)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
134. B o r i s (119, 118.357)
154. wadissimo (115, 9.741)
160. a66at (115, 4.252)
178. Stasca (111, 178.999)

§ На этой неделе сертифицированы:
and85 (A09041428) [BK] - г.Киев, Украина

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

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Сенкевич С.В. (GreyC) 152 152 21 371 358 57.860 27.102 46 26 Jan 2009 06 Feb 2009
2 Селезнёв А.С. (Артём С.) 150 152 21 365 444 47.248 37.524 46 25 Jan 2009 06 Feb 2009
3 Креславский О.М. (Arcan) 152 152 21 371 707 59.893 41.017 46 06 Jan 2009 05 Feb 2009
4 Карасёва Н.В. (vlksm) 152 152 21 371 975 79.787 50.723 46 05 Jan 2009 06 Feb 2009
5 >Сальников С.А. ($erges) 151 152 21 368 346 3.578 3.915 43 06 Feb 2009 06 Feb 2009
6 Никотин В.М. (@Nikotin) 150 150 21 365 108 8.371 3.751 40 13 Dec 2008 06 Feb 2009
7 Печатнов В.В. (pvv) 146 149 21 352 357 30.849 17.490 36 10 Oct 2008 06 Feb 2009
8 Муллаханов Р.Х. (rem) 149 152 21 360 483 14.427 20.056 35 05 Jan 2009 06 Feb 2009
9 Зотов П.Г. (Ozzy) 143 148 21 345 332 93.532 111.247 33 05 Feb 2009 06 Feb 2009
10 Шиндин А.В. (AlShin) 147 150 21 355 79 20.458 7.203 30 05 Jan 2009 28 Jan 2009
11 Мурашкин И.В. (lepton) 142 150 21 342 995 47.797 37.312 30 12 Dec 2008 28 Jan 2009
12 Дроздков А.Н. (anddros) 146 151 21 353 237 5.545 6.193 28 19 Jan 2009 06 Feb 2009
13 Держальцев В.А. (MadVet) 137 146 21 333 1257 60.783 28.482 28 24 Sep 2008 30 Dec 2008
14 Любченко В.А. (IAS56) 136 146 21 332 615 403.343 373.617 28 11 May 2008 01 Dec 2008
15 Умрихина Е.В. (Umrikhina) 145 145 21 350 287 13.195 15.554 25 05 Feb 2009 06 Feb 2009
16 Голубин Р.С. (Roman S. Golubin) 141 145 21 338 1260 93.162 58.822 25 29 Jan 2009 29 Jan 2009
17 Nikolaenko A.V. (Shadow77) 142 147 21 339 436 77.451 14.010 23 22 Oct 2008 11 Dec 2008
18 Солдатенков Ю.С. (SolYUtor) 138 146 21 331 819 22.615 6.102 20 14 Aug 2008 23 Oct 2008
19 Белогурова К. (Katy_Ekb) 133 143 21 321 552 10.666 4.673 18 27 Nov 2008 18 Jan 2009
20 Егоров А.Б. (ABEgorov) 137 144 21 329 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 >Shrayber K.A. (Kostyl_) 30 40 65 17 82 1368 06 Feb 2009
2 >Харюков (Khas) 37 49 79 0 79 1896 06 Feb 2009
3 >Дроговозов А. (Drogovozov) 38 38 74 0 74 2726 06 Feb 2009
4 >Гуйдо А. (gualex) 21 69 36 30 66 607 06 Feb 2009
5 >Капитанов А. (AlexanderKap) 33 33 62 0 62 3625 06 Feb 2009
6 Bilukha Y. (Bill79) 31 31 58 0 58 3968 06 Feb 2009
7 >Andrey (mssqler) 27 27 51 0 51 4649 05 Feb 2009
8 Koval T. (taraskoval) 28 28 50 0 50 4767 06 Feb 2009
9 >Балабанов С. (bsu) 29 29 50 0 50 4773 06 Feb 2009
10 >Иванов П.Е. (Bonys) 21 21 49 0 49 4884 06 Feb 2009
11 >Павленко Д.К. (Fantast) 25 27 48 0 48 4799 06 Feb 2009
12 Moroz Y.S. (ymoroz) 27 27 48 0 48 5049 05 Feb 2009
13 Пидоненко В.Л. (wadissimo) 18 115 46 0 46 157 06 Feb 2009
14 Сидоров (Сидоров) 24 25 45 0 45 5229 31 Jan 2009
15 >Стариков (Starikov) 24 24 44 0 44 5494 06 Feb 2009
16 Mochurad I.V. (i.mochurad) 22 26 43 0 43 5159 05 Feb 2009
17 xAndr А. (Сашко) 25 25 43 0 43 5650 05 Feb 2009
18 >Z E. (Elz) 15 86 31 11 42 327 06 Feb 2009
19 Пестерев (Анатолич) 17 40 41 0 41 2607 06 Feb 2009
20 >suvorov (ska) 17 28 41 0 41 4527 06 Feb 2009
21 Гончаров И.С. (Sneg) 16 27 40 0 40 4582 05 Feb 2009

Изучаем SQL

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

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

XML

Использование XML требует, чтобы Вы создали XML-документ на входе, а не разделенный запятыми список. Это немного более сложно, поэтому в большинстве случаев этот метод кажется менее ценным. Где XML действительно фантастически привлекателен, - это когда Вы должны вставить много строк. Вы преобразовываете ваши данные в документ XML на клиенте, а затем распаковываете его в ваши таблицы с помощью методов типа xml.

Узлы и значение

Перейдем к делу. Вот наши процедуры get_company_names (получить имена компаний) и get_product_names (получить названия продукции), использующие XML.

CREATE PROCEDURE get_company_names_xml @customers xml AS
   SELECT C.CustomerID, C.CompanyName
   FROM   Northwind..Customers C
   JOIN   @customers.nodes('/Root/Customer') AS T(Item)
     ON   C.CustomerID = T.Item.value('@custid', 'nchar(5)')
go
EXEC get_company_names_xml
    N'<Root><Customer custid="ALFKI"/>
            <Customer custid="BONAP"/>
            <Customer custid="CACTU"/>
            <Customer custid="FRANK"/>
      </Root>'
go
CREATE PROCEDURE get_product_names_xml @ids xml AS
   SELECT P.ProductName, P.ProductID
   FROM   Northwind..Products P
   JOIN   @ids.nodes('/Root/Num') AS T(Item)
     ON   P.ProductID = T.Item.value('@num', 'int')
go
EXEC get_product_names_xml N'<Root><Num num="9"/><Num num="12"/>
                             <Num num="27"/><Num num="37"/></Root>'

Два метода типа xml, которые мы используем, - это nodes и value. Nodes (узлы) - это функция набора строк, которая возвращает таблицу с одним столбцом, где каждая строка представляет собой фрагмент XML-документа для заданного пути. Таким образом, в этих двух примерах Вы получаете по одной строке на каждый узел Customer (клиент) или Num. Как в случае с производными таблицами, Вы должны задать псевдоним для возвращаемой таблицы. Вы должны также указать имя для столбца, который создает узлы (nodes). (Вы можете также дать имена столбцам производной таблицы, но это не обязательно.)

Единственная операция, которую Вы можете выполнить над T.Item, - это применить любой из четырех методов типа xml: exists, query, nodes и value. Нас интересует метод value. Этот метод извлекает единственное значение из документа XML и возвращает его как тип данных T-SQL. Метод value имеет два параметра: первый - спецификация узла для единственного элемента или атрибута. В данном случае нам нужен атрибут - custid и num соответственно - вот почему мы записали впереди символ @. (Без этого символа это была бы спецификация элемента). Второй аргумент метода - это тип данных T-SQL, который должно иметь возвращаемое значение.

Положение в списке

Если Вам нужно положение в списке, единственный способ сделать это с помощью XML - включить его в документ XML непосредственно. Нет никакого метода типа xml, который возвращает эту информацию. (И row_number Вам не поможет, поскольку row_number требует предложения ORDER BY, а здесь нечего сортировать).

Создание документа XML

Может показаться простым создавать документы XML, добавляя скобки и т.д в коде. Возможно, все что необходимо, - это некоторые замены в T-SQL? Пожалуйста, даже не рассматривайте этот вариант. Вам потребуется использовать библиотечные процедуры, чтобы создать ваши XML- документы. При использовании простого списка с разделителями-запятыми Вы должны не упустить запятую, присутствующую в данных. При работе с XML есть гораздо больше специальных символов, которые должны кодироваться так или иначе. Уже имеется код, который знает обо всем этом, так что нет никакой причины в очередной раз изобретать колесо. К сожалению, я не могу привести Вам примеры, поскольку у меня никогда не было повода делать это самому. Но поиск в библиотеке MSDN должен Вам помочь, независимо от того, программируете Вы в .Net или на обычном языке.

Производительность

Что можно сказать о производительности? Подобно CLR данные из потоков nodes поступают в остальную часть запроса, таким образом, XML также является встраиваемым методом. Но поскольку парсинг XML более сложен, чем парсинг списков с запятыми-разделителями, он оказывается медленнее. В моих тестах, время выполнения для XML на 40-60 % выше, чем для CLR, но это вдвое быстрее итерационного метода. Фактически, XML - это самый быстрый метод, который не требует никакой подготовки на сервере: Вам не нужно активировать CLR, и Вам не придется создавать таблицу чисел. С другой стороны, если код клиента уже создает разделенный запятыми список, Вам придется менять этот код. Вероятно, более высокие потери производительности связаны с созданием XML- документа по сравнению со списком, но мне не представляются они сколь-нибудь существенными. В любом случае это затраты на стороне клиента.

Сравнения здесь применяются к чистому парсингу списка/документа в таблицу. Имейте в виду, что оптимизатор имеет очень мало информации относительно того, что произведет ваш документ. Это относится ко всем методам в этом документе, но XML, кажется, имеет особенно плохую репутацию, проявляющуюся в приведении к плохим планам выполнения запроса. Если Вы столкнетесь с этим, то попробуйте использовать промежуточную временную таблицу.

Вставка многих строк

Я говорил о том, что XML действительно хорош в случае, когда Вам требуется вставить много строк. Итак, как бы Вы сделали это? Фактически Вы уже видели подход. Вы используете nodes и value. Вот пример, где я распаковываю документ с заказами и детализацией заказов:

DECLARE @x xml
SELECT @x =
  N'<Orders>
      <Order OrderID="13000" CustomerID="ALFKI"
             OrderDate="2006-09-20Z" EmployeeID="2">
         <OrderDetails ProductID="76" Price="123" Qty = "10"/>
         <OrderDetails ProductID="16" Price="3.23" Qty = "20"/>
      </Order>
      <Order OrderID="13001" CustomerID="VINET"
             OrderDate="2006-09-20Z" EmployeeID="1">
         <OrderDetails ProductID="12" Price="12.23" Qty = "1"/>
      </Order>
    </Orders>'
SELECT OrderID    = T.Item.value('@OrderID', 'int'),
       CustomerID = T.Item.value('@CustomerID', 'nchar(5)'),
       OrderDate  = T.Item.value('@OrderDate',  'datetime'),
       EmployeeId = T.Item.value('@EmployeeID', 'smallint')
FROM   @x.nodes('Orders/Order') AS T(Item)

SELECT OrderID    = T.Item.value('../@OrderID', 'int'),
       ProductID  = T.Item.value('@ProductID',  'smallint'),
       Price      = T.Item.value('@Price',      'decimal(10,2)'),
       Qty        = T.Item.value('@Qty',        'int')
FROM   @x.nodes('Orders/Order/OrderDetails') AS T(Item)

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

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

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

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

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

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

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

Контакты

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

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

В избранное