powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / tempdb
18 сообщений из 18, страница 1 из 1
tempdb
    #32006142
Предыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня такая проблема, если кто знает, помогите пожалуйста. У меня большая процедура, в результате выполнения одной части которой получается временная таблица размером 800Mb, так и было задумано, в результирующей таблице 1,7 млн. записей. А потом из этой временной таблицы делается SELECT, и MSSQL начинает долго работать с таблицей на диске, время мсполнения около 2 дней. Что можно сделать, чтобы это дело было побыстрей, процедуру и так уже оптимизировали-оптимизировали. У меня MSSQL Server 7.0, tempdb in ram там не работает, а в машине 512MB мозгов, правда операционка Win98. Если поможет, могу привести и текст процедуры. Заранее спасибо.
...
Рейтинг: 0 / 0
tempdb
    #32006145
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А Вы уверены, что еще больше оптимизировать нельзя

Может лучше описать подробнее задачу и Ваше решение, может таки найдется более оптимальное?
...
Рейтинг: 0 / 0
tempdb
    #32006148
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MSSQL Server7.0 стоит на Win98?
...
Рейтинг: 0 / 0
tempdb
    #32006149
Предыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
уверен, что оптимизировать еще можно, проста сам я в этом не дока. Да, MSSQL а Win98, переставить систему просто не хватает времени. Если переставить, то примерно какой прирост производительности возможен, если машина PIII 700Mhz,
512 Ram?

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



/* --- NB !!! Procedure for all warehouses except Nr1. */

Alter Procedure TG_Wh3_GD_Daily_Stock /* change number */
(
@NrWarehouse int = 3 /* change number */

)

As

/* ------------- NB !!! - SmallDateTime format : mm.dd.yy */

CREATE TABLE #TempTable_CODES_Union
(
CODE_GD varchar(10)

)

/* ---------------------------------------------------------- */

INSERT INTO #TempTable_CODES_Union
SELECT DISTINCT AF_Accounts.CODE_GD
FROM AF_Accounts
WHERE AF_Accounts.NS = @NrWarehouse AND (YEAR(AF_Accounts.DATACN)=2000
OR YEAR(AF_Accounts.DATE_DELIV) = 2000)

UNION

SELECT DISTINCT AF_Sales00.CODE_GD
FROM AF_Sales00
WHERE AF_Sales00.NS = @NrWarehouse AND YEAR(AF_Sales00.DATDOC)=2000

UNION

SELECT DISTINCT AF_Transfer.CODE_GD
FROM AF_Transfer
WHERE (AF_Transfer.NS_S = @NrWarehouse OR
AF_Transfer.NS_R = @NrWarehouse) AND YEAR(AF_Transfer.DATDOC)=2000

UNION

SELECT DISTINCT AF_Stock010100.CODE_GD
FROM AF_Stock010100
WHERE AF_Stock010100.NS = @NrWarehouse


/* ---------------------------------------------------------- */

CREATE TABLE #TempTable_Distinct_CODES
(
CODE_GD varchar(10)
PRIMARY KEY CLUSTERED (CODE_GD)
)


/* ---------------------------------------------------------- */

INSERT INTO #TempTable_Distinct_CODES
SELECT DISTINCT CODE_GD
FROM #TempTable_CODES_Union

/* ---------------------------------------------------------- */


CREATE TABLE #TempTable_StockDelta
(
DATDOC smalldatetime,
CODE_GD varchar(10),
QntDelta float

PRIMARY KEY CLUSTERED (DATDOC, CODE_GD)
)


/* ---------------------------------------------------------- */


INSERT INTO #TempTable_StockDelta

SELECT d.Date,
w.CODE_GD,
(
(
ISNULL(
(
SELECT SUM(s.[COUNT])
FROM AF_Stock010100 as s
WHERE s.CODE_GD=w.CODE_GD AND NS=@NrWarehouse AND d.Date='01.01.00'
GROUP BY s.CODE_GD
), 0.00)

)
-
(
ISNULL(
(
SELECT SUM(sl.[COUNT])
FROM AF_Sales00 as sl
WHERE sl.CODE_GD=w.CODE_GD AND sl.DATDOC=d.Date AND NS=@NrWarehouse
GROUP BY sl.CODE_GD
), 0.00)
)
+
(
ISNULL(
(
SELECT SUM(tr.[COUNT])
FROM AF_Transfer as tr
WHERE tr.CODE_GD=w.CODE_GD AND tr.DATDOC=d.Date AND NS_R=@NrWarehouse
GROUP BY tr.CODE_GD
), 0.00)
)
-
(
ISNULL(
(
SELECT SUM(ts.[COUNT])
FROM AF_Transfer as ts
WHERE ts.CODE_GD=w.CODE_GD AND ts.DATDOC=d.Date AND NS_S=@NrWarehouse
GROUP BY ts.CODE_GD
), 0.00)
)


) AS QntDelta

FROM #TempTable_Distinct_CODES AS w, ID_Dates2000 AS d


/* ---------------------------------------------------------- */

/* next fragment creates a new table abd inserts quantity of each
item on stock every day of the year 2000 */


CREATE TABLE TG_Wh3_CurQnt /* change number */
(
DATDOC smalldatetime,
CODE_GD varchar(10),
CurQnt float

PRIMARY KEY CLUSTERED (DATDOC, CODE_GD)
)

/* ---------------------------------------------------------- */


INSERT INTO TG_Wh3_CurQnt /* change number */

SELECT b.DATDOC,
b.CODE_GD,
(
SELECT SUM(a.QntDelta)
FROM #TempTable_StockDelta AS a
WHERE b.CODE_GD=a.CODE_GD AND a.DATDOC<=b.DATDOC
)
AS CurQnt

FROM #TempTable_StockDelta AS b


return


Если нужны более точные пояснения, что где за какие таблицы, то я дам. Таблицы с кластерным индексом. Заранее спасибо.
...
Рейтинг: 0 / 0
tempdb
    #32006154
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Зачем создавать таблицы на винте заново? Не лучше ли обнулять таблицу, созданную первый раз? Хотя выигрыша в производительности намного это не даст.
Насчет операционки, мне кажется, стоит подумать. Для игрушек она ничего. Но для серьезной работы... Да и комп у тебя приличный
...
Рейтинг: 0 / 0
tempdb
    #32006161
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На полный бред не похоже. Но попытаться пооптимизировать еще можно.

Я бы постарался убрать вложенные селекты.
Например самый последний запрос можно заменить на:
SELECT b.DATDOC,
b.CODE_GD,SUM(a.QntDelta)CurQnt
FROM #TempTable_StockDelta AS a, #TempTable_StockDelta AS b
WHERE b.CODE_GD=a.CODE_GD AND a.DATDOC<=b.DATDOC

INSERT INTO #TempTable_StockDelta с длиннющим селектом я бы разбил на несколько частей. Надо завести еще одну временную таблицу такой же структуры, а потом 4 раза вставлять туда примерно так:
INSERT INTO #TempTable_StockDelta_1
SELECT d.Date,
w.CODE_GD,
SUM(s.[COUNT])
FROM AF_Stock010100 as s, #TempTable_Distinct_CODES AS w, ID_Dates2000 AS d
WHERE s.CODE_GD=w.CODE_GD AND NS=@NrWarehouse AND d.Date='01.01.00'
GROUP BY d.Date, w.CODE_GD
остальные 3 вставки сами напишите, про знак не забудьте
в конце уже это всё дело группируется
INSERT INTO #TempTable_StockDelta
SELECT Date, CODE_GD, sum(QntDelta) from #TempTable_StockDelta_1 group by Date, CODE_GD
Может Вам и не понадобяться тогда таблицы #TempTable_CODES ?
если нужны записи с нулевыми полями, то надо в таблицу #TempTable_StockDelta_1 вставить все Date, CODE_GD снулевым значением QntDelta

Напишите потом что помогло и насколько.
...
Рейтинг: 0 / 0
tempdb
    #32006163
UNION помоему очень тяжолый оператор
попробуй изменить это
INSERT INTO #TempTable_CODES_Union
SELECT DISTINCT AF_Accounts.CODE_GD
FROM AF_Accounts
WHERE AF_Accounts.NS = @NrWarehouse AND (YEAR(AF_Accounts.DATACN)=2000
OR YEAR(AF_Accounts.DATE_DELIV) = 2000)

UNION

SELECT DISTINCT AF_Sales00.CODE_GD
FROM AF_Sales00
WHERE AF_Sales00.NS = @NrWarehouse AND YEAR(AF_Sales00.DATDOC)=2000

UNION

SELECT DISTINCT AF_Transfer.CODE_GD
FROM AF_Transfer
WHERE (AF_Transfer.NS_S = @NrWarehouse OR
AF_Transfer.NS_R = @NrWarehouse) AND YEAR(AF_Transfer.DATDOC)=2000

UNION

SELECT DISTINCT AF_Stock010100.CODE_GD
FROM AF_Stock010100
WHERE AF_Stock010100.NS = @NrWarehouse

на

INSERT INTO #TempTable_CODES_Union
SELECT DISTINCT AF_Accounts.CODE_GD
FROM AF_Accounts
WHERE AF_Accounts.NS = @NrWarehouse AND (YEAR(AF_Accounts.DATACN)=2000
OR YEAR(AF_Accounts.DATE_DELIV) = 2000)

INSERT INTO #TempTable_CODES_Union
SELECT DISTINCT AF_Sales00.CODE_GD
FROM AF_Sales00
WHERE AF_Sales00.NS = @NrWarehouse AND YEAR(AF_Sales00.DATDOC)=2000

INSERT INTO #TempTable_CODES_Union
SELECT DISTINCT AF_Transfer.CODE_GD
FROM AF_Transfer
WHERE (AF_Transfer.NS_S = @NrWarehouse OR
AF_Transfer.NS_R = @NrWarehouse) AND YEAR(AF_Transfer.DATDOC)=2000

INSERT INTO #TempTable_CODES_Union
SELECT DISTINCT AF_Stock010100.CODE_GD
FROM AF_Stock010100
WHERE AF_Stock010100.NS = @NrWarehouse

поидее должно воркать выстрее
...
Рейтинг: 0 / 0
tempdb
    #32006164
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так и знал, что SerSuper ответит
Я бы еще не стал бы делать #TempTable_CODES_Union, может я правда ошибаюсь, но мне кажется, что с проверками на существование должно быть быстрее, т. е. я бы #TempTable_Distinct_CODES заполнил так:

INSERT INTO ##TempTable_Distinct_CODES
SELECT AF_Accounts.CODE_GD
FROM AF_Accounts
WHERE AF_Accounts.NS = @NrWarehouse AND (YEAR(AF_Accounts.DATACN)=2000 and not exists(select 1 where code_gd = AF_Accounts.CODE_GD)
group by AF_Accounts.CODE_GD


INSERT INTO ##TempTable_Distinct_CODES
SELECT AF_Accounts.CODE_GD
FROM AF_Accounts
WHERE AF_Accounts.NS = @NrWarehouse AND YEAR(AF_Accounts.DATE_DELIV) = 2000)and not exists(select 1 where code_gd = AF_Accounts.CODE_GD)
group by AF_Accounts.CODE_GD

ну и так далее, лень все переписывать, суть я думаю понятна, как Вы заметили я еще убрал OR это может немножко повысить производительность.
...
Рейтинг: 0 / 0
tempdb
    #32006168
Николай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>У меня MSSQL Server 7.0, tempdb in ram там не работает

Скажите, а что, разве в SQL2000 можно создавать временные таблицы в оперативной памяти?
...
Рейтинг: 0 / 0
tempdb
    #32006171
Фотография Александр Гладченко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблица в 800Мб в 512Мб естественно не лезет. По логике вещей, у Вас наблюдается бешанный свопинг. Можно разделить задачу на некие этапы, что бы обрабатываемый кусок данных умещался в кэше данных.
...
Рейтинг: 0 / 0
tempdb
    #32006172
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Genady

1. Как я понимаю заполнение таблицы кодов занимает относительно незначительное время
2. На мой взгляд можно обойтись и без этой таблицы
3. То что Вы предложили будет работать медленней
У Предыча как раз это грамотно написано, я бы даже убрал DISTINCT при заполнении #TempTable_CODES_Union если по коду нет индекса. Но повторюсь: если не нужны поля с нулями, эта таблица не нужна.

2 Предыч
А кстати: индексы то есть какие на нормальных таблицах?
...
Рейтинг: 0 / 0
tempdb
    #32006179
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SergSuper
Да я и не настаиваю.


Да, не увидел, что Вы предлагаете от обеих избавиться, ну тогда тем более
...
Рейтинг: 0 / 0
tempdb
    #32006269
Предыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
/* --- NB !!! Procedure for all warehouses except Nr1. */

Alter Procedure TG_Wh2_GD_Daily_Stock /* change number */
(
@NrWarehouse int = 2 /* change number */

)

As

/* ------------- NB !!! - SmallDateTime format : mm.dd.yy */


CREATE TABLE #CODES_Union
(
CODE_GD varchar(10)

)

/* ---------------------------------------------------------- */

INSERT INTO #CODES_Union
SELECT DISTINCT AF_Accounts.CODE_GD
FROM AF_Accounts
WHERE AF_Accounts.NS = @NrWarehouse AND (YEAR(AF_Accounts.DATACN)=2000
OR YEAR(AF_Accounts.DATE_DELIV) = 2000)


INSERT INTO #CODES_Union
SELECT DISTINCT AF_Sales00.CODE_GD
FROM AF_Sales00
WHERE AF_Sales00.NS = @NrWarehouse AND YEAR(AF_Sales00.DATDOC)=2000


INSERT INTO #CODES_Union
SELECT DISTINCT AF_Transfer.CODE_GD
FROM AF_Transfer
WHERE (AF_Transfer.NS_S = @NrWarehouse OR
AF_Transfer.NS_R = @NrWarehouse) AND YEAR(AF_Transfer.DATDOC)=2000


INSERT INTO #CODES_Union
SELECT DISTINCT AF_Stock010100.CODE_GD
FROM AF_Stock010100
WHERE AF_Stock010100.NS = @NrWarehouse


/* ---------------------------------------------------------- */

CREATE TABLE #CODES
(
CODE_GD varchar(10)
PRIMARY KEY CLUSTERED (CODE_GD)
)


/* ---------------------------------------------------------- */

INSERT INTO #CODES
SELECT DISTINCT CODE_GD
FROM #CODES_Union

/* ---------------------------------------------------------- */


CREATE TABLE #StockDelta
(
DATDOC smalldatetime,
CODE_GD varchar(10),
QntDelta float

PRIMARY KEY CLUSTERED (DATDOC, CODE_GD)
)


/* ---------------------------------------------------------- */


INSERT INTO #StockDelta

SELECT d.Date,
w.CODE_GD,
(
(
ISNULL(
(
SELECT SUM(s.[COUNT])
FROM AF_Stock010100 as s
WHERE s.CODE_GD=w.CODE_GD AND NS=@NrWarehouse AND d.Date='01.01.00'
GROUP BY s.CODE_GD
), 0.00)

)
-
(
ISNULL(
(
SELECT SUM(sl.[COUNT])
FROM AF_Sales00 as sl
WHERE sl.CODE_GD=w.CODE_GD AND sl.DATDOC=d.Date AND NS=@NrWarehouse
GROUP BY sl.CODE_GD
), 0.00)
)
+
(
ISNULL(
(
SELECT SUM(tr.[COUNT])
FROM AF_Transfer as tr
WHERE tr.CODE_GD=w.CODE_GD AND tr.DATDOC=d.Date AND NS_R=@NrWarehouse
GROUP BY tr.CODE_GD
), 0.00)
)
-
(
ISNULL(
(
SELECT SUM(ts.[COUNT])
FROM AF_Transfer as ts
WHERE ts.CODE_GD=w.CODE_GD AND ts.DATDOC=d.Date AND NS_S=@NrWarehouse
GROUP BY ts.CODE_GD
), 0.00)
)


) AS QntDelta

FROM #CODES AS w, ID_Dates2000 AS d


/* ---------------------------------------------------------- */

/* next fragment creates a new table abd inserts quantity of each
item on stock every day of the year 2000 */


CREATE TABLE TG_Wh2_CurQnt /* change number */
(
DATDOC smalldatetime,
CODE_GD varchar(10),
CurQnt float

PRIMARY KEY CLUSTERED (DATDOC, CODE_GD)
)

/* ---------------------------------------------------------- */


INSERT INTO TG_Wh2_CurQnt /* change number */

SELECT d.[Date] AS DATDOC,
c.CODE_GD,
(
SELECT SUM(a.QntDelta) AS CurQnt
FROM
(
SELECT *
FROM #StockDelta AS s
WHERE c.CODE_GD=s.CODE_GD
) AS a
WHERE a.DATDOC<=d.[Date]
)
AS CurQnt

FROM #Codes AS c, ID_Dates2000 AS d



return
...
Рейтинг: 0 / 0
tempdb
    #32006270
Предыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
/* --- NB !!! Procedure for all warehouses except Nr1. */

Alter Procedure TG_Wh2_GD_Daily_Stock /* change number */
(
@NrWarehouse int = 2 /* change number */

)

As

/* ------------- NB !!! - SmallDateTime format : mm.dd.yy */


CREATE TABLE #CODES_Union
(
CODE_GD varchar(10)

)

/* ---------------------------------------------------------- */

INSERT INTO #CODES_Union
SELECT DISTINCT AF_Accounts.CODE_GD
FROM AF_Accounts
WHERE AF_Accounts.NS = @NrWarehouse AND (YEAR(AF_Accounts.DATACN)=2000
OR YEAR(AF_Accounts.DATE_DELIV) = 2000)


INSERT INTO #CODES_Union
SELECT DISTINCT AF_Sales00.CODE_GD
FROM AF_Sales00
WHERE AF_Sales00.NS = @NrWarehouse AND YEAR(AF_Sales00.DATDOC)=2000


INSERT INTO #CODES_Union
SELECT DISTINCT AF_Transfer.CODE_GD
FROM AF_Transfer
WHERE (AF_Transfer.NS_S = @NrWarehouse OR
AF_Transfer.NS_R = @NrWarehouse) AND YEAR(AF_Transfer.DATDOC)=2000


INSERT INTO #CODES_Union
SELECT DISTINCT AF_Stock010100.CODE_GD
FROM AF_Stock010100
WHERE AF_Stock010100.NS = @NrWarehouse


/* ---------------------------------------------------------- */

CREATE TABLE #CODES
(
CODE_GD varchar(10)
PRIMARY KEY CLUSTERED (CODE_GD)
)


/* ---------------------------------------------------------- */

INSERT INTO #CODES
SELECT DISTINCT CODE_GD
FROM #CODES_Union

/* ---------------------------------------------------------- */


CREATE TABLE #StockDelta
(
DATDOC smalldatetime,
CODE_GD varchar(10),
QntDelta float

PRIMARY KEY CLUSTERED (DATDOC, CODE_GD)
)


/* ---------------------------------------------------------- */


INSERT INTO #StockDelta

