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

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


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

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

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

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

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

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

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


С наступающим Новым Годом, с новым счастьем!

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

§ С помощью dimaP, orange и MeVit усилил проверку задач 37, 70 и 127 соответственно.
$erges уточнил формулировку задачи 116 и добавил проверочные данные.

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
7. GreyC (149)
20. AlShin (139-142, 145)

§ Продвинулись в рейтинге:
67. Bulldozer (задач 131, время 335.511)
73. Балуткин (129, 401.552)
86. Nariman Kurbanoff (125, 100.448)

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

§ На этой неделе сертифицированы:
Nariman Kurbanoff (B08032727) [AR] - г.Ашгабат, Туркменистан

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

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

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

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

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

Лучшие результаты (ТОР 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 150 21 364 108 8.371 3.751 40 13 Dec 2008 26 Dec 2008
2 Сальников С.А. ($erges) 150 150 21 364 291 3.487 3.824 40 13 Dec 2008 26 Dec 2008
3 Креславский О.М. (Arcan) 150 116 21 364 689 58.248 39.373 40 19 Dec 2008 26 Dec 2008
4 Карасёва Н.В. (vlksm) 150 150 21 364 953 78.649 49.585 40 14 Dec 2008 26 Dec 2008
5 Печатнов В.В. (pvv) 146 149 21 352 357 30.849 17.490 36 10 Oct 2008 26 Dec 2008
6 Селезнёв А.С. (Артём С.) 145 149 21 349 322 38.500 29.235 36 25 Sep 2008 21 Nov 2008
7 Сенкевич С.В. (GreyC) 148 149 21 358 326 48.813 18.056 34 25 Dec 2008 26 Dec 2008
8 Муллаханов Р.Х. (rem) 148 150 21 356 460 14.351 19.979 32 13 Dec 2008 26 Dec 2008
9 Мурашкин И.В. (lepton) 142 150 21 342 995 47.797 37.312 30 12 Dec 2008 18 Dec 2008
10 Держальцев В.А. (MadVet) 137 146 21 333 1257 60.783 28.482 28 24 Sep 2008 06 Oct 2008
11 Зотов П.Г. (Ozzy) 141 146 21 340 264 61.111 78.826 28 29 Nov 2008 26 Dec 2008
12 Любченко В.А. (IAS56) 136 146 21 332 615 403.343 373.617 28 11 May 2008 01 Dec 2008
13 Голубин Р.С. (Roman S. Golubin) 140 145 21 335 1122 93.042 58.822 25 13 Sep 2008 06 Dec 2008
14 Nikolaenko A.V. (Shadow77) 142 147 21 339 436 77.451 14.010 23 22 Oct 2008 11 Dec 2008
15 Дроздков А.Н. (anddros) 144 116 21 345 203 4.592 1.153 21 16 Dec 2008 26 Dec 2008
16 Солдатенков Ю.С. (SolYUtor) 138 146 21 331 819 22.615 6.102 20 14 Aug 2008 23 Oct 2008
17 Белогурова К. (Katy_Ekb) 133 143 21 321 552 10.666 4.673 18 27 Nov 2008 09 Dec 2008
18 Егоров А.Б. (ABEgorov) 137 144 21 329 180 12.897 8.815 18 03 Aug 2008 12 Aug 2008
19 Войнов П.Е. (pаparome) 139 146 21 330 1125 3.124 .213 17 22 Sep 2008 11 Dec 2008
20 >Шиндин А.В. (AlShin) 143 141 21 341 69 16.784 3.529 17 26 Dec 2008 26 Dec 2008

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Knyukh (kbi) 40 40 76 34 110 1325 26 Dec 2008
2 >Абдуллин А.В. (nonStyle) 27 43 63 23 86 1434 26 Dec 2008
3 >megaimpega M.M. (mega_impega) 38 38 74 0 74 2654 26 Dec 2008
4 >Серебрянников А. (good site) 34 34 64 0 64 3371 26 Dec 2008
5 >Konyaev (privateer) 28 28 52 9 61 3625 26 Dec 2008
6 Ларина О.В. (_olga_) 31 31 60 0 60 3694 24 Dec 2008
7 >Shuttle (Shuttle) 28 28 52 3 55 4135 26 Dec 2008
8 Мяконьких А.В. (Andy Miakonkikh) 22 48 43 9 52 1185 26 Dec 2008
9 >Пушников А.А. (Chron0s) 25 25 46 0 46 5116 26 Dec 2008
10 >Кващенко Р.Ю. (_blade) 26 26 45 0 45 5266 26 Dec 2008
11 Садовников М.С. (Greek77882) 12 22 27 17 44 4150 22 Dec 2008
12 >Казанцев (Бородач) 24 24 44 0 44 5352 26 Dec 2008
13 >Черный С. (serij) 5 43 9 34 43 1183 26 Dec 2008
14 >Зварич (Зварич Дмитрий) 13 26 30 10 40 3319 26 Dec 2008
15 >Байдаков И.Е. (PIVOVAR) 21 21 37 0 37 6199 26 Dec 2008
16 Зайцев А. (Zaalex) 18 18 30 5 35 6364 23 Dec 2008
17 Мисихин А.В. (andech1) 13 29 31 3 34 4083 24 Dec 2008
18 Власов П.В. (Rider) 11 52 18 15 33 944 24 Dec 2008
19 Виленская Ю.С. (Sur4atina) 12 21 29 3 32 5805 26 Dec 2008
20 >tkachuk R. (roman_tkachuk) 20 20 32 0 32 6800 26 Dec 2008
21 Новосельцев И.Б. (Ibn M) 11 59 16 15 31 822 24 Dec 2008
22 aaaa (Регул) 0 10 0 31 31 5331 26 Dec 2008
23 Ginzburg Z. (Aldvin) 12 22 30 0 30 5775 22 Dec 2008
24 Воробьёв (ыыыышка) 18 23 30 0 30 5828 22 Dec 2008

Изучаем SQL

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

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

Типы MAX или обычные (n)varchar?

В предыдущем разделе я обсуждал проблемы соединения nvarchar с varchar. Когда я запускал свои тесты производительности и исследовал некоторые неожиданные результаты, я обнаружил вторую проблему подобного рода. Посмотрите на это:

SELECT ...
FROM   tbl t
JOIN   list_to_table(@list) l ON t.indexednvarcharcol = l.nvarcharmaxcol

Функция list_to_table (список-в-таблицу), которая используется здесь такова, что возвращаемое значение имеет тип nvarchar (MAX). Это также приводит к неявному преобразованию типа индексного столбца. На первый взгляд это может показаться неочевидным, но когда SQL Server оценивает выражение, он всегда работает с одним и тем же типом данных для всех операндов. И очевидно, что nvarchar(4000) и более короткий отличается от типа данных nvarchar(MAX). Результат неявного преобразования не является фатальным. Оптимизатор применяет оператор поиска в диапазоне (range-seek) и по-прежнему может использовать индекс, но, тем не менее, здесь есть потери производительности. Когда я впервые запускал мои тесты, я не наблюдал этой проблемы, и мои однооператорные функции возвращали nvarchar(MAX) (по той простой причине, что входная строка имела тип nvarchar (MAX)). Как следствие, казалось, что мои тесты в некоторых случаях показывали худшую производительность для однооператорных функций, чем соответствующие решения на базе многооператорных функций.

Вероятно, в большинстве случаев, когда Вы используете функции list_to_table для списка строк, последние будут короткими, лишь в несколько символов длиной. Поэтому, есть все основания проверить, что ваша функция list_to_table возвращает обычный varchar или nvarchar. В частности, это означает, что для однооператорных функций Вы должны проверить явное преобразование возвращаемого значения к обычному (n)varchar. Вы сможете увидеть это во всех однострочных функциях данной статьи.

Коллации (схемы сопоставления)

Все функции в этой статье используют nvarchar как для параметров, так и для выходных и внутренних переменных. Если Вы никогда не работали с данными Unicode, то можете подумать, что Вам следует переписать функции на использование varchar, предполагая, что SQL Server будет быстрей работать с 8-битовые символами, чем с 16-битовыми символами Unicode.

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

С другой стороны, при использовании коллации SQL Вы можете получить приблизительно 30-ускорение времени выполнения при использовании varchar. Это обусловлено тем, что коллации SQL являются только 8-битовыми, для которых существуют отдельный набор 8-битовых процедур, и правила для 8-битового набора символов намного проще, чем правила для Unicode. Если Вы имеете коллацию SQL и используете nvarchar, Вы фактически внутри используете сопоставление Windows.

Следует отметить, что точный прирост производительности зависит от типа операции. 30 % - это то, что Вы можете ожидать от простого сравнения на равенство. Есть ситуации, когда использование varchar или nvarchar для коллации SQL может приводить к разнице в 7 раз. Мы увидим такой случай в разделе "действительно медленных методов".

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

charindex(@delimiter COLLATE Slovenian_BIN2, @list, @pos + 1)

Так как @delimiter преобразован к явно указанной коллации, это же происходит и с @list. (Данный вопрос обсуждается в Books Online в статье Collation Precedence.) При использовании charindex для поиска разделителя будет лучше искать точный разделитель, и не иметь необходимости в нечувствительном к регистру или акценту поиске. Таким образом, использование двоичной коллации в данной ситуации не приводит к какой-либо потере функциональности. Когда я протестировал это на итерационном методе, то получил приблизительно 10%-ое уменьшение времени выполнения.

(Почему Словенская? И почему BIN2? Словенская потому, что мои тестовые данные представляли собой список словенских слов из орфографического словаря. BIN2 - новый тип двоичных коллаций в SQL 2005. Я действительно не почувствовал разницы по отношению к использованию старых двоичных коллаций, но все же, это, наверное, лучший выбор. Так или иначе, не важно, какую двоичную коллацию Вы используете.)

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

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

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

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

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

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

Контакты

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

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

В избранное