Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Долгое выполнение SELECT при частых INSERT / 25 сообщений из 25, страница 1 из 1
05.12.2018, 20:48
    #39743130
UncleFedor32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
Здравствуйте.

Подскажите, пожалуйста, где рыть в следующей ситуации. Имеется база с двумя таблицами. В обе таблицы каждые 5 минут выполняется INSERT нескольких сотен/тысяч позиций. На данный момент в таблицах несколько миллионов позиций. Созданы индексы по ключевым полям. SELECT из обеих таблиц с JOIN по ключевым полям выполняется около 20 минут. При выполнении SELECT возникают блокировки, вероятнее всего из-за INSERT. Подскажите, пожалуйста, как можно добиться быстрого выполненич SELECT. Возможно вопрос детский, т.к. не сталкивался с подобным ситуациям. Заранее благодарен.
...
Рейтинг: 0 / 0
05.12.2018, 20:54
    #39743134
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
UncleFedor32,

Структуру таблиц и запрос покажите.
...
Рейтинг: 0 / 0
05.12.2018, 21:06
    #39743136
UncleFedor32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
PizzaPizza,

Код: 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.
50.
51.
52.
CREATE TABLE board.dbo.board (
  id_board BIGINT IDENTITY
 ,id VARCHAR(64) NULL
 ,url VARCHAR(255) NULL
 ,title VARCHAR(512) NULL
 ,price MONEY NULL
 ,time DATETIME NULL
 ,phone VARCHAR(64) NULL
 ,person VARCHAR(128) NULL
 ,person_type VARCHAR(64) NULL
 ,city VARCHAR(64) NULL
 ,metro VARCHAR(64) NULL
 ,address VARCHAR(255) NULL
 ,description TEXT NULL
 ,nedvigimost_type VARCHAR(64) NULL
 ,source VARCHAR(128) NULL
 ,shape GEOMETRY NULL
 ,parameters VARCHAR(MAX) NULL
 ,vid VARCHAR(255) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

CREATE CLUSTERED INDEX IDX_board
ON board.dbo.board (id_board)
ON [PRIMARY]
GO


CREATE TABLE board.dbo.parameter (
  id_parameter BIGINT IDENTITY
 ,id VARCHAR(64) NULL
 ,name VARCHAR(255) NULL
 ,value VARCHAR(255) NULL
) ON [PRIMARY]
GO

CREATE INDEX IDX_parameter
ON board.dbo.parameter (id)
ON [PRIMARY]
GO


SELECT board.id_board,phone ,'№ '+board.id +'<br>'  ,url ,person_type 
  ,nedvigimost_type,person ,phone  ,nedvijimost_type  ,parameter_per.value ,city +'<br>'+ metro +'<br>'+ address ,price,CONVERT(varchar,time,104) ,person+'<br>'+phone 
 ,' '+title+' <br> ' + CONVERT(varchar(512), description) ,source 
  FROM board.dbo.board board LEFT JOIN 
  board.dbo.parameter parameter_per ON 
        (parameter_per.id=board.id and parameter_per.NAME='Вид' and parameter_per.value='В')
WHERE board.id<>0 AND board.id_board<>0 
  GROUP BY board.id_board,phone ,'№ '+board.id +'<br>' ,url ,person_type  ,nedvigimost_type ,person  ,phone ,nedvigimost_type
 ,parameter_per.value ,city +'<br>'+ metro +'<br>'+ address ,price ,CONVERT(varchar,time,104) ,person+'<br>'+phone
  ,' '+title+' <br> ' + CONVERT(varchar(512), description) ,source 
...
Рейтинг: 0 / 0
05.12.2018, 21:35
    #39743151
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
впервые вижу, чтобы таблицу проектировал человек с подобным раздвоением личности.
вроде знает, что есть varchar(max) ,
и его использует.
а вроде как и не знает, и использует еще и text .
----
но вот человека, который еще и группирует по полю типа текст(даже отконвертировав его),
к серверу не надо подпускать вообще
...
Рейтинг: 0 / 0
05.12.2018, 21:40
    #39743155
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
Yasha123,

да, выражение группировки - просто жесткач даже не для миллионов.
...
Рейтинг: 0 / 0
05.12.2018, 21:44
    #39743156
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
Владислав Колосовда, выражение группировки - просто жесткач даже не для миллионов.
на самом деле, это у него такой DISTINCT
...
Рейтинг: 0 / 0
05.12.2018, 21:57
    #39743161
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
UncleFedor32,

ИМХО тут проблема не в соединении. Даже для нескольких миллионов 20 минут было бы слишком.
Выполните свой запрос без... группировки и посмотрите, сколько времени займет.
...
Рейтинг: 0 / 0
05.12.2018, 21:58
    #39743162
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
UncleFedor32,

на мой взгляд, так может как-то помочь покрывающий индекс

parameter_per.id include (parameter_per.NAME, parameter_per.value)

но из-за интенсивной вставки обслуживание индекса может вызвать еще большие проблемы. Чтобы развязать запись и чтение можете попробовать перевести таблицу в in memory. Однако, это будет иметь свои последствия.

У Вас сильно нагружена tempdb, попробуйте добавить количество файлов по рекомендациям.
...
Рейтинг: 0 / 0
05.12.2018, 22:05
    #39743163
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
UncleFedor32Подскажите, пожалуйста, как можно добиться быстрого выполненич SELECTНикак. Такой запрос быстро выполняться не сможет.

Избавиться от влияния конкурентных insert'ов можно:
- хинтом nolock на таблицы, если допустимы грязные данные.
- включением у БД RCSI, если грязные данные недопустимы.
...
Рейтинг: 0 / 0
05.12.2018, 22:12
    #39743165
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
UncleFedor32,

ЗЫ. А вы действительно поднимаете все "несколько миллионов позиций" с CONVERT(varchar(512), description) ? Это у вас просто обрезается description или у вас не может там быть больше varchar(512) ?
Просто ради интереса, а зачем вам (периодически) выбирать все описания для миллионов позиций ?
...
Рейтинг: 0 / 0
05.12.2018, 22:15
    #39743167
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
PizzaPizza,

попытка сделать витрину для сайта?
...
Рейтинг: 0 / 0
05.12.2018, 22:30
    #39743171
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
Владислав КолосовPizzaPizza,

попытка сделать витрину для сайта?

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

Можно подумать, что это какой то отчет. Но опять же - зачем в отчете текстовые описания позиций. Загадка прям.
...
Рейтинг: 0 / 0
06.12.2018, 01:47
    #39743200
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
PizzaPizza,

Например, это может быть самопальный кэш в приложении, который он обновляет таким образом. В порядке бреда, такскать.
...
Рейтинг: 0 / 0
06.12.2018, 02:18
    #39743207
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
Ennor Tiegael,

все варианты какие то архитектурно сомнительные.

Я б посоветовал UncleFedor32 задать вопрос в разделе Проектирование БД для начала.
Я б сказал даже, что это надо делать asap т.к. "каждые 5 минут выполняется INSERT нескольких сотен/тысяч позиций"
...
Рейтинг: 0 / 0
06.12.2018, 05:55
    #39743216
UncleFedor32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
Yasha123,

Попробую отказаться от типа text. Спасибо.

Yasha123,PizzaPizza

Разумеется сначала использовался distinct. Но с ним запрос выполнялся ещё дольше. Group by применился как искусственный вариант при поиске решения.
...
Рейтинг: 0 / 0
06.12.2018, 06:28
    #39743219
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
UncleFedor32Yasha123,

Попробую отказаться от типа text. Спасибо.

Yasha123,PizzaPizza

Разумеется сначала использовался distinct. Но с ним запрос выполнялся ещё дольше. Group by применился как искусственный вариант при поиске решения.

Distinct применяется для фильтрации уникальных значений. Задайте себе вопрос: откуда у вас дубли по многим полям в таблице и зачем вы их там храните и заставляете сервер проверять каждое! varchar! поле на уникальность и потом ещё по сочетанию полей.

Ваша архитектура при миллионах записей и с такой динамикой наполнения скоро приведет к тому, что элементарные запросы по часу будут выполняться.

Хранение в поле metro VARCHAR(64) значений типа "Алексеевская" означает перерасход памяти, как ЖД так и оперативной и при выборках повышает нагрузку на процессор. В вашей таблице такие поля... все. Начните с азов, почитайте про нормальные формы.
...
Рейтинг: 0 / 0
06.12.2018, 15:01
    #39743548
UncleFedor32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
PizzaPizza,

В таблицах есть другие поля, которых нет в селект и которые не повторяются
...
Рейтинг: 0 / 0
06.12.2018, 15:10
    #39743562
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
UncleFedor32,

значит у Вас данные не по канону и они требуют нормализации.
...
Рейтинг: 0 / 0
06.12.2018, 19:37
    #39743808
UncleFedor32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
Заменил тип text на varchar, пробовал nolock, rcsi, на всякий случай опять попробовал нормальный distinct вместо ненормального group by. Результат тот же.

Ради интереса выполнил select * from board. Запрос выполнялся 6 минут. Результат 2.7 миллионов строк. Такая низкая скорость выполнения запроса без join и where ещё больше настораживает.
...
Рейтинг: 0 / 0
06.12.2018, 19:44
    #39743814
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
UncleFedor32,
"заменил" это как, данные перелил в новую таблицу или просто alter table alter column сделал?
второе вообще ничего не поменяло для имеющихся данных, как лежали в блоб-страницах, так и лежат.

тормознее чтения блобов с диска может быть только их сортировка (хоть gruop by, хоть distinct)
...
Рейтинг: 0 / 0
06.12.2018, 20:18
    #39743841
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
UncleFedor32Ради интереса выполнил select * from board. Запрос выполнялся 6 минут. Результат 2.7 миллионов строк. Такая низкая скорость выполнения запроса без join и where ещё больше настораживает.

Какой у вас размер таблицы в гигабайтах? Если грубо прикинуть у вас минимум 4,3 кб памяти на строку * 2700000 это, если я проснулся уже, = 11 Гб. Вы хотите, что бы база перечитала вам 11 гигов данных и выдала их меньше, чем за 6 минут?

Почитайте уже про нормализацию данных.
...
Рейтинг: 0 / 0
06.12.2018, 21:31
    #39743881
UncleFedor32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
PizzaPizza,

Изначально не нормализовали структуру, т.к. данные абсолютно неоднородны и неклассифицированы. Характер вводимых данных хаотичен, названия полей очень слабо отражают суть данных, которые в них содержатся. Попробую нормализовать, но ожидаю негативный результат. Как сделаю напишу. Спасибо большое.
...
Рейтинг: 0 / 0
06.12.2018, 21:55
    #39743898
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
UncleFedor32PizzaPizza,

Изначально не нормализовали структуру, т.к. данные абсолютно неоднородны и неклассифицированы. Характер вводимых данных хаотичен, названия полей очень слабо отражают суть данных, которые в них содержатся. Попробую нормализовать, но ожидаю негативный результат. Как сделаю напишу. Спасибо большое.

Аксиома "данные абсолютно неоднородны и неклассифицированы" означает, что РБД (в частности ms sql) не подходит для ваших задач вообще.

Реляционная модель данных - это всё только про однородность и классификацию, читай нормализацию. Использовать SQL как строковую помойку для миллионов записей - просто глупо, т.к. оно не заточено для работу с такими данными.
...
Рейтинг: 0 / 0
07.12.2018, 01:10
    #39743943
Glebanski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
UncleFedor32,

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

Непонятно, кстати, кто у вас данные в эту кучу валит. Чья-то чужая аппликуха или ее тоже можно пофиксить?
...
Рейтинг: 0 / 0
07.12.2018, 12:37
    #39744194
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое выполнение SELECT при частых INSERT
UncleFedor32,

для хранения несистематизированных данных используются нереляционные БД, например, текстовые. Там все намного быстрее работает на больших объемах. Обычно в таких базах хранят журналы подключений, web запросов пользователей и другие подобные данные.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Долгое выполнение SELECT при частых INSERT / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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