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

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


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

Выпуск 236 от 04 апреля 2009 г.

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

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

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

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

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


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

§ Добавил подсказку к задаче 89 (второй рейтинговый этап задач на SELECT).

§ Автор изменил формулировку задачи 153, приняв вариант, предложенный $erges.

§ На странице с упражнениями обучающего этапа уже появляются ссылки на соответствующие разделы справки.
Это пока первые мероприятия, направленные на то, чтобы этот этап оправдал свое название (и назначение). :-)

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
7. anddros (150)
33. AKudrakov (148)
35. SCAT (145)

§ Продвинулись в рейтинге:
72. zerga (128, 2.283)
88. HandKot_ (126, 284.381)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
142. maar (117, 87.558)
155. vitaliiS (116, 100.696)
208. Avtolic (120, 14.686)

§ На этой неделе сертифицированы:
lamort1985 (A09035524) [BK] - г.Липецк, Россия

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

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

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

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

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

Лучшие результаты (ТОР 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 154 154 21 376 782 65.266 46.391 53 22 Mar 2009 03 Apr 2009
2 Карасёва Н.В. (vlksm)1 154 154 21 376 1049 90.124 61.061 53 20 Mar 2009 03 Apr 2009
3 Сальников С.А. ($erges)1 153 153 21 372 392 3.854 4.191 49 24 Mar 2009 03 Apr 2009
4 Сенкевич С.В. (GreyC)1 152 152 21 369 358 57.860 27.102 46 26 Jan 2009 02 Apr 2009
5 Селезнёв А.С. (Артём С.)1 150 152 21 363 444 47.248 37.524 46 25 Jan 2009 03 Mar 2009
6 Зотов П.Г. (Ozzy)6 146 153 21 353 382 130.942 148.656 43 27 Mar 2009 03 Apr 2009
7 Дроздков А.Н. (anddros)7 150 150 21 365 309 6.462 7.110 42 01 Apr 2009 03 Apr 2009
8 Никотин В.М. (@Nikotin)1 150 150 21 363 108 8.371 3.751 40 13 Dec 2008 03 Apr 2009
9 Умрихина Е.В. (Umrikhina)8 150 150 21 363 337 20.856 23.215 40 27 Mar 2009 03 Apr 2009
10 Печатнов В.В. (pvv)1 146 149 21 350 357 30.849 17.490 36 10 Oct 2008 28 Mar 2009
11 Муллаханов Р.Х. (rem)9 149 152 21 358 483 14.427 20.056 35 05 Jan 2009 31 Mar 2009
12 Мурашкин И.В. (lepton)1 143 152 21 343 1059 68.477 57.992 33 14 Feb 2009 15 Feb 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 01 Apr 2009
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 >Ильин Е.А. (EvGeniy Lell) 38 52 79 17 96 1007 03 Apr 2009
2 >Орлов М.В. (Орлов Михаил) 19 30 45 34 79 2010 03 Apr 2009
3 Захарченко А.С. (zaharchenko) 13 38 30 28 58 1616 03 Apr 2009
4 Похмелкин А.Ю. (Corleone) 11 68 20 34 54 595 03 Apr 2009
5 Машарова-Григорець Г. (Galina_MG) 14 34 35 19 54 2194 03 Apr 2009
6 Михайлова (Nickolas) 10 49 17 34 51 1084 01 Apr 2009
7 Лапенок Н.В. (Клаус) 21 31 47 3 50 3870 30 Mar 2009
8 Фамилия (qwe123) 13 39 26 23 49 1829 03 Apr 2009
9 >Sangili M. (Soja) 24 24 44 3 47 5255 03 Apr 2009
10 Mykytemko V. (VMykyt) 24 24 44 1 45 5520 01 Apr 2009
11 >Горбунов А.В. (risp) 19 42 44 0 44 2525 03 Apr 2009
12 Евдокимов А. (AlexE) 22 22 44 0 44 5597 03 Apr 2009
13 >Цикалюк В.В. (exroot) 16 54 26 16 42 1261 03 Apr 2009
14 Bazhnev S. (silverSBN) 11 50 19 23 42 1265 03 Apr 2009
15 >Добромыслов (Александр Д.) 18 29 41 0 41 4603 03 Apr 2009
16 >Тараканова Е. (yar_stranger) 14 38 30 10 40 1997 03 Apr 2009
17 >Рогачёв А.А. (aint) 24 24 40 0 40 6169 03 Apr 2009
18 shiny S. (shiny sherbina_rep) 15 28 38 0 38 4624 02 Apr 2009
19 >Федосов В.В. (Федосов В) 21 21 37 0 37 6481 03 Apr 2009
20 Madyarov A.A. (CTerrorist) 16 31 36 0 36 4017 29 Mar 2009
21 Романов (kostik) 4 53 4 30 34 1066 03 Apr 2009
22 lomonosova (lomonosik) 5 26 11 23 34 3322 03 Apr 2009
23 Sosnovsky R. (sosnovsky) 20 21 34 0 34 6709 01 Apr 2009
24 Egorov (alah akbar) 20 20 33 0 33 6986 30 Mar 2009
25 >Кетиладзе В.И. (Vaha) 20 20 32 1 33 7001 03 Apr 2009
26 Мартыненко Р.А. (_RAM) 3 44 5 27 32 1416 02 Apr 2009
27 Шумаков С. (SShumakov) 6 23 16 16 32 4203 03 Apr 2009
28 Jurek (yooreck73) 16 22 32 0 32 6394 01 Apr 2009
29 >Петренко (reazon) 13 35 31 0 31 3405 03 Apr 2009
30 >Смирнов М.А. (MADpro) 20 20 30 0 30 7609 03 Apr 2009

Изучаем SQL

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

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

Динамический SQL

Для списка чисел этот метод покажется обманчиво простым:

CREATE PROCEDURE get_product_names_exec @ids nvarchar(4000) AS

EXEC('SELECT ProductName, ProductID
      FROM   Northwind..Products
      WHERE  ProductID IN (' + @ids + ')')
go
EXEC get_product_names_exec '9, 12, 27, 37'

Но вся история намного более сложна. Есть несколько проблем, которые следует иметь в виду. Для начала давайте рассмотрим пример со списком строк:

    CREATE PROCEDURE get_company_names_exec @customers nvarchar(2000) AS
        EXEC('SELECT CustomerID, CompanyName
             FROM   Northwind..Customers
             WHERE  CustomerID IN (' + @customers + ')')
    go
    EXEC get_company_names_exec '''ALFKI'', ''BONAP'', ''CACTU'', ''FRANK'''

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

Далее следует рассмотреть разрешения. Обычно, когда Вы используете хранимые процедуры, пользователи не должны иметь непосредственный доступ к таблицам, но это правило не применяется, когда Вы используете динамический SQL. В SQL 2000 ничего нельзя было с этим поделать. В SQL 2005 Вы можете организовать разрешения, подписывая процедуру с помощью сертификата. У меня есть отдельная статья, которая описывает, как это сделать - Предоставление Разрешений через Хранимые Процедуры. Но таких сложностей не требует никакой другой метод из рассмотренных в этой статье.

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

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

Что касается производительности, это может оказаться самым быстрым методом для вашего запроса. Это единственный метод, когда оптимизатор имеет полную информацию о входе, и это может привести к лучшему плану, чем тот, который строится на основании слепых предположений или статистике временной таблицы. Но все может быть и иначе. Фактически, в моих тестах динамический SQL оказывался одним из самых медленных методов, уступая даже итерационному методу. Причина заключается в том, что для динамического SQL Вы получаете расходы на компиляцию почти для каждого запроса, а компиляция запроса с длинным списком в предикате IN обходится совсем не дешево. Однако ситуация заметно улучшилась со времен SQL 2000, когда список из 2 000 элементов обрабатывался свыше 10 секунд на всех моих тестовых машинах. В моих тестах на SQL 2005 это случилось только для 10 000 элементов на самой медленной машине.

Если Вы повторно используете тот же самый список, есть вероятность нахождения плана в кэше, и в этом случае повторное выполнение будет быстрым. Но имейте в виду, что тогда это должен быть в точности тот же самый список, поскольку кэш чувствителен и к регистру, и к пробелам. Насколько это может быть вероятным? Скорее всего, это создаст нам еще одну проблему, связанную с динамическим SQL: раздувание кэша. Вы будете наполнять процедурный кэш планами, которые очень редко используются повторно. На машинах с большим количеством памяти, это может привести к серьезным проблемам в производительности из-за коллизий хеширования при поиске в кэше.

Есть однако способ уменьшить затраты на компиляцию для динамического SQL. SQL 2005 имеет новую опцию базы данных - принудительную параметризацию. Когда эта установка включена, SQL Server параметризует все непосредственно выполняемые операторы. Это проявляется в том, что для динамически построенного выражения IN, аналогичного приведенному выше, для заданного числа элементов списка есть только один вход в кэш, который может повторно использоваться всеми запросами с тем же самым числом элементов. Таким образом, есть один вход для одного элемента, один - для двух элементов и т.д. При таких установках динамический SQL действительно очень быстрый - вплоть до 2100 элементов в списке. 2100 - это максимальное число параметров хранимой процедуры или параметризованного оператора. Когда это число превышено, строка не может быть полностью параметризована, и снова будет один вход в кэш для каждой строки с той же плохой производительностью, как и прежде.

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

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

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

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

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

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

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

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

Контакты

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

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

В избранное