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

Откуда: Пермь
Сообщений: 18328
У меня int как-то кончился даже без пропусков.

А сейчас мне что, с 2005ого, если перейду на 2008ой - придется int на bigint менять?
А это помимо alter table еще и кучу кода придется перелопатить. Переменные @Id int везде.

Я уже не говорю, что 4 лишних байта, на таблицу шириной в 40 байт - это увеличение объема на 10%. Т.е. пропорционально потеря производительность на 10 процентов.

И все это только из-за того, что кто-то в майкрософте решил что 1 и 1500 это почти одно и тоже.
19 май 12, 12:55    [12581555]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Deff
И все это только из-за того, что кто-то в майкрософте решил что 1 и 1500 это почти одно и тоже.
Инфа 100%, что именно в Майкрософте?
19 май 12, 13:07    [12581580]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
step_ks
Member

Откуда:
Сообщений: 936
Deff
У меня int как-то кончился даже без пропусков.

А сейчас мне что, с 2005ого, если перейду на 2008ой - придется int на bigint менять?
А это помимо alter table еще и кучу кода придется перелопатить. Переменные @Id int везде.
Как будет подтверждение (что врядли), так и начнете менять.
Deff
Я уже не говорю, что 4 лишних байта, на таблицу шириной в 40 байт - это увеличение объема на 10%. Т.е. пропорционально потеря производительность на 10 процентов.
а если размер строки увеличится до 80 байт, то производительность в 2 раза сразу упадет?
19 май 12, 13:08    [12581583]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Гавриленко Сергей Алексеевич
Deff
И все это только из-за того, что кто-то в майкрософте решил что 1 и 1500 это почти одно и тоже.
Инфа 100%, что именно в Майкрософте?
А что несколько разработчиков у Microsoft SQL Server?:)
19 май 12, 13:10    [12581585]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
Хорев Иван
Member

Откуда:
Сообщений: 19
Гавриленко Сергей Алексеевич
И полную версию сервера покажите, может быть у вас там бета какая махровая.

Обязательно
19 май 12, 13:10    [12581586]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
step_ks
Member

Откуда:
Сообщений: 936
Deff
Гавриленко Сергей Алексеевич
пропущено...
Инфа 100%, что именно в Майкрософте?
А что несколько разработчиков у Microsoft SQL Server?:)
вы уже воспризвели багу, чтобы утверждать, что виноват сервер?
19 май 12, 13:15    [12581597]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
step_ks
Deff
Я уже не говорю, что 4 лишних байта, на таблицу шириной в 40 байт - это увеличение объема на 10%. Т.е. пропорционально потеря производительность на 10 процентов.
а если размер строки увеличится до 80 байт, то производительность в 2 раза сразу упадет?
Ну так страниц в два раза больше будет. Подумайте сами, какие операции будут дольше выполнятся.
19 май 12, 13:15    [12581598]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
step_ks
Deff
пропущено...
А что несколько разработчиков у Microsoft SQL Server?:)
вы уже воспризвели багу, чтобы утверждать, что виноват сервер?
Несколько человек подтвердили. А у меня 2008ой не в продакшене, так что мне сложнее проверить. Нет живых данных.
19 май 12, 13:17    [12581607]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
Хорев Иван
Member

Откуда:
Сообщений: 19
Гавриленко Сергей Алексеевич
Хорев Иван
При такой постановке вопроса опасно использовать диапазон значений bigint, неговоря уже о int.
Ну освойте калькулятор, что ли. Если у вас одна запись в среднем съедает в 1500 раз больше, то даже вставляя по 100к записей в секунду ежесекундно и без перерывов, положительной половины диапазона bigint вам хватит на 1949 лет. Опасно?

Не понимаю как Вам помогает жить такая невоспитанность. Если вы посмотрите на данные которые я представил, то увидите, что за 3 часа работы инкремент перешёл из 6 разряда в 8. Оставаляю Вам право воспользоватся калькулятором для обоснования своих чисел (2к лет). Мне достаточно и головы чтобы сказать, что Вы ошибаетесь.
19 май 12, 13:19    [12581613]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Deff
Гавриленко Сергей Алексеевич
пропущено...
Инфа 100%, что именно в Майкрософте?
А что несколько разработчиков у Microsoft SQL Server?:)
А именно разработчики Microsoft в данном случае сделали что-то не так?
19 май 12, 13:20    [12581618]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
step_ks
Member

Откуда:
Сообщений: 936
Хорев Иван
Если вы посмотрите на данные которые я представил, то увидите, что за 3 часа работы инкремент перешёл из 6 разряда в 8. Оставаляю Вам право воспользоватся калькулятором для обоснования своих чисел (2к лет). Мне достаточно и головы чтобы сказать, что Вы ошибаетесь.
После такого даже немного боязно доверять вашим тестам.
19 май 12, 13:24    [12581625]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Хорев Иван
Гавриленко Сергей Алексеевич
пропущено...
Ну освойте калькулятор, что ли. Если у вас одна запись в среднем съедает в 1500 раз больше, то даже вставляя по 100к записей в секунду ежесекундно и без перерывов, положительной половины диапазона bigint вам хватит на 1949 лет. Опасно?

Не понимаю как Вам помогает жить такая невоспитанность. Если вы посмотрите на данные которые я представил, то увидите, что за 3 часа работы инкремент перешёл из 6 разряда в 8. Оставаляю Вам право воспользоватся калькулятором для обоснования своих чисел (2к лет). Мне достаточно и головы чтобы сказать, что Вы ошибаетесь.
Попробуйте, все-таки, освоить арифметику, с нею жить проще, чем с воспитанностью. С вашей 20721 записью за ~21 час (2012-05-18 13:08:43.460 - 2012-05-17 16:19:46.023) и с вашей скоростью наращивания identity поля в 1440519 значений в час [(30525295 - 274381) / 21], значение bigint переполнится за 6402811789955 часов ( 9223372036854775808 / 1440519 ), что составляет 749392765 лет ( 6402811789955 / 24 / 365) без учета високосных.

Что касается проблемы в целом - предоставляйте репро. Потому что у вас, скорее всего, ошибка в коде.

Сообщение было отредактировано: 19 май 12, 21:07
19 май 12, 13:34    [12581645]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Deff
step_ks
пропущено...
а если размер строки увеличится до 80 байт, то производительность в 2 раза сразу упадет?
Ну так страниц в два раза больше будет. Подумайте сами, какие операции будут дольше выполнятся.
Скан - да. Массовая последовательная вставка - да. Рандомные операции - нет.
19 май 12, 13:37    [12581652]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Deff
Несколько человек подтвердили.
Никто ничего не подтвердил. Это всего лишь предположения. У меня с 1:1500 даже близко не стоит, всё в пределах допустимости. Если и есть "баг", то он сопоставим с остальными "эффектами".
Более того дырки обязаны быть у всех. У многих они должны быть большими, потому что природа криворукости одинакова, применяются примерно одни и те же архитектурные "решения". Мало кто может сделать гарантированный обзор своей системы и степень влияния каждой её части.
Видел системы где специально делают дырки (SET IDENTITY_INSERT), а может быть авторы забывают о банальнейшем DELETE.

Тема интересна тем, что возможно составить запросы которые постфактум (не было трейсеров) могут указать места (точнее моменты) ошибок, для поиска изъянов в архитектуре. Особенно когда нельзя повесить трейс или ошибки трудноуловимые.
Ну во всяком случае знание допустимой нормы "дырок" и их природы может быть очень полезно как ещё один способ контроля системы.

Int ... как-то маловато для наработки статистики при огромной нагрузке на систему и после притирания всех багов системы. Не?
Как можно убедиться что не было банальных (не контролируемых) удалений из таблы? Просмотреть страницы данных и увидеть ... что?
19 май 12, 14:39    [12581758]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Давайте репро, чтоб запостить на https://connect.microsoft.com
19 май 12, 15:00    [12581796]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
Люди, вы подумайте что вы обсуждаете!
Вы обсуждаете дырки в identity, то есть пустоту, вакуум! Стоит ли на это тратить усилия?
19 май 12, 16:17    [12581940]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
MasterZiv
Стоит ли на это тратить усилия?


У меня, лично, интерес чисто академический. Насколько я успел познать SQL сервер при нормальной работе (транзакции всегда коммитятся, ничего не удаляется и т.д.) IDENTITY должен быть последовательным. Причем "должен" <> "мне так сказали в MS", а "я, лично, никогда не наблюдал иного". В то же время если кто докажет что "не должен" - просто порадуюсь приумножению своих знаний и в истерику впадать не буду. Потому что никто и не заявлял что IDENTITY будет "строгим перечислятелем" всех строк таблицы. Обещались лишь уникальные, возрастающие (не без пропусков, а просто - возрастающие) значения для колонки, вот на них и закладывайтесь при проектировании. Если вы закладываетесь на "строго подряд" - кто вам злобный буратино?
Так что факт не вызывающий сомнений: при текущей официальной документации НЕ НАДО опираться в своих алгоритмах и своем коде на непрерывность IDENTITY. Кто бы и что бы далее не доказал. Однако послушать мнения и позапускать тестовые коды (которых я до сих пор не вижу) - интересно.
19 май 12, 21:04    [12582626]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
aleonov
Member

Откуда:
Сообщений: 96
SamMan
MasterZiv
Стоит ли на это тратить усилия?


У меня, лично, интерес чисто академический. Насколько я успел познать SQL сервер при нормальной работе (транзакции всегда коммитятся, ничего не удаляется и т.д.) IDENTITY должен быть последовательным. Причем "должен" <> "мне так сказали в MS", а "я, лично, никогда не наблюдал иного". В то же время если кто докажет что "не должен" - просто порадуюсь приумножению своих знаний и в истерику впадать не буду. Потому что никто и не заявлял что IDENTITY будет "строгим перечислятелем" всех строк таблицы. Обещались лишь уникальные, возрастающие (не без пропусков, а просто - возрастающие) значения для колонки, вот на них и закладывайтесь при проектировании. Если вы закладываетесь на "строго подряд" - кто вам злобный буратино?
Так что факт не вызывающий сомнений: при текущей официальной документации НЕ НАДО опираться в своих алгоритмах и своем коде на непрерывность IDENTITY. Кто бы и что бы далее не доказал. Однако послушать мнения и позапускать тестовые коды (которых я до сих пор не вижу) - интересно.


вообще-то в мануале написано следующее
Remarks
If an identity column exists for a table with frequent deletions, gaps can occur between identity values. If this is a concern, do not use the IDENTITY property. However, to ensure that no gaps have been created or to fill an existing gap, evaluate the existing identity values before explicitly entering one with SET IDENTITY_INSERT ON.

т.е как я это понимаю непрерывность должна быть. я уже предлагал автору включить трейсер и проверить что именно происходит в момент вставки. моя теория что все-таки некоторые вставки отваливаются. я бы написал код который вставляет запись и одновременно ведет свой счетик на клиенте, как только этот счетчик не совпадает с @@identity - разбираться, почему это произошло
19 май 12, 22:39    [12582982]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
aleonov
Member

Откуда:
Сообщений: 96
Хорев Иван
alexeyvg,

Удалений точно не было, и транзакции все подтверждаются, вроде (эксепшенов в ADO не было)
вот код на вставку

                using(var connection = new SqlConnection(connectionString))
                {
                    connection.Open();

                    var command = new SqlCommand("insert into logs (hst, lbl, txt) values (@hst, @lbl, @txt)", connection);

                    command.Parameters.AddWithValue("@hst", Environment.MachineName);
                    command.Parameters.AddWithValue("@lbl", label);
                    command.Parameters.AddWithValue("@txt", message);

                    command.ExecuteNonQuery();
                }


А где обработка exceptions ? ;-)
19 май 12, 22:43    [12583008]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
aleonov
А где обработка exceptions ?
А некоторые не представляют как часто падает весь веб сервис и происходит повторное выполнение "запроса".
Одного catch в данном месте мало.
20 май 12, 00:18    [12583454]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
Хорев Иван
Member

Откуда:
Сообщений: 19
Версия СУБД
select @@version

Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86)   
Feb 9 2007 22:47:07
Copyright (c) 1988-2005 Microsoft Corporation
Express Edition with Advanced Services on Windows NT 6.1 (Build 7600: )

Таблица
CREATE TABLE [dbo].[logs](
	[id] [bigint] IDENTITY(1,1) NOT NULL,
	[hst] [varchar](32) NULL,
	[lbl] [varchar](32) NULL,
	[mxt] [nvarchar](max) NULL,
	[dt] [datetime] NULL CONSTRAINT [df_logs_dt]  DEFAULT (getdate()),
 CONSTRAINT [pk_logs] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO


Метод вставки, в desktop приложении, вызывается из разных потоков
        static void Log(String label, params Object[] parameters)
        {
#if DEBUG
            try
            {
                var message = String.Empty;

                foreach(var parameter in parameters)
                {
                    message += (parameter + "").ToString() + "\n";
                }

                var connectionString = "Data Source=********;Initial Catalog=test2db;Persist Security Info=True;User ID=sa;Password=*******";

                using(var connection = new System.Data.SqlClient.SqlConnection(connectionString))
                {
                    connection.Open();

                    var command = new System.Data.SqlClient.SqlCommand("insert into logs (hst, lbl, mxt) values (@hst, @lbl, @mxt)", connection);

                    command.Parameters.AddWithValue("@hst", Environment.MachineName);
                    command.Parameters.AddWithValue("@lbl", label);
                    command.Parameters.AddWithValue("@mxt", message);

                    command.ExecuteNonQuery();
                }
            }
            catch(Exception exception)
            {
                using(var stream = new StreamWriter((new FileInfo("test2_" + DateTime.Now.Ticks + ".txt")).OpenWrite()))
                {
                    stream.WriteLine(exception.);
                }
            }
#endif
        }
21 май 12, 07:10    [12585986]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
Хорев Иван
Member

Откуда:
Сообщений: 19
Данные здесь http://files.mail.ru/OLG937
21 май 12, 07:30    [12586001]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
step_ks
Member

Откуда:
Сообщений: 936
Хорошо бы после каждого инсерта увидеть SCOPE_IDENTITY() и max(id), причем в профайлерной трассе. Например, как выходные параметры у RPC:Completed.
21 май 12, 08:45    [12586150]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
Хорев Иван
Member

Откуда:
Сообщений: 19
step_ks
Хорошо бы после каждого инсерта увидеть SCOPE_IDENTITY() и max(id), причем в профайлерной трассе. Например, как выходные параметры у RPC:Completed.

Хотел приложить, но не могу
21 май 12, 09:01    [12586197]     Ответить | Цитировать Сообщить модератору
 Re: почему identity инкрементирует каждый раз на разное значение  [new]
step_ks
Member

Откуда:
Сообщений: 936
да и SP4 не грех бы поставить.
21 май 12, 09:06    [12586218]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить