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

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


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

http://www.sql-ex.ru

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

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

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

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

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


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

§ Сделал обещанную страничку специалистов, которые ищут работу или не против ее поменять. Напомню, чтобы попасть на эту страницу, достаточно выбрать "да" в графе "Интересуют предложения о работе" в резюме специалиста. Не забывайте оставлять свою контактную информацию.
У нас есть возможность отправки почты через сервер, поэтому ваш почтовый адрес не будет виден на странице, и массового спама можно не опасаться.

§ Опять были замечены попытки решить задачу второго этапа чужим умом путем обращения за помощью на форумах других сайтов. Я считаю это хамством по отношению к разработчикам, авторам задач и другим участникам, которого никто из нас явно не заслуживат. Попытки решения задачи любыми средствами наносит ущерб объективности рейтинга и/или значимости сертификата. Это подрывает доверие к сайту, поэтому мы будем стараться принимать адекватные меры.
Мы не торгуем сертификатами в том смысле, что нам важно, чтобы сертификат отражал уровень знаний его обладателя. В связи с этим, я собираюсь на странице подтверждения сделать пометку о соответствии сертификата текущим требованиям. Т.е. в отличие, скажем, от Майкрософт обладателю сертификата не нужно будет приобретать новый при изменении требований (замене задач, например), а достаточно будет просто решить дополнительные задачи. Считаю, что это будет держать в "тонусе" специалиста в случае отсутствия достаточной практики в его профессиональной деятельности.

§ Выставили две новые задачи. Одна заменила 107-ю (автор Lepton, сложность 2 балла), другая продолжила 3 этап - 140 (paparome, 4 балла).
Есть еще несколько задач разных авторов. Буду готовить их публикацию на сайте.

§ Решив добавленные ранее задачи, на седьмую позицию перешел Cyrilus (задач 138, 9.802). Пробился в десятку MadVet (138, 30.840), который смог одолеть 138 задачу. Число участников третьего этапа превысило 10 человек.

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

§ Сохранили шансы попасть в ТОР 10:
dimzv (135, 3.272)
alex_v (129, 22.178)
=Maxim= (128, 19.547)
PS_Sergey (125, 8.374)
loki (124, 12.978)
Палкин (121, 11.965)
Родион1976 (111, 1.074)

§ Продолжили свое восхождение к вершине:
imsh (135, 64.888)
BOBAH (133, 31.526)
nibbles01 (119, 91.867)
Gosha (116, 124.432)
ruchey (112, 38.457)

§ На этой неделе сертифицированы:
S. Peisov (A06009794) [BK] (г.Санкт-Петербург, Россия)
KSK (A06012737) [BK] (г.Петродворец, Россия)

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Юлдашев М.Р. (Snowbear) 139 139 20 326 418 4.055 .000 3 09 Sep 2006 29 Sep 2006
2 Васьков Е.В. (Johan) 139 139 20 326 57 9.626 .116 3 14 Sep 2006 29 Sep 2006
3 Карасёва Н.В. (vlksm) 139 139 20 326 137 25.724 .803 3 20 Sep 2006 29 Sep 2006
4 Мурашкин И.В. (lepton) 139 139 20 326 175 13.419 3.284 3 14 Sep 2006 28 Sep 2006
5 Войнов П.Е. (pаparome) 138 47 20 323 348 2.680 07 Aug 2006 29 Sep 2006
6 Slobodcicov A.N. (Testo) 138 92 20 323 337 7.180 25 Aug 2006 29 Sep 2006
7 Кувалкин К.С. (Cyrilus) 138 92 20 323 669 9.802 24 Sep 2006 27 Sep 2006
8 Иванов А.Н. (Goapsy) 138 47 20 323 270 18.919 07 Aug 2006 07 Aug 2006
9 Голубин Р.С. (Roman S. Golubin) 138 47 20 323 353 21.138 06 Aug 2006 29 Sep 2006
10 Держальцев В.А. (MadVet) 138 138 20 323 530 30.840 28 Sep 2006 29 Sep 2006
11 Валуев Д.И. (Fiolent) 138 47 20 323 1085 54.545 24 Aug 2006 29 Sep 2006
12 Абашин П.И. (Dizil) 137 47 20 319 348 3.903 07 Aug 2006 31 Aug 2006
13 Самохвалов В. (ValdemarES) 137 47 20 319 273 7.850 17 Aug 2006 25 Sep 2006
14 Солдатенков Ю.С. (SolYUtor) 137 137 20 319 111 12.909 06 Sep 2006 29 Sep 2006
15 Тарасов Д.Б. (Gavrila) 136 47 20 318 346 19.382 07 Aug 2006 29 Sep 2006
16 Страшников А.С. (EffEct) 136 87 20 317 483 61.850 10 Sep 2006 21 Sep 2006
17 Матвеева Ю.Б. (Julia_M) 136 87 20 317 310 81.870 13 Sep 2006 22 Sep 2006
18 Kamaev V.M. (Heromantor) 135 138 20 316 128 9.044 14 Mar 2006 25 Mar 2006
19 Бураков С.Г. (burakov58) 135 138 20 316 419 17.381 24 Mar 2006 07 Apr 2006
20 frenkental (a2010) 135 137 20 315 110 15.332 19 Jul 2006 26 Jul 2006

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Vorontsov M.M. (mikew) 67 67 125 23 148 332 29 Sep 2006
2 Terkin V.I. (vasily terkin) 56 56 102 0 102 856 29 Sep 2006
3 >Prokopchik S. (sn-prokop) 54 54 98 3 101 894 29 Sep 2006
4 >Таранин К.Ю. (Kytar) 51 51 90 1 91 1075 29 Sep 2006
5 malabay (_malabay) 39 39 68 17 85 1175 28 Sep 2006
6 Сергей (SergD) 38 38 66 19 85 1176 29 Sep 2006
7 Nakev T. (XaOc) 41 41 66 11 77 1347 29 Sep 2006
8 >Kugushev V. (SlavaFinist) 12 59 28 32 60 374 29 Sep 2006
9 >Лапшин Е.И. (ZeroQ) 34 34 60 0 60 1842 29 Sep 2006
10 Micheva (lilly_m) 27 41 50 9 59 1406 28 Sep 2006
11 >Ракинцев Н.М. (Никола) 35 40 59 0 59 1705 29 Sep 2006
12 Lion (LionCat) 34 34 55 3 58 1902 24 Sep 2006
13 >Каретников А.В. (karetnikov) 37 37 58 0 58 1908 29 Sep 2006
14 >Курбатов (Курбатов А.А.) 33 33 58 0 58 1909 29 Sep 2006
15 Leszczynski P. (drax) 30 30 55 0 55 2029 26 Sep 2006
16 >Бахтин С.А. (_BaxSer_) 31 31 52 0 52 2134 29 Sep 2006
17 >Мальцев А.В. (Палкин) 19 121 51 0 51 55 29 Sep 2006
18 Breusov (Mazoku) 12 53 31 20 51 608 27 Sep 2006
19 >Дукин А. (Ворон) 27 27 46 5 51 2196 28 Sep 2006
20 Бородин А.М. (b_andrew) 28 28 49 0 49 2275 27 Sep 2006
21 >blagas B.B. (blagas_nick) 28 28 49 0 49 2280 29 Sep 2006
22 >Karow E.P. (timmeh) 29 29 46 3 49 2293 29 Sep 2006
23 >Егоров В.Н. (Vitorio) 28 28 49 0 49 2302 28 Sep 2006
24 >Левыкин Д.А. (TODD) 13 57 32 15 47 408 29 Sep 2006
25 >Shabalin S. (rain1) 19 34 45 2 47 1715 29 Sep 2006
26 >Lubsanov V.A. (Chaos) 26 32 46 0 46 2152 29 Sep 2006
27 >Lasha (m_lasha) 30 30 42 3 45 2468 29 Sep 2006
28 >Сизов (Perfect Stranger) 19 87 42 0 42 166 29 Sep 2006
29 >Danishevsky T. (tatyana_d) 20 29 42 0 42 2166 29 Sep 2006
30 Моисеенко В.Н. (Valerij_M) 31 31 42 0 42 2587 29 Sep 2006
31 >Grigor E.V. (Eugeniu) 31 31 41 0 41 2619 29 Sep 2006
32 >oracle O. (ora) 24 24 41 0 41 2624 29 Sep 2006
33 >Иванова (Маня_) 18 41 40 0 40 1450 29 Sep 2006
34 Gerasimov B.S. (bokata) 19 31 39 1 40 2108 28 Sep 2006
35 solo S. (vy) 20 28 39 1 40 2238 28 Sep 2006
36 >belka (belga) 25 25 40 0 40 2662 29 Sep 2006

Изучаем SQL

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

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

SET NOCOUNT ON

Эффект увеличения быстродействия кода T-SQL при использовании SET NOCOUNT ON остается малопонятным для многих разработчиков SQL Server и администраторов баз данных. Возможно, вы обращали внимание, что запросы, выполнившиеся успешно, возвращают системное сообщение о количестве обработанных ими строк. Во многих случаях эта информация не нужна. Команда SET NOCOUNT ON позволяет запретить вывод сообщений для всех последующих транзакций в этой сессии до тех, пока не будет выполнена команда SET NOCOUNT OFF. Эта опция оказывает не только косметический эффект на выходную информацию, генерируемую скриптом. Она уменьшает количество передаваемой от сервера клиенту информации. Поэтому эта команда позволяет снизить сетевой трафик и уменьшить общее время ответа транзакций. Время для передачи одного сообщения может быть и незначительным, но подумайте о скрипте, обрабатывающим в цикле несколько запросов и передающей килобайты бесполезной для пользователя информации.

В качестве примера рассмотрим файл, содержащий пакет T-SQL, который вставляет в таблицу big_sales 9999 строк.

-- Предполагается наличие таблицы BIG_SALES, которая является копией таблицы pubs..sales

SET NOCOUNT ON
DECLARE @separator VARCHAR(25),
@message VARCHAR(25),
@counter INT,
@ord_nbr VARCHAR(20),
@order_date DATETIME,
@qty_sold INT,
@terms VARCHAR(12),
@title CHAR(6),
@starttime DATETIME
SET @STARTTIME = GETDATE()
SELECT @counter = 0,
@separator = REPLICATE( '-', 25 )
WHILE @counter < 9999
BEGIN
SET @counter = @counter + 1 SET @ord_nbr = 'Y' + CAST(@counter AS VARCHAR(5))
SET @order_date = DATEADD(hour, (@counter * 8), 'Jan 01 1999')
SET @store_nbr =
CASE WHEN @counter < 999 THEN '6380'
WHEN @counter BETWEEN 1000 AND 2999 THEN '7066'
WHEN @counter BETWEEN 3000 AND 3999 THEN '7067'
WHEN @counter BETWEEN 4000 AND 6999 THEN '7131'
WHEN @counter BETWEEN 7000 AND 7999 THEN '7896'
WHEN @counter BETWEEN 8000 AND 9999 THEN '8042'
ELSE '6380'
END
SET @qty_sold =
CASE WHEN @counter BETWEEN 0 AND 2999 THEN 11
WHEN @counter BETWEEN 3000 AND 5999 THEN 23
ELSE 37
END
SET @terms =
CASE WHEN @counter BETWEEN 0 AND 2999 THEN 'Net 30'
WHEN @counter BETWEEN 3000 AND 5999 THEN 'Net 60'
ELSE 'On Invoice'
END
-- SET @title = (SELECT title_id FROM big_sales WHERE qty = (SELECT MAX(qty)
FROM big_sales))
SET @title =
CASE WHEN @counter < 999 THEN 'MC2222'
WHEN @counter BETWEEN 1000 AND 1999 THEN 'MC2222'
WHEN @counter BETWEEN 2000 AND 3999 THEN 'MC3026'
WHEN @counter BETWEEN 4000 AND 5999 THEN 'PS2106'
WHEN @counter BETWEEN 6000 AND 6999 THEN 'PS7777'
WHEN @counter BETWEEN 7000 AND 7999 THEN 'TC3218'
ELSE 'PS1372'
END
-- PRINT @separator

