Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Когда использовать временные таблицы?  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
В ХП используется таблица: товары по заказам (4 раза). Как правильно?
1) Сделать временную таблицу
SELECT *
INTO #LV_ReceiptItem
FROM LV_ReceiptItem
WHERE rci_ReceiptID= @rct_ID
(т.е. выбрать 20 строк)
и везде далее в коде использовать её.

2) сделать индекс (некластерный) для rci_ReceiptID и везде в коде использовать LV_ReceiptItem (количество строк постоянно растет)
(и к ней везде добавлять условие WHERE rci_ReceiptID= @rct_ID)

Таблица LV_ReceiptItem участвует в хп во всяких INNER JOIN.

Мне интересно, как в будущем будет быстрее работать?
4 окт 11, 14:31    [11381422]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
trew
Мне интересно, как в будущем будет быстрее работать?

Ну так сравните
У вас же реальные таблицы и выбранный вами способ решения
У остальных только сферический конь в вакуумме
4 окт 11, 14:35    [11381457]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Однозначно сказать нельзя, что будет быстрее. Много факторов.
Если постоянная таблица большая и высоконагруженная, то возможно, что времянка будет быстрее.
4 окт 11, 14:37    [11381479]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
LSV
Однозначно сказать нельзя, что будет быстрее. Много факторов.
Если постоянная таблица большая и высоконагруженная, то возможно, что времянка будет быстрее.
Только сначала в неё придётся долго-долго копировать.
И tempdb интенсивно дёргать.
А нужные индексы-то уже, как предполагается, давно построены...
4 окт 11, 14:45    [11381572]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
В таблицу LV_ReceiptItem добавляют 5тыс. строк в день.

Увлекаться мне созданием временных таблицы в хранимых процедурах или нет?
Во временных таблицах #LV_ReceiptItem (одна решеточка) индексы целесообразно создавать ?

У меня база пустая, поэтому пытаюсь избежать будущих ошибок, в производительности.
4 окт 11, 14:48    [11381593]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
trew
Увлекаться мне созданием временных таблицы в хранимых процедурах или нет?

А вы уже решили, какой план выполнения лучше всего подходт для вашей задачи ?
4 окт 11, 14:53    [11381636]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
iap
А нужные индексы-то уже, как предполагается, давно построены...

согласен, должно быть так :)

Glory
А вы уже решили, какой план выполнения лучше всего подход для вашей задачи ?

Таблицы маленькие, поэтому сложно оценить. А если таблицы маленькие, индексы не всегда используются.

Видно в плане, как идет Table Scan временной таблицы (без всяких индексов). Вот я и задумался.
4 окт 11, 15:01    [11381739]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
trew
Таблицы маленькие, поэтому сложно оценить. А если таблицы маленькие, индексы не всегда используются.

Сложно оценить что - сканировать таблицу или искать по индексу ?
4 окт 11, 15:03    [11381765]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Glory,

Да, к примеру таблица будет через 1год 100мб (индексы 4мб).
Т.е. правильно написать хп с первого раза не получится, нужны таблицы большого размера.

Универсальных советов для этой ситуации нет?
4 окт 11, 15:07    [11381799]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
trew
Glory,

Да, к примеру таблица будет через 1год 100мб (индексы 4мб).

Ну так вопрос и был о том - вы уже решили какой план выполнения подходит для решения вашей задачи
Для вашей задачи выгоднее просканировать 100мб возможно один раз или опять возможно в цикле использовать поиск по индексу из 4мб ?
4 окт 11, 15:10    [11381838]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
HoBTID
Member

Откуда:
Сообщений: 929
trew
В ХП используется таблица: товары по заказам (4 раза). Как правильно?
1) Сделать временную таблицу
SELECT *
INTO #LV_ReceiptItem
FROM LV_ReceiptItem
WHERE rci_ReceiptID= @rct_ID
(т.е. выбрать 20 строк)
и везде далее в коде использовать её.

2) сделать индекс (некластерный) для rci_ReceiptID и везде в коде использовать LV_ReceiptItem (количество строк постоянно растет)
(и к ней везде добавлять условие WHERE rci_ReceiptID= @rct_ID)

Таблица LV_ReceiptItem участвует в хп во всяких INNER JOIN.

Мне интересно, как в будущем будет быстрее работать?

Индекс по rci_ReceiptID Вам придется создавать в любом случае.
Хотя бы для того, чтобы выбрать данные во временную таблицу.

А временная таблица теоретически может пригодиться только если она дальше будет читаться 20 раз подряд.

Вот универсальный ответ, без знания плана запроса и т.д.
4 окт 11, 16:23    [11382715]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Создал две процедуры одинаковые
Различие только в том, что одна хп с временной таблицей другая с условием where (см. выше)
DBCC DROPCLEANBUFFERS

exec ANT_RPT_ListPriema_p 47
DBCC DROPCLEANBUFFERS
go
exec ANT_RPT_ListPriema_p_1 47
Profiler
CPU Reader Duration
31 513 405 ( с временной таблицей)
16 739 222 (таблица с условием where)

