Форум: "Базы";
Текущий архив: 2002.02.11;
Скачать: [xml.tar.bz2];
ВнизВопрос по MSSql Найти похожие ветки
← →
dim- (2002-01-14 14:40) [0]Надо создать сложный отчет по нескольким таблицам.
С DBF создавал отдельную таблицу, делал необходимые выборки и сохранял результат в новой записи, только время на это тратилось большое, перевел Базу данных на MSSql, время тратится меньше, но мне кажется не правильным создавать временную таблицу на сервере.
Подскажите чем можете.
← →
Владислав (2002-01-14 14:48) [1]Создавай хранимые sql-запросы (Views) и используй их.
← →
wicked (2002-01-14 14:50) [2]так тут же можно простым select"ом выбирать..... а можно через create view... это уж как душа пожелает.... только учти что view может замедлять работу где то на 20% (вычитал где то)...
← →
Delirium (2002-01-14 15:09) [3]>wicked
"view может замедлять работу где то на 20%"
Ничего подобного!
← →
wicked (2002-01-14 18:06) [4]2Delirium ©
насчёт таких цифр - сходи-ка на www.sql-server-performance.com ..... там много чего хорошего валяется...
ну и по собс-сному опыту - view"хи тормозят.... особенно когда есть join из 5-7-10 таблиц и один view выбирает из другого... в таком случае derived tables - лучший вариант...
← →
asafr (2002-01-14 18:23) [5]А почему тебе кажется "не правильным создавать временную таблицу на сервере"?
← →
Delirium (2002-01-14 18:29) [6]>wicked
Давай ка определимся:
Ты утверждаешь что "простой" SQL запрос
типаselect ... from (select ... ) ...
будет выполняться быстрее чемselect ... from my_view ...
где my_view содержит предыдущий вложеный запрос? Если так, то смею тебя уверить первый вариант намного медлительнее.
Экспериментальные данные:
запрос исполняеся в view виде 26 сек., простым селетом 27 секунд, а селектом из селекта целых 1 мин. 9 сек.
Следовательно view не только не тормозит, но и несколько ускоряет работу SQL Server-а.
Экспкримент проводил на SQL Server 2000, с помощю Query Anatyzer.
← →
dim- (2002-01-15 03:47) [7]По поводу временных таблиц, а если сразу два пользователя будут создавать отчет
← →
fnatali (2002-01-15 06:25) [8]dim- © (15.01.02 03:47)
У каждого пользователя должна быть своя сессия, по номеру которой и можно идентифицировать отчёты от разных пользователей в одной таблице.
← →
dim- (2002-01-15 08:52) [9]fnatali, а можно чуть чуть кода, как узнать номер сесии?
← →
Emelin (2002-01-15 09:25) [10]dum, тебе не нужен номер сессии.
Временная таблица с именем, начинающимся с одной #
будет локальна для каждой сессии.
Если же имя временной таблицы начинается с двух ## - то это будет глобальная временная таблица.
← →
KSergey (2002-01-15 09:36) [11]По поводу замедления от 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
← →
wicked (2002-01-15 09:43) [12]2Delirium ©
но мы не можем так утверждать.... у меня на mssql7/w2k запрос первый раз выполнялся 3 минуты, второй раз - 2 с половиной.... это ...
server чего то там кеширует, оптимизирует... тем более мы не учли наличия индексов на таблицах и настроек самого сервера.... хотя это дело вкуса.... писать легче с view... но если очень много таблиц в запросе и очень много данных, то у меня быстрее работал select.... from ( select ....)
2dim- ©
вопрос, создавать ли временную таблицу, зависит от того, какие данные ты хочеш получить, трудно ли их добыть и как часто меняются входные данные.... imho копать надо оттуда... :)
← →
SergSuper (2002-01-15 09:53) [13]2 dim-
1. Правильно - это когда удобно и быстро. А не тогда, когда Вы следуете каким-то надуманным правилам.
2. На самом деле создание временных таблиц для MSSQL - это нормально и часто это ускоряет работу(например по сравнению с вложенными запросами).
3. Если Вам так не нравяться временные таблицы, то в MSSQL 2000 появились таблицы-переменные - что-то вроде временной таблицы, но хранится в памяти.
С приветом Сергей
← →
gorohov (2002-01-15 11:23) [14]Много хороших советов !
Делай как делал и не мудри.
Все эти примочки о которых рассказали приводят к такомуже результату, но затраты на программирование значительно увеличиваются. Количество ошибок тоже.
← →
dim- (2002-01-15 11:35) [15]Пока и делаю как делал, только думал, что если использовать процедуры то время выполнения отчета будет намного меньше т.к. все расчеты выполнятся будут на сервере
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.02.11;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.006 c