SELECT d.Date,
w.CODE_GD,
(
(
ISNULL(
(
SELECT SUM(s.[COUNT])
FROM AF_Stock010100 as s
WHERE s.CODE_GD=w.CODE_GD AND NS=@NrWarehouse AND d.Date='01.01.00'
GROUP BY s.CODE_GD
), 0.00)

)
-
(
ISNULL(
(
SELECT SUM(sl.[COUNT])
FROM AF_Sales00 as sl
WHERE sl.CODE_GD=w.CODE_GD AND sl.DATDOC=d.Date AND NS=@NrWarehouse
GROUP BY sl.CODE_GD
), 0.00)
)
+
(
ISNULL(
(
SELECT SUM(tr.[COUNT])
FROM AF_Transfer as tr
WHERE tr.CODE_GD=w.CODE_GD AND tr.DATDOC=d.Date AND NS_R=@NrWarehouse
GROUP BY tr.CODE_GD
), 0.00)
)
-
(
ISNULL(
(
SELECT SUM(ts.[COUNT])
FROM AF_Transfer as ts
WHERE ts.CODE_GD=w.CODE_GD AND ts.DATDOC=d.Date AND NS_S=@NrWarehouse
GROUP BY ts.CODE_GD
), 0.00)
)


) AS QntDelta

FROM #CODES AS w, ID_Dates2000 AS d


/* ---------------------------------------------------------- */

/* next fragment creates a new table abd inserts quantity of each
item on stock every day of the year 2000 */


CREATE TABLE TG_Wh2_CurQnt /* change number */
(
DATDOC smalldatetime,
CODE_GD varchar(10),
CurQnt float

PRIMARY KEY CLUSTERED (DATDOC, CODE_GD)
)

/* ---------------------------------------------------------- */


INSERT INTO TG_Wh2_CurQnt /* change number */

SELECT d.[Date] AS DATDOC,
c.CODE_GD,
(
SELECT SUM(a.QntDelta) AS CurQnt
FROM
(
SELECT *
FROM #StockDelta AS s
WHERE c.CODE_GD=s.CODE_GD
) AS a
WHERE a.DATDOC<=d.[Date]
)
AS CurQnt

FROM #Codes AS c, ID_Dates2000 AS d



return
...
Рейтинг: 0 / 0
tempdb
    #32006271
Предыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо всем за помощь!
В результате я использовал такой код (он выполнялся около 20 минут):


/* --- NB !!! Procedure for all warehouses except Nr1. */

Alter Procedure TG_Wh2_GD_Daily_Stock /* change number */
(
@NrWarehouse int = 2 /* change number */

)

As

/* ------------- NB !!! - SmallDateTime format : mm.dd.yy */


CREATE TABLE #CODES_Union
(
CODE_GD varchar(10)

)

/* ---------------------------------------------------------- */

INSERT INTO #CODES_Union
SELECT DISTINCT AF_Accounts.CODE_GD
FROM AF_Accounts
WHERE AF_Accounts.NS = @NrWarehouse AND (YEAR(AF_Accounts.DATACN)=2000
OR YEAR(AF_Accounts.DATE_DELIV) = 2000)


INSERT INTO #CODES_Union
SELECT DISTINCT AF_Sales00.CODE_GD
FROM AF_Sales00
WHERE AF_Sales00.NS = @NrWarehouse AND YEAR(AF_Sales00.DATDOC)=2000


INSERT INTO #CODES_Union
SELECT DISTINCT AF_Transfer.CODE_GD
FROM AF_Transfer
WHERE (AF_Transfer.NS_S = @NrWarehouse OR
AF_Transfer.NS_R = @NrWarehouse) AND YEAR(AF_Transfer.DATDOC)=2000


INSERT INTO #CODES_Union
SELECT DISTINCT AF_Stock010100.CODE_GD
FROM AF_Stock010100
WHERE AF_Stock010100.NS = @NrWarehouse


/* ---------------------------------------------------------- */

CREATE TABLE #CODES
(
CODE_GD varchar(10)
PRIMARY KEY CLUSTERED (CODE_GD)
)


/* ---------------------------------------------------------- */

INSERT INTO #CODES
SELECT DISTINCT CODE_GD
FROM #CODES_Union

/* ---------------------------------------------------------- */