На что ориентироваться, загружать работой процессор или жесткий диск? Или где Duration меньше?
4 окт 11, 16:42    [11382979]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
trew
Создал две процедуры одинаковые
Различие только в том, что одна хп с временной таблицей другая с условием where (см. выше)
Выбор зависит от того, сколько всего записей в таблице и насколько сложные условия.

Для конкретно вашего примера наверное лучьше вариант без временной таблицы, но обычно условия более сложные, данных в таблице много, читаемость кода с временной табицей лучьше (не надо копировать 100 строк условий и джойнов во много мест)...

В общем, решения принимаются не в общем, а для конкретного случая.

И самое главное решение вы уже приняли - работать через ХП :-) А код легко поменяете при необходимости.
4 окт 11, 16:48    [11383040]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
Vicont_rtf
Member

Откуда:
Сообщений: 64
Для много милионных таблиц практика показывает - будут быстрее работать временные таблицы если:
1. В 1 хранимке есть обращение к данным долее 2 раз при этом условия выборки различны.
2. в них не более 1% процента записей.
4 окт 11, 17:39    [11383565]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Vicont_rtf
Для много милионных таблиц практика показывает - будут быстрее работать временные таблицы

Пратика показывает, что оптимизатор тоже умеет создавать временные таблицы и индексы для того, чтобы уменьшить число обращений к диску. Просто у оптимизатора не всегда есть время для того, чтобы найти этот самый идеальный план выполнения. В отличии от программиста, у которого этого времени больше
5 окт 11, 09:20    [11385732]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
doyouknowme
Member

Откуда: Московская область
Сообщений: 9
trew
2) сделать индекс (некластерный) для rci_ReceiptID и везде в коде использовать LV_ReceiptItem (количество строк постоянно растет)
(и к ней везде добавлять условие WHERE rci_ReceiptID= @rct_ID)


Сделай кластерный индекс по этому полю.
Вообще эта таблица одна из самых небольших и наименее нагруженных, оптимизацию точно не с нее надо начинать.
5 окт 11, 10:03    [11385927]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
doyouknowme,

автор
Сделай кластерный индекс по этому полю.

А можно ли в таблице
id rci_ReceiptID
1 1
2 1
3 2
4 2
5 2
6 3

сделать по полю rci_ReceiptID кластерный индекс?

По ссылке https://www.sql.ru/articles/mssql/03013101Indexes.shtml#3
В SQL Server кластерный индекс является уникальным индексом по определению. Это означает что все ключи записей должны быть уникальные. Если существуют записи с одинаковыми значениями, SQL Server делает их уникальными, добавляя номера из внутреннего (невидимого снаружи) счетчика.

Получаю такую ошибку
автор
'ab' table
- Unable to create index 'IX_ab_1'.
CREATE UNIQUE INDEX terminated because a duplicate key was found for object name 'dbo.ab' and index name 'IX_ab_1'. The duplicate key value is (1).
The statement has been terminated.


У меня получается сделать только (не уникальный + не кластерный).
5 окт 11, 10:30    [11386130]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
trew
В SQL Server кластерный индекс является уникальным индексом по определению. Это означает что все ключи записей должны быть уникальные

Для кластерного индекса вовсе не нужна уникальность ключей. С чего вы взяли ?
5 окт 11, 10:32    [11386148]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Glory,

Так везде так пишут, например
https://www.sql.ru/blogs/somewheresomehow/943
Кластерный ключ должен быть уникальным, потому, что кластерный ключ (если он существует) используется для поиска во всех некластерных индексах.
5 окт 11, 10:36    [11386179]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
trew
астерный ключ должен быть уникальным, потому, что кластерный ключ (если он существует) используется для поиска во всех некластерных индексах.

Ключ и индекс не есть одно и тоже
5 окт 11, 10:40    [11386196]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104751
use tempdb
go
if object_id('tempdb..#x') is not null drop table #x
go
create table #x(f1 int)
go
CREATE CLUSTERED INDEX index_name1 ON #x (f1)
go
insert #x values(1)
insert #x values(1)
insert #x values(1)
go
select * from #x
go
if object_id('tempdb..#x') is not null drop table #x
5 окт 11, 10:44    [11386220]     Ответить | Цитировать Сообщить модератору
 Re: Когда использовать временные таблицы?  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Glory,

Спасибо за пример, у меня получилось так
CREATE CLUSTERED INDEX [IX_ss] ON [dbo].ab 
([ss] ASC) 
GO
Хотя сортировка ASC по-умолчанию.(т.е. лишний код)

А то, что раньше было сурогатным ключом, сделал так
ALTER TABLE [dbo].[ab] ADD  CONSTRAINT [PK_ab] PRIMARY KEY NONCLUSTERED 
([id] ASC) WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
5 окт 11, 10:55    [11386292]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить