powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нагруженный update строки
7 сообщений из 7, страница 1 из 1
Нагруженный update строки
    #39911103
Developer.Net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день уважаемые форумчане,
есть следующая таблица:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
[src]CREATE TABLE [dbo].[Report](
	[ID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
	[PointID] [int] NOT NULL,
	[ReportDate] [datetime] NOT NULL,
	[Amount] [float] NOT NULL,
	[TransferAmount] [float] NOT NULL,
	[Fee] [float] NOT NULL,
	[Count] [int] NOT NULL,
 CONSTRAINT [PK_Report] 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]

[/SRC]

По сути в эту таблицу пишется обобщенная статистика по суммам, которые прошли в точке (PointID) за конкретный календарный день (ReportDate)

Есть процедура, которая инкрементирует значения в строке (ниже скрипт кот выполняет update):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
begin transaction t1
.....
update [dbo].[Report] 
set Amount = Amount + @amount, 
	TransferAmount = TransferAmount + @transferAmount, 
	Fee = Fee + @fee,
	[Count] = [Count] + 1
where	ID = @repId;
....
commit transaction t1



Проблема возникает в следующем: когда к одной записе (строке) происходит частое обращение на обновление данных (порядка 4 в сек и выше), начинает "плыть" значение в столбце Fee, появляются какие то значение в 6-9й степени после запятой (например 15,50000002 или 15,4999997 при необходимом 15,50), остальные данные в строке не "плывут". При этом, в нормальной ситуации, когда запросов не превышает 1-2 tps, все ровно....

Может был у кого такой же печальный опыт и есть мысли насчет решения такой проблемы?
...
Рейтинг: 0 / 0
Нагруженный update строки
    #39911106
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Developer.Net
1. в столбце Fee, появляются какие то значение в 6-9й степени после запятой (например 15,50000002 или 15,4999997 при необходимом 15,50), остальные данные в строке не "плывут".

2. При этом, в нормальной ситуации, когда запросов не превышает 1-2 tps, все ровно....


1. Это норма. (С) Малышева
Float хранит конечно-разрядное двоичное представление числа. В этом представлении 15,5 записать невозможно. Разрядов не хватает. Хранится "ближайшее". Усугубляется математическими операциями.

2. Это сказки.
...
Рейтинг: 0 / 0
Нагруженный update строки
    #39911114
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Developer.Net


Может был у кого такой же печальный опыт и есть мысли насчет решения такой проблемы?


Я думаю тут частота обновлений никакого отношения к делу не имеет. Если бы у вас запрос вставал на блокировках -- это другое дело.

Могу предложить взять не float, а bigint и хранить в нем сумму умноженную на 10000 или 100 (сдвинув запятую на 4 знака, или на 2 знака.) Тогда должно быть норм.
...
Рейтинг: 0 / 0
Нагруженный update строки
    #39911118
Developer.Net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222, спасибо за подсказку, перечитал MSDN)) нужно переходить на decimal
https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms187912(v=sql.105)?redirectedfrom=MSDN
...
Рейтинг: 0 / 0
Нагруженный update строки
    #39913174
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Developer.Net
aleks222, спасибо за подсказку, перечитал MSDN)) нужно переходить на decimal
https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms187912(v=sql.105)?redirectedfrom=MSDN


или MONEY
...
Рейтинг: 0 / 0
Нагруженный update строки
    #39913330
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
money - для расчетов не самый лучший тип.
...
Рейтинг: 0 / 0
Нагруженный update строки
    #39913343
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если поле [Fee] означает то, что означает, то MONEY - самое то, большей точности там нет
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нагруженный update строки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]