Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
6-32312
Александр_1
2001-11-16 00:33
2002.02.11
Трафик


3-32122
Animal
2002-01-15 10:33
2002.02.11
Работа с таблицами без установки BDE на компьтере


3-32173
headhunter
2001-12-06 21:29
2002.02.11
Хочу уйти от BDE. Помогите плиз


3-32154
Hawk2
2002-01-16 11:48
2002.02.11
Помогите с кодировкой!!!


1-32183
Mitrofan
2002-01-25 11:39
2002.02.11
Как синхронно скролировать два Memo or ListBox a





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский