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

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


Новости сайта "Упражнения по SQL (http://www.sql-ex.ru)" Выпуск 181 (15 марта 2008 г.)

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

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

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

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

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


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

§ Одна задача до третьего этапа осталась xuser и все шансы на первое место по итогам второго этапа (задач 137, время 2.132).

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
4. IAS56 (146) - четвертый участник, решивший все задачи.
13. Артём С. (140, 141)

§ Новые лица в ТОР 100 и вернувшиеся туда:
67. Gendalf (132, 104.679)

§ Продвинулись в рейтинге:
29. Inuyasha (137, 2.555)
38. iglbeat (136, 19.249)
51. runaway (134, 19.286)
61. raul (134, 17.823)
79. Чумазик (128, 89.135)
86. paul (126, 5.982)
88. Vezyr (126, 20.087)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
111. nadush (121, 155.590)
117. Cергей L (120, 23.368)
123. Ариам (119, 6.780)
124. VetaleG (119, 44.795)
152. $erges (111, .737)
159. Eka (110, 7.003)
160. Walery (110, 9.498)
161. DeadLock5 (110, 73.589)
183. andrij (111, 18.428)

§ На этой неделе сертифицированы:
xuser (B08027866) [AR] - г. Воронеж, Россия
creat0r85 (A08027994) [BK] - г.Ногинск, МО, Россия
shadon (A08028458) [BK] - г.Угледар, Украина
NickVTim (A08008017) [BK] - г.Минск, Беларусь
AlexPet (A08029233) [BK] - г.Брянск, Россия
Seeker (A08011872) [BK] - г.Краков, Польша

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

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Печатнов В.В. (pvv) 146 146 21 357 127 19.165 6.326 28 23 Feb 2008 14 Mar 2008
2 Креславский О.М. (Arcan) 146 146 21 357 389 22.436 12.553 28 23 Feb 2008 14 Mar 2008
3 Карасёва Н.В. (vlksm) 146 146 21 357 667 64.764 38.288 28 03 Mar 2008 14 Mar 2008
4 Любченко В.А. (IAS56) 146 146 21 357 552 403.414 373.617 28 09 Mar 2008 14 Mar 2008
5 Голубин Р.С. (Roman S. Golubin) 145 145 21 354 919 92.541 58.822 25 23 Feb 2008 13 Mar 2008
6 Держальцев В.А. (MadVet) 144 144 21 351 1055 54.302 21.989 22 06 Mar 2008 14 Mar 2008
7 Белогурова К. (Katy_Ekb) 143 11 21 347 287 10.733 4.673 18 07 Mar 2008 12 Mar 2008
8 Войнов П.Е. (pаparome) 143 146 21 346 916 3.013 .213 17 26 Feb 2008 06 Mar 2008
9 Северюхин Ю.А. (Venser) 140 142 21 339 335 4.930 .655 14 01 Feb 2008 04 Feb 2008
10 Тарасов Д.Б. (Gavrila) 141 142 21 340 914 23.390 2.501 14 26 Feb 2008 14 Mar 2008
11 Солдатенков Ю.С. (SolYUtor) 139 142 21 338 490 17.852 2.695 14 20 Sep 2007 14 Mar 2008
12 Шептунов П.П. (Dzen) 139 142 21 338 279 8.130 3.499 14 02 Oct 2007 15 Nov 2007
13 >Селезнёв А.С. (Артём С.) 142 141 21 343 127 15.597 4.279 14 14 Mar 2008 14 Mar 2008
14 Мурашкин И.В. (lepton) 142 142 21 343 705 15.853 5.539 14 26 Feb 2008 13 Mar 2008
15 Мальцев А.В. (Палкин) 139 142 21 338 422 48.788 7.690 14 13 Oct 2007 20 Jan 2008
16 Васьков Е.В. (Johan) 139 142 21 338 493 14.323 12.767 14 24 Nov 2007 11 Feb 2008
17 Бураков С.Г. (burakov58) 139 142 21 338 974 51.701 19.814 14 30 Sep 2007 09 Nov 2007
18 Валуев Д.И. (Fiolent) 142 142 21 343 1638 188.425 131.545 14 28 Feb 2008 14 Mar 2008
19 Агапов В. (KERBEROS) 132 141 20 322 89 6.140 1.262 11 20 Nov 2006 27 Jul 2007
20 Кувалкин К.С. (Cyrilus) 140 141 21 337 1190 12.779 2.519 11 27 Feb 2008 14 Mar 2008

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Макаров (_Bkmz_) 58 58 110 34 144 725 14 Mar 2008
2 anisimov A.A. (shkeeper) 47 47 90 0 90 1888 14 Mar 2008
3 >Гудим Д.В. (Denis Gudim) 38 38 68 19 87 1983 14 Mar 2008
4 Костин М.Ю. (mishik) 29 62 52 31 83 684 14 Mar 2008
5 Малых В.С. (Hombir) 25 37 58 23 81 1472 14 Mar 2008
6 Прудентов А.В. (Andrey VP) 39 39 76 0 76 2311 14 Mar 2008
7 >Обманкин С.И. (Doc@) 33 43 72 0 72 2132 14 Mar 2008
8 >Царёв Ю.А. (Tsariov) 37 37 71 0 71 2548 14 Mar 2008
9 Морозов М.Ю. ($$mormih$$) 35 35 66 0 66 2819 10 Mar 2008
10 Gorokhov (Look) 13 48 29 34 63 1058 14 Mar 2008
11 >Бакулина Н. (n_bakulina) 34 34 60 0 60 3211 14 Mar 2008
12 Мельник В.В. (Decoded) 26 39 56 3 59 2422 13 Mar 2008
13 >Dr. Snickers (DrSnickers) 22 34 49 3 52 2834 14 Mar 2008
14 dZima (dZima) 32 32 52 0 52 3869 13 Mar 2008
15 Ermoshkin J. (wazaaap) 26 57 51 0 51 1332 09 Mar 2008
16 >Bhoobalan K. (cutekoki) 28 28 51 0 51 4013 14 Mar 2008
17 >Бадьин (leks) 29 29 51 0 51 4019 14 Mar 2008
18 >карпунин А.С. (llllllll) 21 89 50 0 50 245 14 Mar 2008
19 >Сальников С.А. ($erges) 20 111 48 0 48 152 14 Mar 2008
20 Шупиков А.С. (ShooRoop) 27 27 47 0 47 4359 14 Mar 2008
21 Kovalenko D. (Kovalenko Dmitry) 22 23 36 9 45 4528 13 Mar 2008

Изучаем SQL

5 вещей, которые каждый разработчик SQL должен знать, как свои пять пальцев...

James Luetkehoelter (оригинал: 5 things every SQL developer should know like the back of their hand... )
Перевод Моисеенко С.И.

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

1) Всегда уточняйте имена объектов. Никакие слова не будут достаточны, чтобы сказать о важности этого пункта. Даже если Вы не имеете никаких схем (схем SQL 2005, я имею в виду), всегда ссылайтесь на объекты при помощи, по крайней мере, DBO.[имя_объекта]. Если вы последовательны в вызовах таблиц, представлений, хранимых процедур, функций и т.д., то ощутите прирост производительности. Проблема в том, что если Вы просто пишете ваш код так...

 

SELECT LNAME, FNAME FROM PERSON

 

... Вы потенциально создаете 2 операции на сервере. Первая будет проверять ваш конкретный контекст безопасности, чтобы увидеть, являетесь ли вы владельцем объекта, а затем будет использоваться псевдоним DBO (между прочим, если Вы заходите с привилегиями sysadmin или db_owner, DBO приписывается автоматически, - но это не оправдание тому, чтобы приложение подключалось с правами sysadmin или db_owner). Скажем, я авторизовался как пользователь SQL 'James'. В предыдущем примере, процессор запросов сначала должен проверить, существует ли 'James.PERSON'; в противном случае, будет использоваться DBO.PERSON. Зачем тратить на это время. Я пошел бы еще дальше, и уточнил также имена столбцов:

 

SELECT PERSON.LNAME, PERSON.FNAME FROM DBO.PERSON

 

Конечно, замечательно, если вы используете псевдоним таблицы в запросе ('p. LNAME'). Это еще более полезно в виду возможной неоднозначности при выполнении соединений, однако есть некоторая выгода и с точки зрения производительности (скорее, измеряемой, чем ощущаемой).

2) Понимать логику, основанную на теории множеств. Многие тут же скажут: "Избегайте курсоров TSQL как чумы", но меня больше волнует соотношение между теоретико-множественной и итеративной логикой. SQL (во всех его многих проявлениях - это ведь проблема не только SQL Server) - это язык, опирающийся на теорию множеств. Он разработан или оптимизирован не для построчной обработки списка записей (прежде, чем Вы скажете это, да, даже форма курсора представлена множеством, что теперь официально называется результирующим набором - resultset - по умолчанию; хотя некоторые из нас еще помнят его как курсор пожарного шланга - firehose). Иногда итеративный проход по списку записей является неизбежным. Иногда Вам требуется это сделать в TSQL - именно поэтому там имеются курсоры. Однако если Вам требуются итерации, передача набора в другой язык (ADO.NET, например) для обработки может быть более эффективным решением.

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

3) Доступ к объектам в согласованном порядке. В частности, в SQL Server по умолчанию используются пессимистические блокировки (только SQL 2005 предлагает оптимистические, и это стоит того). В чем же состоит проблема на практике? Если кто-то читает данные, то никто не может перезаписывать эти же данные. Учитывая используемый механизм блокировок, это может привести к блокированию большого объема данных, что представляет собой самую большую "скрытую" проблему потери производительности в SQL Server.

Что еще хуже, - это возможность тупиков - SQL просто выбирает жертву, действие которой отменяется (не спрашивайте меня о точном алгоритме, могу лишь сказать, что это сложней, чем реализация очереди - FIFO). Чтобы избежать тупиков и минимизировать объемы блокирования, всегда организуйте доступ к объектам в одном и том же порядке. Например, вместо

Сессия 1:
UPDATE PERSON...
UPDATE ADDRESS...
SELECT PERSON...
SELECT ADDRESS...

Сессия 2:
UPDATE ADDRESS...
UPDATE PERSON...
SELECT ADDRESS...
SELECT PERSON...

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

Минимизируя блокировки, Вы сможете серьезно улучшить производительность вашего кода SQL. Это верно вообще, но особенно верно в SQL Server из-за пессимистических блокировок.

4) Использование согласованных поисковых аргументов. Поисковые аргументы (известные фанатам баз данных как SARGs - не вполне акроним), могут сделать ненужным оптимизатор запросов. Если Вы не отдаете себе отчет в том, как организуется доступ к объектам в вашем предложении WHERE, оптимизатор запросов может дать несколько странноватые результаты. Например, если Вы имеете составной индекс на LNAME, FNAME, но используете 'WHERE FNAME ='James' AND LNAME ='Luetkehoelter'", есть некая вероятность, что индекс использоваться не будет. Имеется множество факторов, которые требуется учитывать, но если все факторы на месте, то простое упорядочивание становится той пушинкой, которая нарушает равновесие. Что еще хуже, так это то, что администратору базы данных становится более трудным настроить индексы, когда код ведет себя непредсказуемо. Воздействие на внутренние планы выполнения запроса, как то статистика по столбцам и индексы, а также возможность автопараметризации для запросов, передаваемых непосредственно, станет почти невозможным.

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

5) Избегать искушения XML. Ну, хорошо, SQL Server 2005 имеет встроенный тип данных XML и индексы XML, и поддержку XQuery 1.0. Это все означает, что данные могут сохраняться в виде XML, а поиск и извлечение отдельных документов даже усиливается индексами. Я действительно думаю, что они это - огромные возможности, однако...

Доступ к XML-файлу более медленный по сравнению со стандартным доступом к реляционным данным. Являясь привлекательным с точки зрения разработки для хранения данных (и я думаю, что это и есть предназначение XML), XML ПО СВОЕЙ СТРУКТУРЕ НЕ ПРЕДНАЗНАЧЕН ДЛЯ ПОСТОЯННОГО ХРАНЕНИЯ И ПОИСКА. Некоторые могут увидеть здесь противоречие, но для меня это - факт. Я использовал тип данных XML для "обезвоживания" экземпляра объекта, или для хранения исторических или оригинальных документов XML. Я никогда не стал бы защищать применение типа данных XML для непрерывного чтения, записи и обновления. Даже со всеми своими улучшениями в 2005 (и в грядущем 2008), это все еще тип данных, которому нужен "рожок для обуви", чтобы впихнуть его в реляционную структуру хранения. Если Вы должны использовать XML, попробуйте минимизировать непрерывную работу с такими данными внутри сервера SQL.

17-09-2007

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

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

§ Желающих поспособствовать популяризации сайта прошу проголосовать/поставить закладку в социальных сетях:
del.icio.us
dzone.com
Digg.com
Reddit.com
stumbleupon.com

Контакты

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

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

В избранное