powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как лучше хранить графики в базе данных ?
25 сообщений из 96, страница 2 из 4
Как лучше хранить графики в базе данных ?
    #37909384
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValЭто сложный запрос:
select count(*) from Users where total_credit >100 order by total_credit desc ?

Я проверил в SQL-studio: запрос длится 2-3 секунды(если юзеров >=300 тыс.)


Бред какой-то. Ведь этот запрос вернет одну строку, с указанием количества юзеров, у которых total_credit >100. Зачем тогда order by, да еще desc?
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909412
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cane Cat Fisher,

интересно, что показывает эксплейн этого запроса :)
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909419
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АнатоЛойищи узкое место в своём процессе: из каких действий он состоит

Сейчас речь об SQL сервере, а не о клиентской программе.
Вот сижу в Menegement Studio и набиваю:

select top(10) * from Users where total_credit>100 order by total_credit desc
go

И всё замечательно, пока размер базы небольшой. А когда размер 40-50 гигабайт - задержка 2-3-5 секунд. :(

Никаких процессов больше нет. В каком процессе искать узкое место ?
Попробую поизменять индексы. Опыт в составлении индексов у меня небольшой( мягко говоря).
Хотя я всё равно думаю, что тормозит потому, что размер базы большой.

p.s.
Переделываю под хранение сжатых xml.
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909430
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Cane Cat Fisher :
Cane Cat FisherБред какой-то. Ведь этот запрос вернет одну строку
Ну ошибся я в качестве примера.(count тут не причём).
*****
Напугали меня. Понаделал кучу индексов на таблицы... начались блокировки при insert-ах. :(
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909444
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValselect top(10) * from Users where total_credit>100 order by total_credit desc
go

От БД не нужно требовать всегда быстро выдавать результат на любой запрос.
Проверяй на скорость выполнения те запросы, которые будет выполнять твоё приложение.
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909465
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValНапугали меня. Понаделал кучу индексов на таблицы... начались блокировки при insert-ах. :(

Потому что индексы надо создавать с умом, а не от балды. EXPLAIN тут уже упомянули.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909498
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 АнатоЛой :
АнатоЛойПроверяй на скорость выполнения те запросы, которые будет выполнять твоё приложение.
- так оно и будет выполнять именно такой запрос.

2 Dimitry Sibiryakov :
Ну если Вы разбираетесь, подскажите какие индексы создать для Users ?
(таблицы Команд, Стран - такие же. Там я сам.. без ума, но по образу и подобию, так сказать..)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
drop table dbo.Users

CREATE TABLE dbo.Users(
	[id] [int] NOT NULL PRIMARY KEY ,
	[teamid] [int] NOT NULL DEFAULT 0,
	[countryid] [int] NOT NULL DEFAULT 0,
	[create_time] [int] NOT NULL, -- UNIX TIMESTAMP
	[stats_update_time] [datetime] NOT NULL DEFAULT (getutcdate()-getutcdate()),
	[total_credit] [decimal](28, 2) NOT NULL,
	[expavg_credit] [decimal](28, 2) NOT NULL,
	[credit_day] [decimal](28, 2) NOT NULL DEFAULT 0,
	[credit_week] [decimal](28, 2) NOT NULL DEFAULT 0,
	[credit_month] [decimal](28, 2) NOT NULL DEFAULT 0,
	[project_rank] [int] NOT NULL DEFAULT 0,
	[team_rank] [int] NOT NULL DEFAULT 0,
	[country_rank] [int] NOT NULL DEFAULT 0,
	[project_rank_day] [int] NOT NULL DEFAULT 0,
	[project_rank_week] [int] NOT NULL DEFAULT 0,
	[project_rank_month] [int] NOT NULL DEFAULT 0,
	[team_rank_day] [int] NOT NULL DEFAULT 0,
	[team_rank_week] [int] NOT NULL DEFAULT 0,
	[team_rank_month] [int] NOT NULL DEFAULT 0,
	[country_rank_day] [int] NOT NULL DEFAULT 0,
	[country_rank_week] [int] NOT NULL DEFAULT 0,
	[country_rank_month] [int] NOT NULL DEFAULT 0,
	[cpid] [varchar](32) NOT NULL,
	[expavg_time] [decimal](28, 2) NOT NULL,
	 [varchar](254) NULL,
	[name] [nvarchar](80) NOT NULL,

-- графики --
	[total_credit_xml] [varchar](1000) NULL,
	[expavg_credit_xml] [varchar](1000) NULL,
	[credit_day_xml] [varchar](1000) NULL,
	[credit_week_xml] [varchar](1000) NULL,
	[credit_month_xml] [varchar](1000) NULL,
	[project_rank_xml] [varchar](1000) NULL,
	[project_rank_day_xml] [varchar](1000) NULL,
	[project_rank_week_xml] [varchar](1000) NULL,
	[project_rank_month_xml] [varchar](1000) NULL,
	[team_rank_xml] [varchar](1000) NULL,
	[team_rank_day_xml] [varchar](1000) NULL,
	[team_rank_week_xml] [varchar](1000) NULL,
	[team_rank_month_xml] [varchar](1000) NULL,
	[country_rank_xml] [varchar](1000) NULL,
	[country_rank_day_xml] [varchar](1000) NULL,
	[country_rank_week_xml] [varchar](1000) NULL,
	[country_rank_month_xml] [varchar](1000) NULL
	)
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909524
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 08/08/2012 07:25 PM, SerVal wrote:

> select top(10) * from Users where total_credit>100 order by total_credit desc
> go

Ты хочешь поговорить о производительности этого запроса ?
Тебе это нужно ?

>
> И всё замечательно, пока размер базы небольшой. А когда размер 40-50 гигабайт -
> задержка 2-3-5 секунд. :(

А индекс на total_credit есть?
А записей всего и с total_credit>100 сколько ?

> Хотя я всё равно думаю, что тормозит потому, что размер базы большой.
Т.е. по-твоему только с маленькими базами данных можно работать, да?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909525
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValподскажите какие индексы создать для Users ?

Это зависит от данных в этой таблице и запросов к ней. Какой процент записей в ней имеет
total_credit>100?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909526
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 08/08/2012 08:26 PM, SerVal wrote:

> 2 *Dimitry Sibiryakov*:
> Ну если Вы разбираетесь, подскажите какие индексы создать для Users ?

А это ещё немного зависит от того, какие запросы ты будешь выполнять, не
правда ли ?

> (таблицы Команд, Стран - такие же. Там я сам.. без ума, но по образу и подобию,
> так сказать..)

Ага, такие же. В них поля и в полях данные ...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909577
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivТы хочешь поговорить о производительности этого запроса ?
Тебе это нужно ?
Да. Хочется, чтобы этот запрос выполнялся не 3-5 секунд, а побыстрее.
Но это можно и потом, когда загрузку/обновление удастся сделать побыстрее.
*******
Ребятки, я уже написал, что вопрос о производительности клиентского приложения пока не актуален.
Сейчас бы просто уменьшить время загрузки/обновления статистики и разрастание таблиц из-за графиков.

Графики XML стал хранить сжатыми, как varchar(1000)/
Но всё равно, производительность не радует, потому что обновлять надо каждый день.
Пока запустил обновление, чтобы посмотреть - дала-ли что-нибудь компрессия графиков.

Download stats started 08 Aug 2012 15:57:39.
Einstein@Home: началась загрузка данных.
Einstein@Home: запущено 17 нитей добавления 324562 участников в таблицу Users
Einstein@Home: запущено 67 нитей добавления 2668084 компьютеров в таблицу Hosts
Einstein@Home: запущено 3 нитей добавления 10358 команд в таблицу Teams
Einstein@Home: ожидаем обновление участников, команд и компьютеров....

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

p.s.
Убрал пока все индексы кроме как на PRIMARY KEY. Блокировки пропали. (Ура !)
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909583
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValХочется, чтобы этот запрос выполнялся не 3-5 секунд, а побыстрее.

Тогда создай DESCENDING index на total_credit.

SerValСейчас бы просто уменьшить время загрузки/обновления статистики и разрастание
таблиц из-за графиков.
Тогда как уже и сказали: выкинь к ЧМ этот XML и храни данные в реляционных таблицах, как
все нормальные люди.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909682
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 08/08/2012 09:38 PM, Dimitry Sibiryakov wrote:

> SerVal
> Хочется, чтобы этот запрос выполнялся не 3-5 секунд, а побыстрее.
>
>
> Тогда создай *DESCENDING* index на total_credit.

Это всё равно. Индексы могут сканироваться в любую сторону.

> Тогда как уже и сказали: выкинь к ЧМ этот XML и храни данные в реляционных
> таблицах, как
> все нормальные люди.

Да это всё равно как хранить.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909683
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValВот сижу в Menegement Studio и набиваю:

select top(10) * from Users where total_credit>100 order by total_credit desc
go

И всё замечательно, пока размер базы небольшой. А когда размер 40-50 гигабайт - задержка 2-3-5 секунд. :(

а у этого запроса есть план выполнения, или как оно там называется в mssql-e?
нечто, показывающее используемые индексы, время и прочее?
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909685
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Dimitry Sibiryakov :
То есть Вы предлагаете создать дополнительную таблицу, где на каждого участника будет 17*60= 1020 записей ?
(17 графиков по 60 значений в каждом).

Итого, для 300 тыс. участников в таблице будет 300 тыс.* 1020 = 306 000 000 (306 миллионов записей)

Я правильно понял ?
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909699
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 S.G.:
а у этого запроса есть план выполнения, или как оно там называется в mssql-e?

Конкретно этот запрос имеет мало значения. Он слишком прост.
Меня интересует время выборки для таких простыз запросов.
Если такой примитив даёт задержку в 2-3 секунды, то рассматривать что-либо сложнее я не вижу смысла.

Вот, например stored proc, выводящая участников на экран по 100 штук:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
-- for aspx page ~/stats/UserStats.aspx

ALTER PROCEDURE [dbo].[GetUsers]
	@page_index int

AS
    SET NOCOUNT ON
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

declare @pr_name varchar(50)
select @pr_name=pr_name from Project

declare @start_rank int
set @start_rank = @page_index*100

SELECT top(100)
@pr_name as pr_name,
u.project_rank,
u.id,
u.teamid,
u.cpid,
u.project_rank_month, 
u.project_rank_week, 
u.project_rank_day, 
u.[name],
u.total_credit,
u.credit_day,
u.credit_week,
u.credit_month,
FLOOR(ROUND(u.expavg_credit,0)) as expavg_credit,
t.name as team_name,
t.cpid as team_cpid,
c.id as countryid,
c.name as country,
c.flag
FROM Users u
left outer join Countries c on (u.countryid=c.id)
left outer join Teams t on (u.teamid=t.id)

where u.project_rank>@start_rank
order by u.project_rank



Выполняется быстро, поскольку постраничный вывод для листания в GridView.
Но я ещё раз говорю, это пока рано рассматривать и анализировать.
*****
Завершилась загрузка пустой базы(console log):

>ProjectStatsDownloader.exe
Download stats started 08 Aug 2012 15:57:39.
Einstein@Home: началась загрузка данных.
Einstein@Home: запущено 17 нитей добавления 324562 участников в таблицу Users
Einstein@Home: запущено 67 нитей добавления 2668084 компьютеров в таблицу Hosts
Einstein@Home: запущено 3 нитей добавления 10358 команд в таблицу Teams
Einstein@Home: ожидаем обновление участников, команд и компьютеров.
Einstein@Home: обновление команд завершено за 21 минут 54 секунд.
Einstein@Home: обновление участников завершено за 48 минут 5 секунд.
Einstein@Home: обновление компьютеров завершено за 1 часов 25 минут 36 секунд.
Einstein@Home: вычисление рангов команд и число участников в них завершено за 22 секунд.
Einstein@Home: вычисление рангов участников завершено за 9 минут 16 секунд.
Einstein@Home: вычисление рангов участников в команде и в стране завершено за 31 минут 39 секунд.
Einstein@Home: вычисление рангов компьютеров завершено за 1 часов 14 минут 28 секунд.
Einstein@Home: Вычисление рангов стран завершено за 3 минут 31 секунд.
Einstein@Home: таблица Project обновлена.
Einstein@Home: Обновление завершено за 3 часов 25 минут 37 секунд.
Загрузка и обновление проектов завершена. Продолжительность: 3 часов 25 минут 37 секунд.
>

Размер базы из-за компрессии графиков уменьшился с 48 до 24 GB MB. Уже на много лучше.

Однако продолжительность в 3 часов 25 минут 37 секунд. .. как-то не очень. :(
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909708
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValИтого, для 300 тыс. участников в таблице будет 300 тыс.* 1020 = 306 000 000
(306 миллионов записей)

Я правильно понял ?
Да. Сейчас у тебя те же миллионы записей запиханы в формат, который делает добавление и
удаление значений очень медленным.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909709
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivИндексы могут сканироваться в любую сторону.
Тогда откуда 3 секунды на индексную выборку десяти записей?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909769
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Конкретно этот запрос имеет мало значения. Он слишком прост.
> Меня интересует время выборки для таких простыз запросов.

Понятия "такие простые запросы" не существует.
Каждый запрос конкретен, выполняется на конкретных данных и обладает
конкретной производительностью, обобщать тут не имеет никакого смысла.

> Если такой примитив даёт задержку в 2-3 секунды, то рассматривать что-либо
> сложнее я не вижу смысла.

А с чего ты взял, что это примитивный запрос ?



Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909771
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 08/08/2012 08:26 PM, SerVal wrote:

> CREATE TABLE dbo.Users(

> -- графики --
> [total_credit_xml] [varchar](1000) NULL,
> [expavg_credit_xml] [varchar](1000) NULL,
> [credit_day_xml] [varchar](1000) NULL,
> [credit_week_xml] [varchar](1000) NULL,
> [credit_month_xml] [varchar](1000) NULL,
> [project_rank_xml] [varchar](1000) NULL,
> [project_rank_day_xml] [varchar](1000) NULL,
> [project_rank_week_xml] [varchar](1000) NULL,
> [project_rank_month_xml] [varchar](1000) NULL,
> [team_rank_xml] [varchar](1000) NULL,
> [team_rank_day_xml] [varchar](1000) NULL,
> [team_rank_week_xml] [varchar](1000) NULL,
> [team_rank_month_xml] [varchar](1000) NULL,
> [country_rank_xml] [varchar](1000) NULL,
> [country_rank_day_xml] [varchar](1000) NULL,
> [country_rank_week_xml] [varchar](1000) NULL,
> [country_rank_month_xml] [varchar](1000) NULL
> )

Кстати, нарушение 1НФ хоть поздно, но detected. Лучше
поздно, чем никогда.

Так что выноси это всё в отдельную дочернюю таблицу.
О трёх полях.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909773
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 08/09/2012 12:45 AM, Dimitry Sibiryakov wrote:

> Тогда откуда 3 секунды на индексную выборку десяти записей?

Почему обязательно на индексную ?
Я как-то не просёк, что автор уже успел создать индекс нужный.
Или сообщить, что индекс уже был создан ранее.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909784
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Dimitry Sibiryakov :
Dimitry SibiryakovДа. Сейчас у тебя те же миллионы записей запиханы в формат, который делает добавление и
удаление значений очень медленным.
Я почему-то думаю, что insert/delete в 300 миллионнной таблице будет ещё медленнее.
К тому же, получение от SQL сервера varchar(1000) и преобразование в Byte Array делается намного быстрее,
чем выборка 60-ти записей.

А в клиентском запросе будет надо будет присоединять графики из таблицы в 300 миллионов записей( join по user_id).
Признаться, выборка из 300 миллионов записей меня тоже пугает.

2 MasterZiv :
MasterZivА с чего ты взял, что это примитивный запрос ?
Так в этом запросе ничего нету. Отсутствуют join, group by, intersect, distinct, between итд..
В общем выше я привёл пример запроса чуть-чуть посложнее.
*****
Сейчас думаю.. может совсем освободить таблицу Users от графиков ?
Все графики - в таблицу UserXml.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Table UserXml
(
-- идентификатор участника
id int, 
-- его графики
total_credit_xml varchar(1000),
expavg_credit_xml varchar(1000),
credit_day_xml varchar(1000),
...
)



Тогда таблица Users пухнуть не будет. И выборка списка участников из неё ускорится.
А когда надо графики на странице - джойнить участника с его графиками по @id
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909786
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 MasterZiv :
MasterZivКстати, нарушение 1НФ хоть поздно, но detected.
Какое нарушение ? Что такое 1НФ я не знаю.
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909792
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 08/09/2012 02:39 AM, SerVal wrote:

> Какое нарушение ? Что такое 1НФ я не знаю.
Это и так понятно, что не знаешь. Узнавай.
Хотя бы в википедии прочитай "1-ая нормальная форма".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше хранить графики в базе данных ?
    #37909801
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
CREATE TABLE dbo.Users(
> -- графики --
> [total_credit_xml] [varchar](1000) NULL,


MasterZivХотя бы в википедии прочитай "1-ая нормальная форма".

Почитал. И в чём же здесь нарушение ? В том что графики участника в его-же таблице ?
Вообще-то, они являются неотемлемым атрибутом участника. И при перемещении их в друную таблицу они должны быть связаны с участником череp FOREIGN KEY. (теоретически).
...
Рейтинг: 0 / 0
25 сообщений из 96, страница 2 из 4
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как лучше хранить графики в базе данных ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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