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

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


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

SQL Exercises

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

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

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

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

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


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

§ На графике оценкок стоимости запросов-решений теперь можно посмотреть также показатели последнего решения задачи.

§ Подлатал прореху в проверке задачи 39, которую заметил J2k.
Заменил английскую формулировку задачи 86 на вариант, предложенный Ruchir'ом.

§ Готовлю свежие задачи от известных и новых авторов. Задачи появятся на всех этапах (и даже по DML) где-то в конце наступающей недели.
Некоторые простые задачи второго этапа перекочуют в первый.
Тем самым изменятся сертификационные требования. Для поддержания сертификата в актуальном состоянии нужно будет решить новые задачи, выставленные до соответствующего сертификационного порога.
Как обычно, просроченные заказы сертификатов будут удалены.

§ Одна задача до третьего этапа осталась avk (задач 137, время 61.129).

§ Новые лица в сотне, а также вернувшиеся в нее:
maar (118, 36.831)
Donald (115, 4.482)
Lexus (115, 19.331)

§ Продвинулись в рейтинге:
Aladdin (135, 15.034)
Fomichev (126, 12.253)
raul (125, 16.263)
15th (122, 10.886)
Weed (121, 164.805)

§ На этой неделе сертифицированы:
Диана (A07012843) [BK] (г.Москва, Россия)
Trufel (A07015958) [BK] (г.Могилёв, Беларусь)
Fomichev (B07003713) [AR] (г.Москва, Россия)

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Агапов В. (KERBEROS) 141 141 20 333 89 6.183 1.262 11 20 Nov 2006 16 Mar 2007
2 Солдатенков Ю.С. (SolYUtor) 141 141 20 333 265 17.216 2.517 11 07 Feb 2007 16 Mar 2007
3 Кувалкин К.С. (Cyrilus) 141 141 20 333 746 12.417 2.519 11 10 Dec 2006 16 Mar 2007
4 Карасёва Н.В. (vlksm) 141 141 20 333 196 27.850 2.710 11 18 Nov 2006 16 Mar 2007
5 Мурашкин И.В. (lepton) 141 141 20 333 240 14.865 4.724 11 18 Nov 2006 08 Mar 2007
6 Зверев Д.Л. (dimzv) 141 141 20 333 1141 9.324 4.938 11 19 Dec 2006 22 Dec 2006
7 Голубин Р.С. (Roman S. Golubin) 141 141 20 333 457 54.984 33.803 11 18 Nov 2006 16 Mar 2007
8 Войнов П.Е. (pаparome) 140 140 20 329 489 2.738 .049 7 26 Dec 2006 16 Mar 2007
9 Тарасов Д.Б. (Gavrila) 140 140 20 329 466 20.242 .513 7 05 Dec 2006 16 Mar 2007
10 Мальцев А.В. (Палкин) 140 141 20 329 145 27.557 7.373 7 09 Jan 2007 16 Mar 2007
11 Васьков Е.В. (Johan) 140 140 20 329 124 12.713 11.402 7 20 Nov 2006 08 Mar 2007
12 Валуев Д.И. (Fiolent) 139 140 20 326 1188 117.017 62.302 4 05 Dec 2006 16 Mar 2007
13 Юлдашев М.Р. (Snowbear) 139 139 20 325 546 4.113 .000 3 15 Jan 2007 16 Mar 2007
14 Держальцев В.А. (MadVet) 138 139 20 324 540 34.249 3.085 3 08 Oct 2006 19 Oct 2006
15 Палий С.А. (PS_Sergey) 139 139 20 325 212 15.756 4.188 3 01 Dec 2006 03 Dec 2006
16 Шептунов П.П. (PavelPS) 138 138 20 322 66 4.734 .000 0 03 Mar 2007 15 Mar 2007
17 Салимов Д.М. (Damirishe) 138 138 20 322 156 11.263 .000 0 24 Feb 2007 13 Mar 2007
18 Бородкина М.И. (marishkin) 138 138 20 322 67 15.105 .000 0 22 Jan 2007 21 Feb 2007
19 Утёнков М.Н. (=Maxim=) 138 138 20 322 200 24.998 .000 0 19 Nov 2006 08 Feb 2007
20 Slobodcicov A.N. (Testo) 136 138 20 319 337 7.171 .000 0 25 Aug 2006 10 Nov 2006

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Даянов Т. (Stopw) 52 52 95 17 112 909 16 Mar 2007
2 >Ryabitskiy E.Е. (Apparition) 49 49 87 3 90 1434 16 Mar 2007
3 Тю О.А. (sinay_oleg) 40 40 67 17 84 1557 16 Mar 2007
4 >Кулешов (Дмитрий Кулешов) 45 45 75 9 84 1558 16 Mar 2007
5 Кузнецова И.В. (Кузнецова И.) 45 45 80 0 80 1661 15 Mar 2007
6 >Menshov S. (SergM) 44 44 79 0 79 1684 16 Mar 2007
7 >Герасимов Е.И. (EvgeniyGerasimov) 20 57 54 23 77 698 16 Mar 2007
8 >Хабипов Р. (myster) 22 65 44 32 76 428 16 Mar 2007
9 >Эстис В.В. (Interrupt) 28 71 66 9 75 329 16 Mar 2007
10 >Пономарев (REWQ) 40 40 66 9 75 1823 16 Mar 2007
11 Буклеев А. (balamut) 40 41 74 0 74 1829 14 Mar 2007
12 Курганов Э. (эд) 40 40 73 0 73 1894 12 Mar 2007
13 >Bugarchev (begemot) 40 40 73 0 73 1898 16 Mar 2007
14 Lozovskiy (SandroL) 27 39 51 17 68 1635 14 Mar 2007
15 Bocheva G. (muykata) 30 30 55 9 64 2225 15 Mar 2007
16 >Св А. (SAlexa) 34 34 60 0 60 2426 16 Mar 2007
17 >smith F. (frank) 32 32 58 0 58 2519 16 Mar 2007
18 >D I.G. (Irina_) 28 53 57 0 57 1295 16 Mar 2007
19 >Соколов П.Е. (tin) 21 40 48 9 57 1618 16 Mar 2007
20 Маслов А.В. (Masloch) 33 33 57 0 57 2588 11 Mar 2007
21 >Tolmasova O. (OlgaTo) 21 36 43 9 52 2074 16 Mar 2007
22 Чвало (NataChvalo) 29 29 52 0 52 2839 16 Mar 2007
23 >aaa A.A. (bellika1) 33 33 52 0 52 2859 16 Mar 2007
24 >bev B.B. (beve) 28 28 49 0 49 3025 16 Mar 2007
25 Северюхин Ю.А. (Venser) 20 97 44 0 44 150 14 Mar 2007
26 Шварцберг П.В. (Pavel79) 19 78 41 2 43 288 15 Mar 2007
27 >Klimancova L.A. (l456) 19 29 41 0 41 2881 16 Mar 2007
28 Завьялов А. (azavyalov1) 7 65 12 28 40 431 16 Mar 2007
29 Еникеев М. (murator) 25 25 40 0 40 3587 14 Mar 2007

Изучаем SQL

Ищите рост производительности в использовании индексных представлений SQL Server

Tim Chapman (оригинал: See performance gains by using indexed views in SQL Server)
Перевод Моисеенко С.И.

Аннотация: Когда Вы используете индексные представления в правильных ситуациях, они могут существенно улучшить производительность запросов SQL Server. Тим Чапман объясняет, почему тестирование производительности - лучший способ доказать, будут ли иметь индексные представления преимущества для вашей базы данных.

Представление - это хранимый запрос T-SQL в SQL Server. Определение представления сохраняется SQL Server, чтобы оно могло быть использовано как виртуальная таблица для упрощения запросов и создания дополнительного слоя безопасности доступа к вашим базовым таблицам; при этом оно не занимает никакого места в базе данных. Фактически, представление действительно ничего не делает до тех пор, пока Вы не выполните адресованный к нему запрос.

Индексные представления

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

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

Листинг А показывает пример создания индексного представления. Скрипт создает таблицу SalesHistory и загружает в нее данные.

Листинг A

CREATE TABLE SalesHistory
(    
     SaleID INT IDENTITY(1,1),
     Product VARCHAR(30),
     SaleDate SMALLDATETIME,
     SalePrice MONEY
)

DECLARE @i SMALLINT
SET @i = 1