CREATE TABLE #StockDelta
(
DATDOC smalldatetime,
CODE_GD varchar(10),
QntDelta float

PRIMARY KEY CLUSTERED (DATDOC, CODE_GD)
)


/* ---------------------------------------------------------- */


INSERT INTO #StockDelta

SELECT d.Date,
w.CODE_GD,
(
(
ISNULL(
(
SELECT SUM(s.[COUNT])
FROM AF_Stock010100 as s
WHERE s.CODE_GD=w.CODE_GD AND NS=@NrWarehouse AND d.Date='01.01.00'
GROUP BY s.CODE_GD
), 0.00)

)
-
(
ISNULL(
(
SELECT SUM(sl.[COUNT])
FROM AF_Sales00 as sl
WHERE sl.CODE_GD=w.CODE_GD AND sl.DATDOC=d.Date AND NS=@NrWarehouse
GROUP BY sl.CODE_GD
), 0.00)
)
+
(
ISNULL(
(
SELECT SUM(tr.[COUNT])
FROM AF_Transfer as tr
WHERE tr.CODE_GD=w.CODE_GD AND tr.DATDOC=d.Date AND NS_R=@NrWarehouse
GROUP BY tr.CODE_GD
), 0.00)
)
-
(
ISNULL(
(
SELECT SUM(ts.[COUNT])
FROM AF_Transfer as ts
WHERE ts.CODE_GD=w.CODE_GD AND ts.DATDOC=d.Date AND NS_S=@NrWarehouse
GROUP BY ts.CODE_GD
), 0.00)
)


) AS QntDelta

FROM #CODES AS w, ID_Dates2000 AS d


/* ---------------------------------------------------------- */

/* next fragment creates a new table abd inserts quantity of each
item on stock every day of the year 2000 */


CREATE TABLE TG_Wh2_CurQnt /* change number */
(
DATDOC smalldatetime,
CODE_GD varchar(10),
CurQnt float

PRIMARY KEY CLUSTERED (DATDOC, CODE_GD)
)

/* ---------------------------------------------------------- */


INSERT INTO TG_Wh2_CurQnt /* change number */

SELECT d.[Date] AS DATDOC,
c.CODE_GD,
(
SELECT SUM(a.QntDelta) AS CurQnt
FROM
(
SELECT *
FROM #StockDelta AS s
WHERE c.CODE_GD=s.CODE_GD
) AS a
WHERE a.DATDOC<=d.[Date]
)
AS CurQnt

FROM #Codes AS c, ID_Dates2000 AS d



return
...
Рейтинг: 0 / 0
tempdb
    #32006278
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. практически без изменений. Думать значит не хотим.
Неужели у Вас два дня выбирались только коды? Их же можно было вообще вести в отдельной таблице тогда и выбирались бы они мгновенно. Не говоря уже о том что можно их вообще было не выбирать.
Всё-таки советую немного еще подумать, до 2-х минут это должно довестись.
...
Рейтинг: 0 / 0
tempdb
    #32006327
Предыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С кодами проблем нету. Они выбираются и так довольно быстро.
Вся фигня была в последнем фрагменте процедуры.
Там грубо говоря для каждой записи просматривались все.
Если учесть, что в таблицах до 4 млн. записей - получалось 4*4 млн....
Его я и изменил.
А до двух минут думаю довести врядли получится.
Да и стоит ли, что бы по одному разу несколько табличек прогнать?..
...
Рейтинг: 0 / 0
tempdb
    #32006328
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, пардон, не заметил.
Попробуйте тогда последний запрос еще так, вдруг побыстрее будет

INSERT INTO TG_Wh2_CurQnt /* change number */
SELECT d.[Date] AS DATDOC, c.CODE_GD, SUM(s.QntDelta) AS CurQnt
FROM #Codes AS c, ID_Dates2000 AS d,#StockDelta AS s
WHERE a.DATDOC<=d.[Date] and c.CODE_GD=s.CODE_GD
group by d.[Date], c.CODE_GD
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / tempdb
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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