Новости сайта "Упражнения по SQL (http://www.sql-ex.ru)" Выпуск 45 (23 июля 2005 г.)
Новым посетителям сайта
Сайт посвящен изучению языка, с помощью которого осуществляется взаимодействие с реляционными (и не только) СУБД. Суть обучения состоит в выполнении заданий на написание запросов к учебным базам данных; при этом система контролирует правильность выполнения заданий. В настоящее время реализованы все операторы подъязыка манипуляции данными (DML), которые включают в себя оператор извлечения данных SELECT, а также операторы модификации данных - INSERT, DELETE и UPDATE.
Мы надеемся, что справочного материала сайта окажется достаточно для самостоятельного обучения. Кроме того, свои решения вы можете обсудить на форуме сайта. Опытных же специалистов приглашаем проверить (продемонстрировать) свое мастерство и принять участие в соревновании, обеспечиваемом рейтинговой системой учета времени выполнения заданий. Фактически, рейтинг ведется на втором этапе тестирования, который начинается сейчас после решения 59-ти задач первого этапа. При подсчете рейтинга каждого участника отбрасывается
один самый худший показатель среди всех решенных им упражнений.
Имеется возможность получить сертификат по SQL DML при выполнении определенного количества заданий.
Новости сайта
§ По настоянию Shark изменил формулировку задачи 91.
§ Число подписчиков - 2242
Число участников рейтинга - 3654
Число участников второго этапа - 344
Лучшие результаты (ТОР 20)
No
Person
Number of Sel_ex
Last_Sel
Number of DML_ex
Scores
Days
Days_2
LastSolved
LastVisit
1
Кувалкин К.С. (Cyrilus)
137
112
20
312
224
5.129
06 Jul 2005
15 Jul 2005
2
Гонтовой В.А. (noname)
137
112
20
312
105
9.808
29 Jun 2005
02 Jul 2005
3
Леденев С.А. (Shurgenz)
137
112
20
312
313
9.900
27 Jun 2005
15 Jul 2005
4
Бураков С.Г. (burakov58)
137
137
20
312
164
12.100
12 Jul 2005
14 Jul 2005
5
Валуев Д.И. (Fiolent)
137
112
20
312
662
26.627
27 Jun 2005
01 Jul 2005
6
Галиаскаров Э.Г. (Galogen)
137
112
20
312
221
61.437
01 Jul 2005
01 Jul 2005
7
Мельникова И.А. (Iris_m)
135
137
20
308
380
89.865
27 May 2005
14 Jun 2005
8
Зверев Д.Л. (dimzv)
135
136
20
306
580
2.471
06 Jun 2005
15 Jun 2005
9
Колосов А.С. (KAS)
134
137
20
306
25
3.398
11 Mar 2005
14 Jun 2005
10
Сныткин В.Л. (Ded I)
134
136
20
304
252
7.456
12 May 2005
15 Jul 2005
11
Рахманов И.Е. (bloom)
134
136
20
304
148
14.171
11 May 2005
15 Jun 2005
12
Hakobyan H.H. (hamlet)
134
136
20
304
220
37.869
07 May 2005
03 Jun 2005
13
Шипунов И. (IAS)
134
136
20
304
334
82.080
13 May 2005
26 May 2005
14
Иткин И.Л. (joseph_itkin)
132
136
20
299
375
2.849
07 Mar 2005
13 Apr 2005
15
Spirin (spirin)
131
136
19
296
158
13.461
21 Jan 2005
24 Jan 2005
16
Михайлов В.Г. (mslava)
132
136
17
293
648
10.504
25 Mar 2005
25 Mar 2005
17
Gershovich (VIG)
128
128
20
293
850
13.073
09 Jul 2005
15 Jul 2005
18
Пятница О.А. (Robin)
125
128
20
287
754
74.630
19 Mar 2005
14 Jul 2005
19
Митронин А.А. (mitronin)
123
124
20
283
701
27.541
31 May 2005
01 Jun 2005
20
Булаев В.В. (Kvix)
119
121
20
274
266
24.671
18 May 2005
18 May 2005
Лучшие результаты за неделю
No
surname
n_sel
sel_all
sel_scores
dml_scores
scores
rating
last_visit
1
Яковлева Е.С. (Katy888)
33
39
59
0
59
718
20 Jul 2005
2
Belookaya M. (Marina)
35
35
59
0
59
817
21 Jul 2005
3
Носков Н.В. (niko2)
26
94
56
0
56
75
21 Jul 2005
4
Сологубова А.М. (Анна)
28
28
49
0
49
971
19 Jul 2005
5
Treglazov I.V. (_EpS)
30
30
38
9
47
1185
21 Jul 2005
6
Заворотный А.А. (Bravo)
20
40
45
0
45
642
19 Jul 2005
7
Юлдашев М.Р. (Snowbear)
35
35
45
0
45
1066
20 Jul 2005
8
Shahnazaryan A. (Armen_a)
35
35
44
0
44
1076
20 Jul 2005
9
Тихонов П.М. (Pavlo)
25
25
40
0
40
1138
20 Jul 2005
10
Ng P. (clement)
17
33
39
0
39
849
20 Jul 2005
11
Бахтин Д.А. (sergeant)
24
24
37
0
37
1198
21 Jul 2005
12
Ерехинский (Maximiljan)
24
24
37
0
37
1228
21 Jul 2005
13
Ларионов Д.А. (Irv)
16
54
36
0
36
440
21 Jul 2005
14
Махортов (tek)
23
23
35
1
36
1281
21 Jul 2005
15
Shark_ (Shark)
15
102
31
0
31
53
21 Jul 2005
16
>Шилова Н. (Neznakomka)
22
22
31
0
31
1454
22 Jul 2005
17
>Пономарев (alexpon)
27
27
30
0
30
1494
22 Jul 2005
18
marilag (marilag)
24
24
30
0
30
1495
21 Jul 2005
19
Субботин А.М. (c[InIMat]ic)
4
61
6
23
29
267
21 Jul 2005
20
Голубицкий Д.А. (golubitsky)
15
25
29
0
29
1151
18 Jul 2005
21
downj (down)
21
21
29
0
29
1528
21 Jul 2005
Изучаем SQL
Так ли необходимы временные таблицы? (окончание, начало в вып.44)
Последний аргумент в пользу временной таблицы - это замена курсора. Я не люблю курсоры и призываю делать все возможное, чтобы заменить курсор (хотя и требуется оценить производительность вашего решения относительно производительности курсора). Один из трюков, который я использую заключается в подражании главной причине, по которой обычно и строится курсор, - построчный обход в цикле результирующего набора и выполнение действия, основанного на данных в той строке. Ниже - короткий запрос, который демонстрирует
эту логику путем получения всех имен пользовательских таблиц и выполнения sp_spaceused на каждой таблице.
SET NOCOUNT ON DECLARE @lngTabCount INTEGER DECLARE @lngLoopCount INTEGER DECLARE @strTabName SYSNAME
INSERT INTO #tTables (strTableName) SELECT name FROM dbo.sysobjects WHERE xtype = 'u'
SET @lngTabCount = @@ROWCOUNT SET @lngLoopCount = @lngTabCount
WHILE @lngLoopCount <> 0 BEGIN SET @strTabName = (SELECT strTableName FROM #tTables WHERE numID = @lngLoopCount) EXEC sp_spaceused @strTabName SET @lngLoopCount = @lngLoopCount - 1 END
DROP TABLE #tTables GO
Подобные курсору действия без курсора и связанные с производительностью проблемы.
Как можно работать без использования временной таблицы?
Теперь, когда я показал Вам несколько ситуаций, в которых использование временных таблиц оправдано, давайте поговорим о том, что можно сделать, чтобы по возможности избежать использования временной таблицы.
В SQL есть замечательная вещь, которая называется производной таблицей и которая в большинстве случаев может заменить временные таблицы. Еще раз взойду на трибуну производительности и скажу, что иногда при работе с очень большими наборами данных, производительность производных таблиц значительно ниже, чем при использовании временной таблицы с индексом. Но для большинства случаев простое использование производной таблицы в соединении устранит потребность во временной таблице. Вы можете найти несколько статей
относительно использования производной таблицы на SQLServerCentral.Com, поэтому я не буду входить в детали относительно их использования в этой статье. Если Вы собираетесь заменить использование временной таблицы для организации данных из нескольких различных источников объединением (UNION) или же созданием постоянной таблицы на манер временной, оба этих подхода будут обычно удовлетворять вашим потребностям по снижению стоимости выполнения запроса. Если Вы используете
SQL Server 2000 и оперируете небольшими наборами данных, пробуйте использовать новый тип данных table. Это создаст временную таблицу как объект в памяти, а не в tempdb и улучшит производительность вашего запроса. Проанализируйте использование коррелированого подзапроса, не сможет ли он заменить вашу временную таблицу. Иногда лишь повторное обращение к местонахождению ваших данных заменит потребность во временных таблицах.
Каждый из этих способов обсуждался как возможное альтернативное решение использованию временной таблицы. Главное здесь - оценить альтернативные способы, чтобы определить, можете ли Вы обоснованно заменить использование временной таблицы, которую обычно создаете в силу привычки. По мере создания различных приемов или трюков Вы будете использовать временные таблицы всё реже и реже, и даже будете испытывать дискомфорт при использовании временной таблицы, веря, что наверняка есть способ обойтись без нее.
Если Вы используете временные таблицы, оптимизируйте их использование.
Если ситуация диктует использование временной таблицы, тогда следует сделать несколько вещей, чтобы улучшить ее производительность. Сначала, именно потому, что это временная таблица, не пытайтесь поместить в нее все столбцы и все строки из вашей постоянной таблицы, если Вы не нуждаетесь в них. Фильтруйте данные, поступающие в вашу временную таблицу, чтобы ограничиться минимальным числом необходимых столбцов и строк. Во вторых, не используйте оператор SELECT INTO для создания временных таблиц. Оператора
SELECT INTO в коде следует избегать любой ценой из-за блокировки, которую он накладывает на системные объекты в течение времени пока решается, как строить таблицу. Найдите время, чтобы написать скрипт создания временной таблицы и отдельных операторов INSERT INTO для ее заполнения. Я считаю, что можно воспользоваться SELECT INTO, если он включает WHERE 1=0, для создания таблицы наиболее быстрым способом, однако не стоит этого делать только для того, чтобы сэкономить на нескольких нажатиях
клавиш. В-третьих, посмотрите, как Вы используете временные таблицы, чтобы избежать повторной компиляции хранимой процедуры. Я объясняю это подробно в статье Optimizing Stored Procedure Recompiles, доступной на моем вебсайте. В-четвертых, проверьте необходимость в кластеризованном индексе на вашей временной таблице. Если набор данных будет большим, то кластеризованный индекс ускорит операции выборки из временной таблицы, однако Вы должны взвесить расходы
производительности на создание этого индекса и вставку данных в таблицу с кластеризованным индексом. Это один из тех методов, который необходимо должен проверяться перед решением о выборе индекса на обеих вариантах с максимально возможным набором данных, который, на ваш взгляд, будет помещаться во временную таблицу. Наконец, известно, что когда заканчивается выполнение хранимой процедуры и завершается подключение, временная таблица удаляется, но зачем сохранять ее, если она уже не нужна. Если Ваш код создает
и использует временную таблицу, а затем переключается на другие вещи, в которых не используется данная таблица, удалите ее в коде. Это освободит ресурсы tempdb для других объектов. Я удаляю таблицу в конце хранимой процедуры даже тогда, когда подключение заканчивается, только для того, чтобы избежать любых проблем, которые могут возникнуть из-за неизвестных ошибок.
Резюме
Хотя временные таблицы (по моему мнению) намного лучше курсоров, их использование действительно вызывает падение производительности. В этой статье кратко обсуждается ряд причин для использования временных таблиц и несколько альтернативных приемов. Конкретное решение следует принимать в зависимости от ситуации. Проверьте ваш запрос при использовании альтернативных подходов прежде, чем Вы создадите временную таблицу, и оцените производительность на временных таблицах; после чего вы сможете сделать обоснованный
выбор. Я твердо придерживаюсь той точки зрения, основанной на накопленном опыте (и это даже при том, что я пишу эту статью), что прежде, чем применять что-либо вычитанное в книге или на вебсайте, необходимо проверить это несколькими различными способами. Делайте это и ваше мастерство в использовании Transact-SQL будет постоянно расти до уровня, когда вы всегда будете иметь несколько различных способов создания запроса.
2002
Полезная информация
Конкурс
§ Мы выставили наш сайт на конкурс Интернить 2005. Победитель определяется числом поданых голосов. Просьба проголосовать. (рекомендуемая оценка 3 :-)).
Контакты
По всем вопросам, связанным с функционированием сайта, проблемами при решении упражнений, идеями вы можете обращаться к Сергею И.Моисеенко msi77@yandex.ru. Вы также можете предложить свои задачи для публикации на сайте.