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

Откуда:
Сообщений: 38
подскажите пожалуйста, как можно оптимизировать такой запрос

SELECT t1.* FROM ( select * from table1 union all select * from table2 ) t1, [Reg_users].[dbo].[table3_76] t2
where t2.pId = 76 and t1.id = t2.id
union all
SELECT * FROM ( select * from table1 union all select * from table2 ]) t3
where t3.id = 76

если в table 1 - более 1 млн записей
а в table 2 - всегда менее 10 тыс записей

на сколько этот запрос повлияет на скорость выполнения операций с ним связанных, если он выполняется 1 раз в секунду

Возможно есть другой способ???
15 фев 12, 17:49    [12097992]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
А это не то же самое, что и
select A.*
  from table1 A
 inner join table3_76 B on A.id = B.id
 where B.pId = 76

union all

select A.*
  from table1 A
 inner join table3_76 B on A.id = B.id
 where B.pId = 76

union all

select *
  from table1
 where id = 76

union all

select *
  from table2
 where id = 76
15 фев 12, 18:00    [12098105]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
iljy
Member

Откуда:
Сообщений: 8711
Aysvel,

наверняка есть. Например - как-нибудь так.
SELECT t1.* FROM (
	select * from table1
		union all
	select * from table2 ) t1 left join [Reg_users].[dbo].[table3_76] t2 
		on t2.pId = 76 and t1.id = t2.id 
where t1.id = 76 or t2.id is not null

А что этот запрос должен делать? Какая структура у таблиц? Индексы? Распределение данных? Или оптимизируем сферического коня в вакууме?
15 фев 12, 18:00    [12098113]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Aysvel
Member

Откуда:
Сообщений: 38
iljy,

2 Таблицы по структуре одинаковые ( 5 столбцов данных)
но так как при частых запросах insert в эту базу - все тормозит, реализовано через временную таблицу запись insert, что увеличивает скорость в разы, позже записи копируются в table1 и удаляются из table2 и процесс повторяется, пока table 1 не заполнится на столько, что уже нечего заполнять, все заполнено
15 фев 12, 18:04    [12098143]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Aysvel
Member

Откуда:
Сообщений: 38
iljy,

также в обеих таблицах индекс по Id,
в таблице table2 - IDENTITY id (поле уникально)
в таблице table1 - int
15 фев 12, 18:05    [12098156]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Aysvel
Member

Откуда:
Сообщений: 38
Зайцев Фёдор,

Ну да, только по скорости чем отличается. Вопрос в том, насколько это будет быстро работать, когда в table1 более 1 млн записей, а в table 2 всегда менее 10 тыс
15 фев 12, 18:06    [12098167]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Aysvel
Member

Откуда:
Сообщений: 38
iljy,

а чем по скорости отличается, так то работает и все верно написно, но сути не меняет здесь
SELECT t1.* FROM (
select * from table1
union all
select * from table2 ) t1
15 фев 12, 18:11    [12098201]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Aysvel
при частых запросах insert в эту базу - все тормозит, реализовано через временную таблицу


а можно это пояснить? каким боком "тормозит"?
15 фев 12, 18:17    [12098250]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
iljy
Member

Откуда:
Сообщений: 8711
Aysvel,

я ниче не понял, но подобные задачи решаются так: сгенерите тестовую таблицу с миллионом (или десятью) записей и оптимизируйте на здоровье.
15 фев 12, 18:19    [12098260]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Aysvel
Member

Откуда:
Сообщений: 38
Crimean,

можно, за 1 секунду (если учитывать только 1 запрос - 1 пользователь, но может быть и например 20 - посути запросы пользователей) времени нужно записать от 10 - до например 150 записей в таблицу table 1, в таком случае каждый из них в сумме формирует задержку записей на количество N секунд, на опыте - это 1 минута!! разделить insert невозможно технически по реализации (например так insert into values (...,...), (...,...) ..... (....,...) , а это значит что приходится выполнять постоянно insert. Через временную таблицу такого эфекта торможения нет, так как записей до 10 тыс может быть, а то и 500 например последних, компиляция происходит мгновенно в таком случае.
15 фев 12, 18:21    [12098283]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Aysvel
Member

Откуда:
Сообщений: 38
iljy,

ну понятно :) только всеравно это можно сделать в рамках 1 пользователя, меня посути. а если 20 пользователей - писать тестовый модуль?? :) вот думал, может кто сталкивался с подобными задачами, и знает как это может повлият на select именно а не на insert
15 фев 12, 18:23    [12098290]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Aysvel
Member

Откуда:
Сообщений: 38
Всем спасибо за советы! Ответ на вопрос - как быстро будет это работать посути никто не знает. Будем писать тест. ) анализировать скорость и пробывать оптимизировать.
15 фев 12, 18:30    [12098343]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
iljy
Member

Откуда:
Сообщений: 8711
Aysvel,

