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

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


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

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

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

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

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

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


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

§ Новая задача от inkerman выставлена на третьем этапе под номером 143 (предварительная оценка сложности 3 балла).
Надеемся, что задача понравится нашим лидерам и действительно окажется "оптимизационной".

§ Написал FAQ на две задачи, которые постоянно вызывают вопросы - 2 и 40. Первая уже выложена, вторая появится в ближайшее время.
Сложность вызывалась пониманием структуры базы данных, которую я и пытался разъяснить.

§ После решения собственной задачи inkerman вошел в 20-ку. Других решивших эту новую задачу пока нет.
Arcan решил 140 и 142 задачи и занимает пока 14-место. Решив 140-ю задачу, Katy_Ekb переместилась на 16 место.

§ Новые лица в сотне или вернулись в нее:
Faust_zp (задач 123, время 12.020)

§ Продвинулись в рейтинге:
Kamin (131, 57.374)
Lexus (124, 37.612)
lexaNRJ (125, 80.452)
Онуфрий Голохвастов (125, 114.100)
raul (124, 16.345)
Kos123 (123, 19.591)
IAS (118, 81.814)

§ На промежуточном этапе появился новый лидер - zerga; лучшее время после решения 117 задач.

§ На этой неделе сертифицированы:
Fiction (A07015504) [BK] - п.Боград, Россия

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Северюхин Ю.А. (Venser) 142 142 21 342 200 4.950 .655 14 19 Sep 2007 10 Oct 2007
2 Тарасов Д.Б. (Gavrila) 142 142 21 342 755 23.423 2.501 14 20 Sep 2007 12 Oct 2007
3 Солдатенков Ю.С. (SolYUtor) 142 142 21 342 490 17.853 2.695 14 20 Sep 2007 12 Oct 2007
4 Шептунов П.П. (Dzen) 142 142 21 342 279 8.186 3.499 14 02 Oct 2007 02 Oct 2007
5 Мурашкин И.В. (lepton) 142 142 21 342 544 15.800 5.539 14 18 Sep 2007 12 Oct 2007
6 Карасёва Н.В. (vlksm) 142 142 21 342 496 31.617 5.912 14 14 Sep 2007 12 Oct 2007
7 Мальцев А.В. (Палкин) 141 142 21 340 388 28.481 7.690 14 09 Sep 2007 01 Oct 2007
8 Бураков С.Г. (burakov58) 142 142 21 342 974 51.702 19.814 14 30 Sep 2007 30 Sep 2007
9 Голубин Р.С. (Roman S. Golubin) 142 142 21 342 761 59.419 34.203 14 18 Sep 2007 12 Oct 2007
10 Агапов В. (KERBEROS) 135 141 20 326 89 6.143 1.262 11 20 Nov 2006 27 Jul 2007
11 Кувалкин К.С. (Cyrilus) 139 141 20 334 1014 12.506 2.519 11 04 Sep 2007 12 Oct 2007
12 Зверев Д.Л. (dimzv) 135 141 20 326 1141 9.278 4.938 11 19 Dec 2006 22 Dec 2006
13 Войнов П.Е. (pаparome) 141 142 21 338 765 2.788 .049 10 28 Sep 2007 12 Oct 2007
14 Креславский О.М. (Arcan) 141 142 21 338 253 12.066 2.272 10 10 Oct 2007 12 Oct 2007
15 Любченко В.А. (IAS56) 141 142 21 338 377 177.859 20.130 10 16 Sep 2007 28 Sep 2007
16 Белогурова (Katy_Ekb) 140 140 21 335 138 6.084 1.194 7 10 Oct 2007 12 Oct 2007
17 Васьков Е.В. (Johan) 138 140 21 332 402 12.733 11.402 7 25 Aug 2007 25 Aug 2007
18 Валуев Д.И. (Fiolent) 138 140 21 330 1476 117.100 62.302 4 19 Sep 2007 12 Oct 2007
19 Радар Ю.В. (inkerman) 139 143 21 331 60 5.354 .000 3 07 Oct 2007 12 Oct 2007
20 Юлдашев М.Р. (Snowbear) 139 139 21 331 791 4.162 .000 3 17 Sep 2007 11 Oct 2007

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >T J. (JohnT) 48 48 90 0 90 1647 12 Oct 2007
2 Naifa Z.D. (zenaifa) 47 47 89 0 89 1664 10 Oct 2007
3 >Sharov S.Y. (Fighter) 34 42 70 0 70 1929 12 Oct 2007
4 >Коваль А.С. (AntiSocial) 33 33 61 0 61 2750 12 Oct 2007
5 >Pastukhov S. (Serpenter) 32 32 60 0 60 2802 12 Oct 2007
6 >Бураков М.В. (mihas) 32 32 59 0 59 2890 12 Oct 2007
7 >Янулис О. (Ольга) 18 31 44 11 55 2348 12 Oct 2007
8 >Стрекалов П.В. (blid) 27 27 47 8 55 3178 12 Oct 2007
9 Либерман Е.М. (Ainas) 29 29 54 0 54 3285 11 Oct 2007
10 >Филиппов Д.В. (Filippov Denis) 29 29 53 0 53 3397 12 Oct 2007
11 Кошкин М.П. (Bl[oo]dMike) 29 29 53 0 53 3403 11 Oct 2007
12 Glazunov (neweagle) 20 25 37 15 52 3028 09 Oct 2007
13 Sudakov Y.N. (Sudakov) 10 71 25 26 51 370 12 Oct 2007
14 >Ivanov A. (Kemet_) 28 28 51 0 51 3513 12 Oct 2007
15 >Smirnov D.A. (sm.dmitry) 21 63 38 8 46 544 12 Oct 2007
16 >Деев А.В. (pickman) 18 52 36 9 45 1124 12 Oct 2007
17 Сабирова Э. (mandarinka) 21 22 32 13 45 3633 12 Oct 2007
18 >Федоровских Н.П. (Дон Хуан) 19 39 43 0 43 2163 12 Oct 2007
19 Stepanov A.L. (andcool) 17 30 41 0 41 3199 10 Oct 2007
20 Хубаева Ю.Х. (julia_hubaeva) 22 22 32 9 41 4294 12 Oct 2007
21 >Михайлов С.Г. (zerga) 15 117 40 0 40 128 12 Oct 2007

Изучаем SQL

Графический план выполнения запросов SQL Server в действии

Tim Chapman (оригинал: See SQL Server graphical execution plans in action )
Перевод Моисеенко С.И.

Планы выполнения - один из лучших инструментов для настройки ваших запросов на SQL Server. В этой статье я остановлюсь на нескольких основных моментах в графическом плане выполнении, чтобы помочь Вам лучше понять, как SQL Server использует индексы. Я также предлагаю идеи относительно того, как сделать ваши запросы быстрее.

Установка моего примера

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

 

CREATE TABLE [dbo].[SalesHistory]
 (
       [SaleID] [int] IDENTITY(1,1),
       [Product] [varchar](10) NULL,
       [SaleDate] [datetime] NULL,
       [SalePrice] [money] NULL
 )
 GO

 SET NOCOUNT ON

 DECLARE @i INT
 SET @i = 1
 WHILE (@i <=50000)
 BEGIN

        INSERT INTO [SalesHistory](Product, SaleDate, SalePrice)
        VALUES ('Computer', DATEADD(ww, @i, '3/11/1919'),
        DATEPART(ms, GETDATE()) + (@i + 57))

        INSERT INTO [SalesHistory](Product, SaleDate, SalePrice)
        VALUES('BigScreen', DATEADD(ww, @i, '3/11/1927'),
        DATEPART(ms, GETDATE()) + (@i + 13))

        INSERT INTO [SalesHistory](Product, SaleDate, SalePrice)
        VALUES('PoolTable', DATEADD(ww, @i, '3/11/1908'),
        DATEPART(ms, GETDATE()) + (@i + 29))

      SET @i = @i + 1

 END

 

Следующий оператор создает кластерный индекс на столбце SaleID для таблицы SalesHistory. Это в некотором роде произвольный выбор для кластерного индекса в таблице, но для данного примера он имеет смысл, так как SaleID будет увеличиваться при добавлении новых строк. Создание этого индекса физически упорядочит данные в таблице в порядке возрастания значений SaleID.

 

CREATE CLUSTERED INDEX idx_SalesHistory_SaleID
 ON SalesHistory(SaleID ASC)

 

Выполните этот оператор, чтобы включить статистику ввода/вывода для наших запросов.

 

SET STATISTICS IO ON

 

Чтобы вывести план выполнения для запросов, которые я буду демонстрировать, необходимо включить соответствующую опцию. Для этого я щелкну правой кнопкой мыши в окне редактора запросов (Query Editor) и выберу команду меню Include Actual Execution Plan. См. рисунок A.

Рисунок А

Следующий оператор выбирает строку из таблицы SalesHistory на основании значения в столбце SaleID, на котором имеется кластерный индекс.

 

SELECT * FROM SalesHistory
 WHERE SaleID = 9900

 

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

Рисунок В

Оптимизатор выполнил поиск по кластерному индексу (Clustered Index Seek), который является технически самым быстрым типом поиска в таблице, которые Вы увидите. Обратите внимание, что было выполнено три логических операции чтения для поиска этой строки в таблице:

Table 'SalesHistory'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Нижеприведенный скрипт ищет все записи в таблице SalesHistory, для которых продуктом является PoolTable. В настоящее время нет никакого индекса на этом столбце, при этом имеется только три различных значения в этом столбце для всех строк таблицы. Возможными значениями могут быть только PoolTable, Computer или BigScreen.

 

SELECT * FROM SalesHistory
 WHERE Product = 'PoolTable'

 

План выполнения вышеприведенного запроса показывает, что было выполнено сканирование кластерного индекса (Clustered Index Scan), поскольку для таблицы имеется кластерный индекс. Напомню, что кластерный индекс сортирует таблицу в порядке, заданном ключами индекса. В данном случае кластерный индекс реально не помогает мне, потому что все таки необходимо выполнить сканирование, чтобы найти все случаи, когда продукт равен PoolTable. См. рисунок C.

Рисунок С

Table 'SalesHistory'. Scan count 1, logical reads 815, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

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

 

CREATE NONCLUSTERED INDEX idx_SalesHistory_Product
 ON SalesHistory(Product ASC)

 

(окончание следует...)

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

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

§ В рамках Премии Рунета проводится "народное голосование". Если вы считаете, что наш сайт заслуживает большей известности в рунете, проголосуйте за него. Для этого
- Пройдите по ссылке www.premiaruneta.ru/narod/vote/.
- Поставьте флажок напротив sql-ex.ru (ближе к концу списка).
- Поставьте флажок "Я согласен с правилами..." ниже списка участников.
- Нажмите кнопку Проголосовать!
Вы можете проголосовать сразу за нескольких участников.

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

Контакты

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

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

В избранное