Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
Vetal
Member

Откуда: Киев
Сообщений: 1019
Всем привет!

Такой вопрос. Вот, создаю хранимые процедуры. Если в процедуре есть входные или выходные параметры или внутренние переменные типа varchar, то я им обычно назнаю длину 8000.
Делаю я это с целью того, чтобы в строке всегда хватало места для нужных данных...

Дык вот, вопрос... Нормально ли, что я указываю постоянно такую длину строки? Не будет ли из-за этого тормозов или сильного расхода памяти?

Заранее спасибо за ответ:

ЗЫ: Хранимые процедуры у меня примерно выглядят вот-так:
CREATE PROCEDURE notf_CheckDBVerify(
    @sMsgFile varchar(8000)
    )
AS
BEGIN
    declare
        @sCmd               varchar(8000),
        @sMsgLine           varchar(8000),
        @sCheckDBSuccMask   varchar(8000),
        @sCheckDBFailMask   varchar(8000);
        -- тело хранимой процедуры
END
30 май 05, 12:09    [1580904]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
Я лично этого избегаю... Плохое предчувствие !

P.S. Можно просто Бизик, admin@busyman.ru , ICQ# 131833549
30 май 05, 12:10    [1580909]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37100
Кстати, интересный вопрос.
Резервирует ли сервер под эти переменные сразу по 8000 байт или по мере заполнения это делает?
30 май 05, 12:11    [1580915]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
РЕВЫЙ РАЗ ВИЖУ ГСА СОМНЕВАЕТСЯ??? ЭТО НАДО СФОТОГРАФИРОВАТЬ!

P.S. Можно просто Бизик, admin@busyman.ru , ICQ# 131833549
30 май 05, 12:14    [1580924]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
ex
Member

Откуда:
Сообщений: 271
Vetal
Всем привет!

Такой вопрос. Вот, создаю хранимые процедуры. Если в процедуре есть входные или выходные параметры или внутренние переменные типа varchar, то я им обычно назнаю длину 8000.
Делаю я это с целью того, чтобы в строке всегда хватало места для нужных данных...

Дык вот, вопрос... Нормально ли, что я указываю постоянно такую длину строки? Не будет ли из-за этого тормозов или сильного расхода памяти?

Заранее спасибо за ответ:

ЗЫ: Хранимые процедуры у меня примерно выглядят вот-так:
CREATE PROCEDURE notf_CheckDBVerify(
    @sMsgFile varchar(8000)
    )
AS
BEGIN
    declare
        @sCmd               varchar(8000),
        @sMsgLine           varchar(8000),
        @sCheckDBSuccMask   varchar(8000),
        @sCheckDBFailMask   varchar(8000);
        -- тело хранимой процедуры
END


- яб написал nvarchar, поскольку реално будут хранится не 8000 символов, а столько сколько будет введено.. а так c varchar канешно будет подтормажиавть..
30 май 05, 12:16    [1580941]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37100
BusyMan
РЕВЫЙ РАЗ ВИЖУ ГСА СОМНЕВАЕТСЯ??? ЭТО НАДО СФОТОГРАФИРОВАТЬ!

P.S. Можно просто Бизик, admin@busyman.ru , ICQ# 131833549

У меня есть своя точка зрения на этот вопрос, но наверняка не знаю.
Скорее всего, выделяется сразу максимальное количество памяти, потому как это быстрее.
автор
- яб написал nvarchar, поскольку реално будут хранится не 8000 символов, а столько сколько будет введено.. а так c varchar канешно будет подтормажиавть..

Дык у nvarchar'а совершенно другое назначение, да и результаты можно поиметь совершенно другие.
30 май 05, 12:18    [1580949]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
Гавриленко Сергей Алексеевич
Кстати, интересный вопрос.
Резервирует ли сервер под эти переменные сразу по 8000 байт или по мере заполнения это делает?