WHILE (@i <=10000)
BEGIN
     INSERT INTO SalesHistory
     (Product, SaleDate, SalePrice)
     VALUES
     ('Computer', DATEADD(mm, @i, '3/10/2006'), DATEPART(ms, GETDATE()) + (@i + 57) )

     INSERT INTO SalesHistory
     (Product, SaleDate, SalePrice)
     VALUES
     ('BigScreen', DATEADD(mm, @i, '3/2/2006'), DATEPART(ms, GETDATE()) + (@i + 13) )

     INSERT INTO SalesHistory
     (Product, SaleDate, SalePrice)
     VALUES
     ('PoolTable', DATEADD(mm, @i, '2/11/2007'), DATEPART(ms, GETDATE()) + (@i + 29) )

     SET @i = @i + 1
END
GO

Следующий код создаст представление для суммирования данных в таблице:

CREATE VIEW vw_salesbyproduct
AS
     SELECT
         Product,
         COUNT_BIG(*) as ProductCount,
         SuM(SalePrice) as TotalSales
     FROM dbo.SalesHistory
     GROUP BY Product

На создание представления не требуется времени, т.к. это всего лишь определение запроса на T-SQL. Как только представление создано, Вы можете адресовать к нему запросы точно так же, как вы делаете это для таблицы.

SELECT Product, TotalSales, ProductCount
FROM vw_SalesByProduct
WHERE product = 'Computer'

Если Вы установите соответствующую опцию в SQL Server Management Studio или в Query Analyzer для вывода плана выполнения запроса (Execution Plan), то Вы заметите, что вышеупомянутый запрос использует сканирование таблицы для нахождения агрегатных значений для продукции 'Computer'. Сканирования таблицы (table scan) обычно выполняются в ситуациях, когда отсутствует индекс на данных, поэтому сканируется весь результирующий набор для нахождения требуемых значений.

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

SET ANSI_NULLS ON
GO

SET ANSI_PADDING ON
GO

SET ANSI_WARNINGS ON
GO

SET CONCAT_NULL_YIELDS_NULL ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET NUMERIC_ROUNDABORT OFF
GO

Теперь Вы можете создать наше представление. Для простоты я создаю совершенно новое представление.

CREATE VIEW dbo.vw_SalesByProduct_Indexed
WITH SCHEMABINDING
AS
     SELECT
         Product,
         COUNT_BIG(*) AS ProductCount,
         SUM(ISNULL(SalePrice,0)) AS TotalSales
     FROM dbo.SalesHistory
     GROUP BY Product

Скрипт ниже создает индекс на нашем представлении:

CREATE UNIQUE CLUSTERED INDEX
idx_SalesView ON vw_SalesByProduct_Indexed(Product)

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

EXECUTE sp_spaceused 'vw_SalesByProduct_Indexed'

Нижеприведенный оператор SELECT - отличается от приведенного выше только временем, в течение которого выполняется поиск в кластеризованном индексе (clustered index seek) и которое, как правило, оказывается очень быстрым.

SELECT
    Product, TotalSales, ProductCount
FROM vw_SalesByProduct_Indexed
WHERE Product = 'Computer'

Не забывайте тестировать производительность

Индексные представления великолепны, когда вы применяете их в правильных ситуациях, поскольку они могут радикально улучшить производительность запросов. Однако выигрыш в производительности за счет кластеризованного индекса приводит к необходимости поддержки со стороны механизма БД этого индекса в ответ на каждую транзакцию, затрагивающую таблицы, на которые имеются ссылки в представлении. Из-за этого компромисса создание индексного представление может и не дать выгоды для вашей системы. Лучший способ определить это - выполнить тестирование при рабочей нагрузке.

16-02-2007

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

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

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

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

Контакты

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

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

В избранное