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

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


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

http://www.sql-ex.ru

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

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

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

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

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


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

§ Однако юбилейный выпуск. С чем я нас всех и поздравляю. Судя по тому, что нареканий на материалы рассылки практически нет, а число подписчиков неуклонно растет, можно сделать вывод, что мы на правильном пути. Тем не менее, если у вас есть жалобы/предложения, пишите, чтобы улучшить качество рассылки.

§ Наконец, решил проблемы, связанные с работой форума. Навигация заработала, добавил симметричную ссылку для перехода вниз страницы. Кроме того, вынес в архив сообщения из "Книги жалоб и предложений", датированные до 2006 года. Архив доступен как отдельный топик, однако, писать в него нельзя, т.к. недопустимо переписывать историю :-).

§ Заменил несложную, но весьма неоднозначную с точки зрения формулировки 47-ю задачу. Новая задача принадлежит Shurgenz. Сложность 2 балла выставлена с учетом первого этапа.
Уже успел поменять формулировку и новой задачи и добавить проверочных данных. Формулировка теперь звучит так:
"Определить лидера по сумме выплат в соревновании между каждой парой пунктов с одинаковыми номерами из двух разных таблиц - outcome и outcome_o - на каждый день, когда осуществлялся прием вторсырья хотя бы на одном из них...".
Сразу дам пояснения, которые, собственно, и привели к некоторому изменению формулировки этой задачи:
- Как написано в описании предметной области, таблицы с суффиксом "_o" и без него - это разные базы. Т.е. мы можем считать, что они описывают деятельность разных фирмы.
- Поскольку сравниваются пункты с одинаковыми номерами, то из результата следует исключить вариант, когда в одной таблице есть пункт с номером, совсем отсутствующим в другой таблице. Как можно сравнивать что-то с тем, чего нет?
- Слова "хотя бы на одном из них" означают, что если за некоторую дату в пункте из первой таблицы есть строка, а во второй - нет, то пункт из первой побеждает. Эта ситуация отлична, на мой взгляд, от предыдущей, где пункт просто отсутствовал, т.к. отсутствие информации в этом случае означает, что пункт просто не работал или работал вхолостую. В этом случае победа присуждается закономерно.
Добавленные данные, по замыслу, должны сделать такое понимание однозначным.

§ По многочисленным просьбам сделал более четкой формулировку задачи 17 (DML). Кроме того, заменил английский вариант формулировки задачи 57 (SELECT), которую мне любезно предоставил Seeker, не читающий по-русски.

§ Добавил данные для задачи 32. Напомню, что там нужно найти корабли, отвечающие любым четырем критериям из шести. Обсуждению подвергалось то, что принимались как решения, в которых проверялось наличие точно 4-х критериев, так и решения, удовлетворяющие минимум 4-м критериям.
По моему мнению (и мнению автора, т.к. тестовое решение демонстрирует именно это понимание) формулировка подразумевает второй вариант. В подтверждение своих слов приведу аналогию с проходным баллом. Если проходной балл - 4, а человек набирает 5, мы его принимаем. Поэтому для однозначности трактовки условия я добавил корабли, удовлетворяющие более 4 критериям.

§ Подлатал замеченную D.K. прореху в проверке задачи 57.
Добавил данные от Cyrilus для усиления проверки задачи 87.

§ Почта вернула письмо с сертификатом по причине несовпадения на единицу почтового индекса, несмотря на точно указанный остальной адрес. Видимо, проверочная система сайта распространяется офф-лайн :-). Чтобы не обижаться на почту, просьба тщательно проверять данные, которые вы указываете при заказе сертификата.

§ Почти все лидеры дружно решили 47 задачу, поэтому их расстановка практически не изменилась.

§ Новый человек в сотне - Johan (задач 101, время 4.097).

§ Сохранили шансы попасть в ТОР 10:
=Maxim= (124, 16.254)
alex_v (121, 19.963)
SolYUtor (112, 8.155)
loki (110, 5.047)
Родион1976 (101, .837)

§ Продолжили свое восхождение к вершине:
SoVa (124, 107.612)
Johnny (114, 130.067)
Ocean (111, 35.962)

§ На этой неделе сертифицированы:
троль (A06011760) [BK] (пос.Богородское, Московская область)

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 LastSolved LastVisit
1 Войнов П.Е. (pаparome) 138 47 20 323 348 2.680 07 Aug 2006 11 Aug 2006
2 Юлдашев М.Р. (Snowbear) 138 47 20 323 383 4.055 05 Aug 2006 11 Aug 2006
3 Мурашкин И.В. (lepton) 138 47 20 323 136 10.134 06 Aug 2006 11 Aug 2006
4 Иванов А.Н. (Goapsy) 138 47 20 323 270 18.919 07 Aug 2006 07 Aug 2006
5 Голубин Р.С. (Roman S. Golubin) 138 47 20 323 353 21.138 06 Aug 2006 11 Aug 2006
6 Карасёва Н.В. (vlksm) 138 47 20 323 92 24.922 06 Aug 2006 11 Aug 2006
7 Кувалкин К.С. (Cyrilus) 137 47 20 321 623 9.768 09 Aug 2006 11 Aug 2006
8 Валуев Д.И. (Fiolent) 137 92 20 321 1069 54.545 08 Aug 2006 11 Aug 2006
9 Абашин П.И. (Dizil) 137 47 20 319 348 3.903 07 Aug 2006 11 Aug 2006
10 Тарасов Д.Б. (Gavrila) 136 47 20 318 346 19.382 07 Aug 2006 11 Aug 2006
11 Самохвалов В. (ValdemarES) 136 137 20 317 258 7.850 02 Aug 2006 03 Aug 2006
12 Slobodcicov A.N. (Testo) 135 138 20 316 252 6.707 01 Jun 2006 08 Aug 2006
13 Kamaev V.M. (Heromantor) 135 138 20 316 128 9.044 14 Mar 2006 25 Mar 2006
14 Бураков С.Г. (burakov58) 135 138 20 316 419 17.381 24 Mar 2006 07 Apr 2006
15 frenkental (a2010) 135 137 20 315 110 15.332 19 Jul 2006 26 Jul 2006
16 >Крижевич С.А. (yaff) 135 47 20 314 407 14.792 11 Aug 2006 11 Aug 2006
17 Зырин В.Е. (Vezyr) 135 47 20 314 204 20.590 05 Aug 2006 06 Aug 2006
18 Страшников А.С. (EffEct) 135 47 20 314 452 59.948 10 Aug 2006 10 Aug 2006
19 Зверев Д.Л. (dimzv) 134 137 20 312 869 3.272 22 Mar 2006 08 Jul 2006
20 Носков Н.В. (niko2) 134 137 20 312 274 8.452 06 Apr 2006 16 May 2006

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Чарина Е.А. (Katenok) 53 53 96 32 128 473 11 Aug 2006
2 Маслов А.В. (Маслоч) 55 55 103 23 126 496 09 Aug 2006
3 Шварцберг П.В. (Pavel79) 43 57 88 26 114 422 11 Aug 2006
4 >Ч. (Ksu2006) 38 53 79 32 111 475 11 Aug 2006
5 >Б И.Т. (ild) 42 57 89 9 98 589 11 Aug 2006
6 Гришаев П.Б. (Павел БГ) 52 52 94 0 94 937 09 Aug 2006
7 Ustyantsev A. (hudbrog123) 47 47 83 0 83 1108 10 Aug 2006
8 Koniuhovsky S. (Elvis) 46 46 78 0 78 1206 10 Aug 2006
9 Makarov R.V. (Roman1979) 20 59 44 31 75 328 11 Aug 2006
10 >GORILLA (Горилла с Нижнего Тагила) 38 38 69 0 69 1439 11 Aug 2006
11 >Антипин В.М. (avm_hawk) 40 40 67 0 67 1482 11 Aug 2006
12 Dmitriev (bobr13) 37 49 63 0 63 1080 10 Aug 2006
13 >Агеев А.В. (@Gav) 14 71 30 32 62 218 11 Aug 2006
14 >apahi (Petro) 39 39 61 1 62 1622 11 Aug 2006
15 Кузьменко (KY3bMA) 28 58 53 7 60 587 07 Aug 2006
16 >Кострюков С.М. (Conqueror) 36 36 59 0 59 1720 11 Aug 2006
17 Крохмаль (dchar) 19 55 42 15 57 570 10 Aug 2006
18 >Иванов С. (Blaze) 34 34 52 0 52 1976 11 Aug 2006
19 >Егорова Е. (Katrya) 23 23 31 17 48 2148 11 Aug 2006
20 >Korobov I.V. (Format_C) 25 54 47 0 47 877 11 Aug 2006
21 Kukurudza D. (el dio) 34 34 45 0 45 2251 10 Aug 2006
22 >Polygalov I.E. (PolygalovIvan) 26 42 43 0 43 1466 11 Aug 2006
23 >Пащенко (Астероид) 28 28 40 3 43 2331 11 Aug 2006
24 Бугаков Ю.В. (Bugakov) 21 48 40 0 40 1061 10 Aug 2006
25 Кривошлык О.Г. (Smuglyanka) 13 36 31 9 40 1331 11 Aug 2006

Изучаем SQL

Настройка операторов SQL на Microsoft SQL Server 2000 (продолжение, начало в вып.99)

Kevin Kline, Claudia Fernandez, Quest Software, Inc. (оригинал: Tuning SQL Statements on Microsoft SQL Server 2000)
Перевод Живенко Н.

SET STATISTICS TIME

Время выполнения транзакции является не постоянным критерием, т.к. он зависит от деятельности других пользователей сервера. Однако оно представляет некоторую реальную меру по сравнению с числом страниц данных, которые не имеют смысла для ваших пользователей. Их интересуют только секунды и минуты, которые они тратят на ожидание ответа на запрос, но не кэширование данных и не эффективность опережающего чтения. Команда SET STATISTICS TIME ON выдает реальное время выполнения и использование центрального процессора для каждого последующего запроса. Выполнение операции SET STATISTICS TIME OFF отменяет эту возможность.

SET STATISTICS TIME ON
GO
SELECT COUNT(*) FROM titleauthors
GO
SET STATISTICS TIME OFF
GO

Результаты:
SQL Server Execution Times:
cpu time = 0 ms. elapsed time = 8672 ms.
SQL Server Parse and Compile Time:
cpu time = 10 ms.

-----------
25
(1 row(s) affected)
SQL Server Execution Times:
cpu time = 0 ms. elapsed time = 10 ms.

SQL Server Parse and Compile Time:
cpu time = 0 ms.

Первое сообщение предоставляет несколько непонятное время выполнения - 8 672 миллисекунд. Это число не имеет отношение к нашему коду и показывает время, которое прошло с момента выполнения предыдущей команды. Этим сообщением можно пренебречь. Всего 10 миллисекунд потребовалось SQL Server для синтаксического разбора и компиляции запроса. А для его выполнения потребовалось 0 миллисекунд (показано после результата запроса). Фактически это говорит о том, что длительность запроса была слишком короткой для измерения. Последнее сообщение, показывающее время 0 мс на синтаксический разбор и компиляцию, относится к команде STATISTICS TIME OFF (т.е. столько потребовалось на ее компиляцию). Вы можете пренебречь и этим сообщением, т.к. более важные сообщение в выходных данных выделены жирным шрифтом.

Отметим также, что время выполнения и использования центрального процессора указывается в миллисекундах. Числа на вашем компьютере могут отличаться (не пытайтесь сравнивать характеристики вашего компьютера с нашим ноутбуком, потому что он не является эталоном). Более того, каждый раз при выполнении этого кода вы можете получать небольшие различия в получаемых статистических данных; это зависит от того, что еще выполняет в это время SQL Server.

Если вам необходимо измерить интервал времени на выполнение ряда запросов или хранимой процедуры, то более практично сделать это программно (будет описано ниже). Причина заключается в том, что STATISTICS TIME выводит длительность каждого отдельного запроса, и вам придется складывать эти данные вручную при запуске нескольких команд. Представьте размер выходных данных и количество ручной работы при оценке времени выполнения скрипта, который выполняет множество запросов в цикле тысячи раз!

Лучше рассмотрим следующий код, в котором снимаются показания времени до начала и после окончания транзакции, и выводится общая продолжительность выполнения в секундах (или, если хотите, в миллисекундах):

DECLARE @start_time DATETIME
SELECT @start_time = GETDATE()
< какой либо запрос или код, время которого необходимо вычислить, без оператора GO >
SELECT 'Elapsed Time, sec' = DATEDIFF( second, @start_time, GETDATE() )
GO

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

CREATE TABLE #save_time ( start_time DATETIME NOT NULL )
INSERT #save_time VALUES ( GETDATE() )
GO
< какой-либо код, время выполнения которого необходимо измерить (может включать GO) >
GO
SELECT 'Elapsed Time, sec' = DATEDIFF( second, start_time, GETDATE() )
FROM #save_time
DROP TABLE #save_time
GO

Необходимо помнить о том, что тип данных DATETIME в SQL Server сохраняет значения времени приращениями в 3 миллисекунды. Невозможно получить более точное значение времени чем то, которое использует тип данных DATETIME.

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

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

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

§ Поступила в продажу книга SQL. Задачи и решения, посвященная анализу ошибок, допускаемых при решении задач первого этапа. На сайте издательства Питер можно сделать заказ и познакомиться с содержанием.

Контакты

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

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

В избранное