да хоть 50 - какая разница-то?? В цикле на каком-нибудь C# 50 сессий не откроете? И сталкивался - с чем? С таблицами в миллион записей? Да ежедневно, и не в один, а гораздо больше. Вот только оптимизация зависит от очень многих факторов.
15 фев 12, 18:31    [12098353]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Aysvel
Member

Откуда:
Сообщений: 38
iljy,

тест написать не проблема. Вопрос заключался в UNION ALL и стоит ли его использовать в подобной задаче.
15 фев 12, 18:32    [12098367]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
iljy
Member

Откуда:
Сообщений: 8711
Aysvel
iljy,

тест написать не проблема. Вопрос заключался в UNION ALL и стоит ли его использовать в подобной задаче.

Если он дает прирост производительности- то определенно стоит.
15 фев 12, 18:44    [12098440]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Aysvel
Member

Откуда:
Сообщений: 38
iljy,

прирост дает посути то, что insert производится во временную (в тоже время постоянную) таблицу. Спасибо.
15 фев 12, 18:46    [12098446]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Aysvel,

да откуда там задержка берется??
ну 150 записей в секунду и что?
ну лям записей на 1 день и что?
откуда задержки-то??
15 фев 12, 18:47    [12098449]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Aysvel
Member

Откуда:
Сообщений: 38
Crimean,

0,0xx1 сек * N - запросов insert = Z сек, если все N - insert нужно произвести последовательно, а N - от 10 до 200
15 фев 12, 18:49    [12098455]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Aysvel
0,0xx1 сек * N - запросов insert = Z сек, если все N - insert нужно произвести последовательно, а N - от 10 до 200


спасибо, кеп, но где "задержки"? кто кого и почему ждет?
я все еще про "все тормозит" - "термин "всякая херня" не полностью описывает весь спектр нашей продукции"
15 фев 12, 18:53    [12098477]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Aysvel
Member

Откуда:
Сообщений: 38
Crimean,

элементрано Ватсон, попробуйте добавить последовательно 200 записей через insert в таблицу где записей более 5 млн. и посмотрите на задержку во времени, по сравнению с временной таблицей где записи добавляются также в конец, но их не 5 млн, а 1000 тыс
15 фев 12, 18:54    [12098481]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Aysvel,

табличка, 125 583 617 строк, 18 545 448 KB size, max server memory (MB) = 4096, 4 индекса, в том числе и по timestamp
сбацал тестовый батчик:

set nocount on

declare ccc cursor local static read_only for ...
open ccc

declare @dt datetime
set @dt = getdate()

while 1=1 begin

declare @id int
fetch next from ccc into @id
if @@fetch_status <> 0 break

-- print @id
insert into ...

end

select datediff( ms, @dt, getdate())


последовательные запуски дают результаты:

-- 3190
-- 1763
-- 1800
-- 1646
-- 1690

то есть в среднем получается select 2000. / ( 1800. / 1000. ) = 1111 вставок / секунда с 1 потока
обычный тестовый сервер, никаких ssd и прочего
безусловно, если вставки объединять в транзакции - будет еще быстрее, скорее всего на порядок но и так более чем
и что?
15 фев 12, 19:12    [12098559]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
iljy
Member

Откуда:
Сообщений: 8711
Aysvel,

пробую
create table ttt (id int)

insert ttt
select number
from master..spt_values
where type = 'P' and number between 1 and 1000

declare @d datetime2, @cnt int
select @d = SYSDATETIME(), @cnt = 5
while @cnt > 0
begin
	insert ttt
	select number
	from master..spt_values
	where type = 'P' and number between 1 and 200
	set @cnt -=1
end
print DATEDIFF(MCS, @d, SYSDATETIME())


insert ttt
select top(5000000) ROW_NUMBER() over(order by (select 1))
from master..spt_values v1,master..spt_values v2,master..spt_values

select @d = SYSDATETIME(), @cnt = 5
while @cnt > 0
begin
	insert ttt
	select number
	from master..spt_values
	where type = 'P' and number between 1 and 200
	set @cnt -=1
end
print DATEDIFF(MCS, @d, SYSDATETIME())

drop table ttt


Статистически значимой разницы не прослеживается.
15 фев 12, 19:12    [12098562]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Aysvel
Member

Откуда:
Сообщений: 38
структура таблицы:
15 фев 12, 19:17    [12098592]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Aysvel
Member

Откуда:
Сообщений: 38
id int
x varchar(32)
z text
n varchar(90)
r varchar(90)
m int
15 фев 12, 19:18    [12098605]     Ответить | Цитировать Сообщить модератору
 Re: union all 2х таблиц, где 1 имеет более 1 млн записей и растет, 2 - до 10 тыс записей  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Aysvel,

и чо? на 2 примерах показали что даже при дефиците ресурсов нет большой разницы и сделать более 100 вставок в секунду - более чем реально. что где тормозит? вставки? вычитки?
15 фев 12, 19:20    [12098614]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить