Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
tempdb
|
|||
|---|---|---|---|
|
#18+
У меня такая проблема, если кто знает, помогите пожалуйста. У меня большая процедура, в результате выполнения одной части которой получается временная таблица размером 800Mb, так и было задумано, в результирующей таблице 1,7 млн. записей. А потом из этой временной таблицы делается SELECT, и MSSQL начинает долго работать с таблицей на диске, время мсполнения около 2 дней. Что можно сделать, чтобы это дело было побыстрей, процедуру и так уже оптимизировали-оптимизировали. У меня MSSQL Server 7.0, tempdb in ram там не работает, а в машине 512MB мозгов, правда операционка Win98. Если поможет, могу привести и текст процедуры. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2001, 11:29 |
|
||
|
tempdb
|
|||
|---|---|---|---|
|
#18+
А Вы уверены, что еще больше оптимизировать нельзя Может лучше описать подробнее задачу и Ваше решение, может таки найдется более оптимальное? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2001, 11:33 |
|
||
|
tempdb
|
|||
|---|---|---|---|
|
#18+
MSSQL Server7.0 стоит на Win98? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2001, 11:40 |
|
||
|
tempdb
|
|||
|---|---|---|---|
|
#18+
уверен, что оптимизировать еще можно, проста сам я в этом не дока. Да, 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 Если нужны более точные пояснения, что где за какие таблицы, то я дам. Таблицы с кластерным индексом. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2001, 11:46 |
|
||
|
tempdb
|
|||
|---|---|---|---|
|
#18+
Зачем создавать таблицы на винте заново? Не лучше ли обнулять таблицу, созданную первый раз? Хотя выигрыша в производительности намного это не даст. Насчет операционки, мне кажется, стоит подумать. Для игрушек она ничего. Но для серьезной работы... Да и комп у тебя приличный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2001, 12:11 |
|
||
|
tempdb
|
|||
|---|---|---|---|
|
#18+
На полный бред не похоже. Но попытаться пооптимизировать еще можно. Я бы постарался убрать вложенные селекты. Например самый последний запрос можно заменить на: 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 Напишите потом что помогло и насколько. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2001, 12:41 |
|
||
|
tempdb
|
|||
|---|---|---|---|
|
#18+
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 поидее должно воркать выстрее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2001, 12:55 |
|
||
|
tempdb
|
|||
|---|---|---|---|
|
#18+
Так и знал, что 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 это может немножко повысить производительность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2001, 13:06 |
|
||
|
tempdb
|
|||
|---|---|---|---|
|
#18+
>У меня MSSQL Server 7.0, tempdb in ram там не работает Скажите, а что, разве в SQL2000 можно создавать временные таблицы в оперативной памяти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2001, 13:15 |
|
||
|
tempdb
|
|||
|---|---|---|---|
|
#18+
Таблица в 800Мб в 512Мб естественно не лезет. По логике вещей, у Вас наблюдается бешанный свопинг. Можно разделить задачу на некие этапы, что бы обрабатываемый кусок данных умещался в кэше данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2001, 13:18 |
|
||
|
tempdb
|
|||
|---|---|---|---|
|
#18+
2 Genady 1. Как я понимаю заполнение таблицы кодов занимает относительно незначительное время 2. На мой взгляд можно обойтись и без этой таблицы 3. То что Вы предложили будет работать медленней У Предыча как раз это грамотно написано, я бы даже убрал DISTINCT при заполнении #TempTable_CODES_Union если по коду нет индекса. Но повторюсь: если не нужны поля с нулями, эта таблица не нужна. 2 Предыч А кстати: индексы то есть какие на нормальных таблицах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2001, 13:23 |
|
||
|
tempdb
|
|||
|---|---|---|---|
|
#18+
2 SergSuper Да я и не настаиваю. Да, не увидел, что Вы предлагаете от обеих избавиться, ну тогда тем более ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2001, 14:28 |
|
||
|
tempdb
|
|||
|---|---|---|---|
|
#18+
/* --- 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2001, 12:27 |
|
||
|
tempdb
|
|||
|---|---|---|---|
|
#18+
/* --- 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2001, 12:27 |
|
||
|
tempdb
|
|||
|---|---|---|---|
|
#18+
Большое спасибо всем за помощь! В результате я использовал такой код (он выполнялся около 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2001, 12:29 |
|
||
|
tempdb
|
|||
|---|---|---|---|
|
#18+
Т.е. практически без изменений. Думать значит не хотим. Неужели у Вас два дня выбирались только коды? Их же можно было вообще вести в отдельной таблице тогда и выбирались бы они мгновенно. Не говоря уже о том что можно их вообще было не выбирать. Всё-таки советую немного еще подумать, до 2-х минут это должно довестись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2001, 12:53 |
|
||
|
tempdb
|
|||
|---|---|---|---|
|
#18+
С кодами проблем нету. Они выбираются и так довольно быстро. Вся фигня была в последнем фрагменте процедуры. Там грубо говоря для каждой записи просматривались все. Если учесть, что в таблицах до 4 млн. записей - получалось 4*4 млн.... Его я и изменил. А до двух минут думаю довести врядли получится. Да и стоит ли, что бы по одному разу несколько табличек прогнать?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2001, 18:01 |
|
||
|
tempdb
|
|||
|---|---|---|---|
|
#18+
Да, пардон, не заметил. Попробуйте тогда последний запрос еще так, вдруг побыстрее будет 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2001, 18:16 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32006328&tid=1826674]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 370ms |

| 0 / 0 |
