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

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


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

Выпуск 220 от 13 декабря 2008 г.

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

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

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

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

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


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

§ По многочисленным просьбам трудящихся сделал страничку, на которой можно следить за деятельностью лидеров (всех, решивших 137-ю задачу). Сейчас показываются все начатые ими задачи 2/3 этапов и задачи, решенные за последние две недели.

§ По просьбе Ozzy добавил в рейтинг по отдельной задаче время решения в формате дд чч:мм:сс.

§ СТЕ теперь разрешено использовать:
- на обучающем этапе;
- на рейтинговых 1 и 2, если задача уже решена, или с флажком "без проверки";
- участникам 3 этапа - без ограничений.

§ Автор (vlksm) добавила проверочные данные и подсказку для задачи 106.

§ Новая задача от $erges заменила задачу 116 (сложность 2 балла).

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
7. rem (147, 149)
8. lepton (150)
9. GreyC (143-146)

§ Продвинулись в рейтинге:
54. AlShin (задач 135, время 10.765)
80. 15th (123, 15.208)

§ Новые лица в ТОР 100 и вернувшиеся туда:
95. breezemaster1 (125, 38.514)
96. Чих (125, 71.310)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
106. Nariman Kurbanoff (124, 86.794)
121. lambda (121, 24.189)
149. Edward_rost (117, 135.224)
156. Shark (113, 2.598)

§ На этой неделе сертифицированы:
Dabbler (A08041837) [BK] - г.Королев, МО, Россия
breezemaster1 (B08039147) [AR] - г.Москва, Россия

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

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Никотин В.М. (@Nikotin) 150 106 21 363 96 8.329 3.751 40 01 Dec 2008 12 Dec 2008
2 Сальников С.А. ($erges) 150 106 21 363 279 3.496 3.824 40 01 Dec 2008 12 Dec 2008
3 Креславский О.М. (Arcan) 150 106 21 363 668 51.995 39.373 40 28 Nov 2008 12 Dec 2008
4 Карасёва Н.В. (vlksm) 150 106 21 363 936 78.003 49.585 40 27 Nov 2008 12 Dec 2008
5 Печатнов В.В. (pvv) 147 149 21 354 357 30.856 17.490 36 10 Oct 2008 12 Dec 2008
6 Селезнёв А.С. (Артём С.) 146 149 21 351 322 38.511 29.235 36 25 Sep 2008 21 Nov 2008
7 Муллаханов Р.Х. (rem) 148 147 21 355 457 14.297 19.979 32 10 Dec 2008 12 Dec 2008
8 >Мурашкин И.В. (lepton) 143 150 21 344 995 47.805 37.312 30 12 Dec 2008 12 Dec 2008
9 >Сенкевич С.В. (GreyC) 146 146 21 351 313 39.327 10.149 28 12 Dec 2008 12 Dec 2008
10 Держальцев В.А. (MadVet) 138 146 21 335 1257 60.806 28.482 28 24 Sep 2008 06 Oct 2008
11 Зотов П.Г. (Ozzy) 142 146 21 342 264 61.179 78.826 28 29 Nov 2008 12 Dec 2008
12 Любченко В.А. (IAS56) 137 146 21 334 615 403.410 373.617 28 11 May 2008 01 Dec 2008
13 Голубин Р.С. (Roman S. Golubin) 141 145 21 337 1122 93.051 58.822 25 13 Sep 2008 06 Dec 2008
14 Nikolaenko A.V. (Shadow77) 143 147 21 341 436 77.515 14.010 23 22 Oct 2008 11 Dec 2008
15 Дроздков А.Н. (anddros) 144 144 21 344 189 4.525 1.153 21 02 Dec 2008 12 Dec 2008
16 Солдатенков Ю.С. (SolYUtor) 139 146 21 333 819 22.624 6.102 20 14 Aug 2008 23 Oct 2008
17 Белогурова К. (Katy_Ekb) 134 143 21 323 552 10.673 4.673 18 27 Nov 2008 09 Dec 2008
18 Егоров А.Б. (ABEgorov) 138 144 21 331 180 12.906 8.815 18 03 Aug 2008 12 Aug 2008
19 Войнов П.Е. (pаparome) 140 146 21 332 1125 3.129 .213 17 22 Sep 2008 11 Dec 2008
20 Тарасов Д.Б. (Gavrila) 143 106 21 340 1201 26.875 3.677 17 09 Dec 2008 12 Dec 2008

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Новосельцев И.Б. (Ibn M) 41 42 78 11 89 1899 11 Dec 2008
2 >Каморин М.В. (raptor_MVK) 46 46 86 3 89 1930 11 Dec 2008
3 Сорокин В. (_Sw_) 43 43 81 0 81 2237 11 Dec 2008
4 Sheibak V. (PaDRe1) 34 34 65 0 65 3232 08 Dec 2008
5 Artamonov I. (artaman) 31 31 56 2 58 3825 10 Dec 2008
6 Боровой А.А. (Alangel) 24 34 54 0 54 3286 08 Dec 2008
7 Волосухин С.С. (TRyaSS) 15 52 24 28 52 1041 12 Dec 2008
8 Иванов И.И. (Testeee) 9 50 17 34 51 959 12 Dec 2008
9 Argentum А.В. (Argentum) 28 29 51 0 51 4221 12 Dec 2008
10 Udodov P.A. (Pavel_U) 24 24 42 0 42 5655 12 Dec 2008
11 >Башутин В.В. (_vladimir_) 15 34 35 6 41 2023 12 Dec 2008
12 >Бойченко М.В. (=bmz=) 2 53 2 34 36 918 12 Dec 2008
13 Пехтерев Е. (E_Pekhterev) 1 33 2 34 36 1671 12 Dec 2008
14 >Иванов (Ивашка) 15 27 34 0 34 4998 12 Dec 2008
15 V M.I. (mateevici) 18 18 32 0 32 6748 08 Dec 2008
16 Вечер (vecher) 20 20 32 0 32 6749 10 Dec 2008
17 Schalks (Krade) 18 18 31 0 31 6907 12 Dec 2008
18 Белов О.И. (Xoma) 9 40 18 12 30 1728 12 Dec 2008
19 Шарипов З.Б. (Зафар) 14 67 25 4 29 592 11 Dec 2008
20 Носов Д.Н. (DNosov2008) 11 23 28 0 28 5320 06 Dec 2008
21 Калинкин Е.Ю. (Евгений73) 10 10 11 17 28 7586 12 Dec 2008
22 >Edo (Kreha) 19 19 26 2 28 7597 12 Dec 2008
23 Кузнецов В.С. (herrRo) 13 68 25 2 27 575 12 Dec 2008
24 >KSP (Portulak) 11 32 27 0 27 3735 12 Dec 2008
25 s (osimax) 12 24 25 0 25 6052 12 Dec 2008
26 >Velayudham (VVK) 17 17 25 0 25 8252 12 Dec 2008