Я думаю, что НЕТ. На мыли меня наводит только вот что: когда делаешь таблицу с кучей таких полей, он выдает предупреждение, что суммарный размер больше там чего-то. Но, реально ругается только после того, как этот размер был по факту превышен. Я думаю, что он не резервирует под них место... Хотя смотря в файл MDF какая-то там пустота вечная... Темно и страшно.... Поэтому черт его знает... я здаюсь...

P.S. Можно просто Бизик, admin@busyman.ru , ICQ# 131833549
30 май 05, 12:19    [1580958]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
Vetal
Member

Откуда: Киев
Сообщений: 1019
ex
яб написал nvarchar, поскольку реално будут хранится не 8000 символов, а столько сколько будет введено.. а так c varchar канешно будет подтормажиавть..

А при чем тут nvarchar? nvarchar отличается от varchar только тем, что первый нужен для Unicode строк.

Ты, наверное, имел в виду использовать varchar вместо char, а написал nvarchar вместо varchar!
30 май 05, 12:20    [1580962]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37100
BusyMan
Гавриленко Сергей Алексеевич
Кстати, интересный вопрос.
Резервирует ли сервер под эти переменные сразу по 8000 байт или по мере заполнения это делает?


Я думаю, что НЕТ. На мыли меня наводит только вот что: когда делаешь таблицу с кучей таких полей, он выдает предупреждение, что суммарный размер больше там чего-то. Но, реально ругается только после того, как этот размер был по факту превышен. Я думаю, что он не резервирует под них место... Хотя смотря в файл MDF какая-то там пустота вечная... Темно и страшно.... Поэтому черт его знает... я здаюсь...

P.S. Можно просто Бизик, admin@busyman.ru , ICQ# 131833549

В файле, действительно, для var-типов выделяется столько место, сколько они реально занимают, потому как для файла критичны размер (и время считывания с диска соотв.). Но с переменными дело не обязятельно должно обстоять точно также - память в данном случае не является узким местом (ну сколько Вы переменных сделаете 10? 100?), а вот производительность - запросто.
автор
Хотя смотря в файл MDF какая-то там пустота вечная...

Почитайте книгу K.Delany "Inside SQL Server", там про внутренне устройство файлов сервера (да и самого сервера) хорошо написано.
30 май 05, 12:25    [1580992]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
ex
Member

Откуда:
Сообщений: 271
Vetal
ex
яб написал nvarchar, поскольку реално будут хранится не 8000 символов, а столько сколько будет введено.. а так c varchar канешно будет подтормажиавть..

А при чем тут nvarchar? nvarchar отличается от varchar только тем, что первый нужен для Unicode строк.

Ты, наверное, имел в виду использовать varchar вместо char, а написал nvarchar вместо varchar!


- мдя. напутал nchar с nvarchar..
30 май 05, 13:33    [1581254]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
EvAlex
Member

Откуда: Israel
Сообщений: 1001
я думаю, что SQL Server всегда резервирует 8000 для переменных varchar в независимости от того сколько объявлено.
30 май 05, 15:35    [1581778]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37100
EvAlex
я думаю, что SQL Server всегда резервирует 8000 для переменных varchar в независимости от того сколько объявлено.

Вот это, наверное, самое неразумное с их стороны будет.
30 май 05, 15:37    [1581783]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
kvasimodo
Member

Откуда: Украина
Сообщений: 314
EvAlex
я думаю, что SQL Server всегда резервирует 8000 для переменных varchar в независимости от того сколько объявлено.

Класс. А также в независимости от того, сколько на текущий момент подключений и какое количество переменных объявлено в каждой. К примеру, 30 процедур с 30 параметрами такого типа вызывается в 30 подключениях и 200 мегабайт памяти резервируется под них.
30 май 05, 15:52    [1581861]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
sql относится к интерпретируемым языкам ... в которых никакая память под переменные ссылочных типов не выделяется до момента использования переменной ... может и в нем так же

а вообще бурная дискуссия и ни одной попытки сделать тестовый скрипт!!!
генерим хп с несколькими сотнями таких переменных, запускаем ее и убеждаемся, что ни-че-го не произошло
31 май 05, 07:26    [1582952]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
Vladimir Kovalevskii
Member

Откуда:
Сообщений: 696
когда же мы начнём вчитываться?

тип varchar или character varying определяет строку переменной длины N от 0 до 8000 символов. это означает, что действительный размер (Actual Size) НИ В КОЕМ СЛУЧАЕ не равен N и может быть нулём, если строка не имеет введённых Вами символов.

varchar это указатель * char и всё.
31 май 05, 09:40    [1583115]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
Vladimir Kovalevskii
когда же мы начнём вчитываться?
тип varchar или character varying определяет строку переменной длины N от 0 до 8000 символов. это означает, что действительный размер (Actual Size) НИ В КОЕМ СЛУЧАЕ не равен N и может быть нулём, если строка не имеет введённых Вами символов.
varchar это указатель * char и всё.

T-SQL ++ у нас другой форум...
31 май 05, 10:06    [1583224]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
Alexey Sh
Member

Откуда: SPB
Сообщений: 1930
iSestrin
sql относится к интерпретируемым языкам ... в которых никакая память под переменные ссылочных типов не выделяется до момента использования переменной ... может и в нем так же

...

интерпретируемость не имеет никакого отношения к ответу на вопрос.

Переформулирую. Сколько памяти использует след фрагмент?

DECLARE @A VARCHAR(8000) 
SET @A='B'
31 май 05, 10:49    [1583386]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
>интерпретируемость не имеет никакого отношения к ответу на вопрос.<
ой!
расскажите, как в интерпретируемом коде заранее узнать тип переменной?

>Переформулирую. Сколько памяти использует след фрагмент?<

DECLARE @A VARCHAR(8000) - думаю, тут выделяет 4 байта на указатель и 1-2 байта на описательтипа данных
SET @A='B' - тут выделяет 2 байта (Б+0 для сишных строк)

плюс возможные выравнивания...
считайте сами

конечно это только догадки, но тест показывает, что заранее ничего не выделяется
31 май 05, 11:04    [1583456]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
Alexey Sh
Member

Откуда: SPB
Сообщений: 1930
iSestrin
>интерпретируемость не имеет никакого отношения к ответу на вопрос.<
ой!
расскажите, как в интерпретируемом коде заранее узнать тип переменной?


не будем уходить от TSQL.

DECLARE уже не требует указания типа переменной?
31 май 05, 12:18    [1583850]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
>не будем уходить от TSQL.<
чтобы ответить на вопрос - нельзя не уходить, т.к. тест сделать все присутствующие категорически отказываются ... я его сделал и свое мнение определил
не делая теста, нужно подумать/почитать, как обычно интерпретатор исполняет код и как там описываются переменные
31 май 05, 12:27    [1583903]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
Vetal
Member

Откуда: Киев
Сообщений: 1019
iSestrin
тест сделать все присутствующие категорически отказываются ... я его сделал и свое мнение определил

А как ты провел тест? И каким образом определил свое мнение? По каким критериям?
31 май 05, 12:32    [1583933]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000
31 май 05, 12:57    [1584097]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
Vetal
Member

Откуда: Киев
Сообщений: 1019
iSestrin
А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000

Понятно, ты сгенерил такую ХП, запустил, а она памяти нифига не похавала?
31 май 05, 13:02    [1584131]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
ага
31 май 05, 13:12    [1584194]     Ответить | Цитировать Сообщить модератору
 Re: А нормально ли, что я всем переменным в хр.проц. назначаю длину 8000  [new]
Alexey Sh
Member

Откуда: SPB
Сообщений: 1930
iSestrin
>не будем уходить от TSQL.<
чтобы ответить на вопрос - нельзя не уходить, т.к. тест сделать все присутствующие категорически отказываются ... я его сделал и свое мнение определил
не делая теста, нужно подумать/почитать, как обычно интерпретатор исполняет код и как там описываются переменные


Независимо от подхода (интерпретация/компиляция) память под строковые переменные может выделяться
1)под максимальную или текущую длину
2)в куче, стеке, пузыре
31 май 05, 13:13    [1584201]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить