Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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]

Пока и делаю как делал, только думал, что если использовать процедуры то время выполнения отчета будет намного меньше т.к. все расчеты выполнятся будут на сервере




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.11;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.024 c
14-32337          vajo                  2001-12-21 09:09  2002.02.11  
Тестирование компьютера.


1-32185           Stormick              2002-01-28 23:35  2002.02.11  
Помогите плиз


1-32205           Priz_Datiy            2002-01-24 22:44  2002.02.11  
операции с реестром


1-32296           Anas                  2002-01-26 07:52  2002.02.11  
Про Ord и Chr


1-32229           hwber                 2002-01-26 15:04  2002.02.11  
QuickReport руссифмцировать Preview?