![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по MSSql [D5, MSSQL, ]
dim- © (2002-01-14 14:40:00)Надо создать сложный отчет по нескольким таблицам.
С DBF создавал отдельную таблицу, делал необходимые выборки и сохранял результат в новой записи, только время на это тратилось большое, перевел Базу данных на MSSql, время тратится меньше, но мне кажется не правильным создавать временную таблицу на сервере.
Подскажите чем можете.
dim- (2002-01-15 11:35:00) [1]Пока и делаю как делал, только думал, что если использовать процедуры то время выполнения отчета будет намного меньше т.к. все расчеты выполнятся будут на сервере
gorohov (2002-01-15 11:23:00) [2]Много хороших советов !
Делай как делал и не мудри.
Все эти примочки о которых рассказали приводят к такомуже результату, но затраты на программирование значительно увеличиваются. Количество ошибок тоже.
SergSuper (2002-01-15 09:53:00) [3]2 dim-
1. Правильно - это когда удобно и быстро. А не тогда, когда Вы следуете каким-то надуманным правилам.
2. На самом деле создание временных таблиц для MSSQL - это нормально и часто это ускоряет работу(например по сравнению с вложенными запросами).
3. Если Вам так не нравяться временные таблицы, то в MSSQL 2000 появились таблицы-переменные - что-то вроде временной таблицы, но хранится в памяти.
С приветом Сергей
wicked (2002-01-15 09:43:00) [4]2Delirium ©
но мы не можем такутверждать.... у меня на mssql7/w2k запрос первый раз выполнялся 3 минуты, второй раз - 2 с половиной.... это ...
server чего то там кеширует, оптимизирует... тем более мы не учли наличия индексов на таблицах и настроек самого сервера.... хотя это дело вкуса.... писать легче с view... но если оченьмного таблиц в запросе и очень много данных, то у менябыстрее работал select.... from( select....)
2dim- ©
вопрос, создавать ли временную таблицу, зависит от того, какие данные ты хочеш получить, трудно ли их добыть и как часто меняются входные данные.... imho копать надо оттуда... :)
KSergey (2002-01-15 09:36:00) [5]По поводу замедления от view. Я, правда, не сходил по вашей ссылке, но что-то сильно сомневаюсь в замедлении от view. Подозреваю, что он должны ускорять в тех случаях, когда выборка по ним производится вторично, ведь для этого не надо заново перестраивать план исполнения.
По поводу временных таблиц. Вообще конечно проще и лучше использовать временные таблицы, создаваемые сервером. Описано в любой документации.
Но бывают случае (во всяком случае у меня), когда временная таблица нужна для "долго" - например, как результат выполнения ХП, но локальная для пользователя. Тут я исп. такую ХП для получения имени временной таблицы
/*
* Возвращает имя для временной рабочей таблицы.
* Имя формируется как
* tb_<host>_<user>_<@Last>
* Хотя параметры можно не задавать, делать это рекомендуется для различения таблиц в разных ХП.
* Если таблица с полученным именем сеществует - она уничтожается (если параметр @IsDeleted = 1)
*
* Вызов:
DECLARE @TbleName VARCHAR (256)
EXEC spGetWorkTbName "specific", @TableName OUTPUT [, 0]
*/
CREATE PROCEDURE [spGetWorkTbName] (@Spec VARCHAR(100) = NULL, @TableName VARCHAR(256) OUTPUT, @IsDelete INT = 1) AS
SET @TableName = "tb_" + HOST_NAME() + "_" + USER_NAME() + "_" + ISNULL(@Spec, "")
IF @IsDelete = 1
BEGIN
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName)
EXEC ("DROP TABLE " + @TableName)
END
Emelin (2002-01-15 09:25:00) [6]dum, тебе не нужен номер сессии.
Временная таблица с именем, начинающимся с одной #
будет локальна для каждой сессии.
Если же имя временной таблицы начинается с двух ## - то это будет глобальная временная таблица.
dim- (2002-01-15 08:52:00) [7]fnatali, а можно чуть чуть кода, как узнать номер сесии?
fnatali (2002-01-15 06:25:00) [8]dim- © (15.01.02 03:47)
У каждого пользователя должна быть своя сессия, по номеру которой и можно идентифицировать отчёты от разных пользователей в одной таблице.
dim- (2002-01-15 03:47:00) [9]По поводу временных таблиц, а если сразу два пользователя будут создавать отчет
Delirium (2002-01-14 18:29:00) [10]>wicked
Давай ка определимся:
Ты утверждаешь что "простой" SQL запрос
типаselect ... from (select ... ) ...будет выполняться быстрее чемselect ... from my_view ...где my_view содержит предыдущий вложеный запрос? Если так, то смею тебя уверить первый вариант намного медлительнее.
Экспериментальные данные:
запрос исполняеся в view виде 26 сек., простым селетом 27 секунд, а селектом из селекта целых 1 мин. 9 сек.
Следовательно view не только не тормозит, но и несколько ускоряет работу SQL Server-а.
Экспкримент проводил на SQL Server 2000, с помощю Query Anatyzer.
asafr (2002-01-14 18:23:00) [11]А почему тебе кажется "не правильным создавать временную таблицу на сервере"?
wicked (2002-01-14 18:06:00) [12]2Delirium ©
насчёт таких цифр - сходи-ка на www.sql-server-performance.com ..... там много чего хорошего валяется...
ну и по собс-сному опыту - view"хи тормозят.... особенно когда есть join из 5-7-10 таблиц и один viewвыбирает из другого... в таком случае derived tables- лучший вариант...
Delirium (2002-01-14 15:09:00) [13]>wicked
"view может замедлять работу где то на 20%"
Ничего подобного!
wicked (2002-01-14 14:50:00) [14]так тут же можно простым select"ом выбирать..... а можно через create view... это уж как душа пожелает.... только учти что view может замедлять работу где то на 20% (вычитал где то)...
Владислав (2002-01-14 14:48:00) [15]Создавай хранимые sql-запросы (Views) и используй их.