Изучаем SQL

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

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

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

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

varchar или nvarchar?

Как я обсуждал ранее, для функции, которая распаковывает список строк, видимо, будет хорошим выбором иметь столбец nvarchar в возвращаемой таблице, что позволит работать как с Unicode, так и с 8-битовыми данными. Это предпочтительно с точки зрения функциональности. Однако может пострадать производительность. Скажем, мы имеем:

SELECT ...
FROM   tbl t
JOIN   list_to_table(@list) l ON t.indexedvarcharcol = l.nvarcharcol

Почему это плохо? Напомню, что SQL Server имеет строгий порядок типов, который означает, что если сравниваются два значения различных типов, то тип с более низким порядком будет преобразован к типу более высокого порядка. varchar имеет порядок, предшествующий nvarchar. (Вполне естественно, так как набор возможных значений для столбца varchar является подмножеством возможных значений для столбца nvarchar.) Таким образом, в вышеприведенном запросе indexedvarcharcol будет преобразован к nvarchar. Стоимость этого преобразования зависит от коллации (collation) столбца.

Если столбец имеет коллацию Windows, то SQL Server по-прежнему будет в состоянии использовать индекс, поскольку в схеме сопоставления Windows значения varchar идут в том же порядке, что и значения nvarchar. SQL 2005 использует это преимущество, выполняя поиск по диапазону (range seek). Но этот поиск по диапазону является более дорогим по сравнению с прямым поиском, и мои тесты показывают удвоение времени выполнения, что является достаточным основанием для того, чтобы избегать такого преобразования.

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

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

Вы можете узнать, какая коллация используется для столбца, с помощью sp_help.

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

Однооператорные, многооператорные UDF и временные таблицы

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

  • Однооператорная (встроенная) табличная функция (SQL inline). Однооператорная табличная функция в T-SQL является функцией только по синтаксису. Фактически это - параметризуемое представление. Когда запрос включает такую функцию, SQL Server разворачивает функцию, как будто это макрос, и оптимизатор работает с расширенным текстом запроса. Таким образом, для таких функций нет никаких накладных расходов. К этой категории я также причисляю динамический SQL, хотя он и не может быть упакован в функцию.
  • Многооператорные функция. Многооператорная функция, с другой стороны, имеет тело, которое выполняется самостоятельно. Многооператорная функция вычисляется отдельно и возвращает результат в табличную переменную. Следовательно, здесь есть накладные расходы на хранение промежуточного результата. Нет никаких статистических данных, связанных с табличными переменными, следовательно, оптимизатор не видит того, что возвращает такая функция, и может применить только стандартные предположения.
  • Непрозрачные методы. Методы, не относящиеся к SQL, такие как CLR или XML, лежат между двумя типами табличных функций T-SQL. С одной стороны, оптимизатор не имеет никакой информации о том, что они могли бы возвратить, но применяет стандартные предположения. С другой стороны, результаты операций встраиваются в запрос. Т.е. нет никакого промежуточного хранения как для многооператорных функций, поэтому в этом смысле они являются встроенными.
  • Размещение данных в табличных переменных. Вместо непосредственного соединения с функцией Вы можете вставить данные в табличную переменную, а затем уже выполнить соединение с вашей таблицей. Если так поступить с однооператорной функцией T-SQL, это будет подобно переписыванию данной функции в виде многооператорной функции, с учетом того важного факта, что вместо статистики оптимизатор сможет применить только стандартные предположения. (Я исхожу из результатов моих тестов, которые говорят, что накладные расходы на многооператорную функцию выше, чем простое использование табличной переменной, но я не исследовал это подробно.)
  • Размещение данных во временных таблицах. Вместо непосредственного соединения с функцией, Вы можете распаковать ваш список во временную таблицу. Часто говорят, что временная таблица требует больших расходов ресурсов, чем табличная переменная, так как она полностью журнализируется, однако на основании моих тестов я не могу подтвердить это утверждение. Более важно то, что временные таблицы имеют статистику, а это означает, что оптимизатор имеет больше информации, и большее разнообразие планов для выбора лучшего их них.

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

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

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

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

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

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

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

    Контакты

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

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

    В избранное