-- SELECT @message = STR( @counter, 10 ) -- + STR( SQRT( CONVERT( FLOAT, @counter ) ), 10, 4 )
-- PRINT @message

BEGIN TRAN
INSERT INTO [pubs].[dbo].[big_sales]([stor_id], [ord_num], [ord_date],[qty], [payterms], [title_id])
VALUES(@store_nbr, CAST(@ord_nbr AS CHAR(5)), @order_date, @qty_sold, @terms, @title)
COMMIT TRAN
END
SET @message = CAST(DATEDIFF(ms, @starttime, GETDATE()) AS VARCHAR(20))
PRINT @message
/*
TRUNCATE table big_sales
INSERT INTO big_sales
SELECT * FROM sales
SELECT title_id, sum(qty)
FROM big_sales
group by title_id
order by sum(qty)
SELECT * FROM big_sales
*/

При использовании SET NOCOUNT OFF, время выполнения равнялось 5176 миллисекундам. А при использовании SET NOCOUNT ON время выполнения - 1620 миллисекунд!

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

TOP и SET ROWCOUNT

Предложение TOP оператора SELECT накладывает ограничение на количество строк, возвращаемых отдельным запросом, в то время как SET ROWCOUNT накладывает ограничение на количество строк, обрабатываемых всеми последующими запросами. Эти команды обеспечивают хорошую эффективность для многочисленных задач программирования.

SET ROWCOUNT устанавливает максимальное число строк, которые могут быть обработаны операторами SELECT, INSERT, UPDATE и DELETE. Установка вступает в действие сразу после выполнения команды и распространяется только на текущий сеанс. Для удаления данного ограничения используется SET ROWCOUNT 0.

В некоторых практических задачах более эффективным является использование TOP или SET ROWCOUNT, чем стандартных команд SQL. Покажем это на нескольких примерах.

TOP n

Одним из самых популярных запросов практически в любой базе данных является запрос на получение первых n элементов из списка. В случае с базой данных pubs можно было бы найти первые 5 наиболее популярных названий. Сравните три решения этой задачи - с использованием TOP, SET ROWCOUNT и ANSI SQL.

"Чистый" ANSI SQL

SELECT title, ytd_sales
FROM titles a
WHERE ( SELECT COUNT(*)
    FROM titles b
    WHERE b.ytd_sales > a.ytd_sales
    ) < 5
ORDER BY ytd_sales DESC

Решение с использованием "чистого" ANSI SQL выполняет коррелированный подзапрос, что может оказаться неэффективным, особенно в том случае, если на таблице ytd_sales не используется никаких индексов, которые бы могли его улучшить. Кроме того, команда "чистого" ANSI SQL не убирает NULL-значения в таблице ytd_sales , и при этом не делает различия в случае, когда имеется много совпадающих значений.

Использование SET ROWCOUNT:

SET ROWCOUNT 5

SELECT title, ytd_sales
FROM titles
ORDER BY ytd_sales DESC
SET ROWCOUNT 0

Использование TOP n:

SELECT TOP 5 title, ytd_sales
FROM titles
ORDER BY ytd_sales DESC

Второе решение, использующее SET ROWCOUNT, прерывает выполнение запроса SELECT, в то время как третий вариант решения, использующий TOP n, завершает свою работу после того, как найдены первые 5 строк. В этом случае также используется предложение ORDER BY, выполняющее сортировку всей таблицы, прежде чем будут найдены конечные результаты. Оба запроса фактически имеют одинаковые планы выполнения запроса. Однако основное преимущество TOP перед SET ROWCOUNT заключается в том, что SET должен обработать рабочую таблицу, как этого требует предложение ORDER BY, в то время как для TOP это не требуется.

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

При определении того, что необходимо в запросе, проверьте, не нужны ли вам всего несколько строк из результата. И если да, то предложение TOP окажется верным средством для экономии времени сервера.

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

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

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

Контакты

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

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

В избранное