Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Очень медленно работает UPDATE / 25 сообщений из 97, страница 1 из 4
02.04.2014, 08:19:19
    #38602535
JuniorSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
Привет всем!

скажите как лучше всего решить задачу.
В общем нужно обновить в одной таблице одно поле. записей примерно 10.5 млн строк. весь базы 1,2гб (будет еще больше, а обновлять это поле нужно периодически).
Что сам делал. Подключаюсь к базе через ADO. Выполняю следующий запрос
$query = 'UPDATE "Coupons" SET "Active" = 0 WHERE "Code" =' & $sLine, но работает очень медленно :( Примерно 6-7 секунд за одну запись :(
так же пробовал через RecordSet
While Not $adoRs.EOF
$adoRs.Fields("Active").Value = 0
$adoRs.Fields("UpdateData").Value = $DataTimeNow
$adoRs.Update
$adoRs.MoveNext
WEnd
$adoRs.Close

то же самое :(

знатоки подскажите, как лучше реализовать данную задачу. сам уже выбился из сил... если кинете еще и маленький примерчик, очень буду благодарен!
...
Рейтинг: 0 / 0
02.04.2014, 08:58:13
    #38602556
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
JuniorSQL, какой тип поля у Code? По нему есть индекс?
...
Рейтинг: 0 / 0
02.04.2014, 09:05:46
    #38602560
JuniorSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
Тип поля Code VARCHAR(100), индекс имеется.
поле Active тип Integer висит тригер так же индекс.
...
Рейтинг: 0 / 0
02.04.2014, 09:06:37
    #38602562
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
Придется ддл таблицы и план показать.

А потом этот-же запрос в IBE за сколько выполняется?
...
Рейтинг: 0 / 0
02.04.2014, 09:12:21
    #38602567
JuniorSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
DLL:

Код: 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.
53.
CREATE TABLE "Coupons" (
  "CouponId" TID NOT NULL,
  "Code" "TName" NOT NULL,
  "Active" "TBoolean" DEFAULT 1 NOT NULL,
  "CreateDate" "TDatetime",
  "UpdateDate" "TDatetime");


ALTER TABLE "Coupons" ADD CONSTRAINT "PK_Coupons" PRIMARY KEY ("CouponId");


CREATE INDEX "Coupons_IDX1" ON "Coupons"("Code");

CREATE INDEX "Coupons_IDX2" ON "Coupons"("Active");


SET TERM ^ ;

CREATE TRIGGER "Coupons_BI" FOR "Coupons"
ACTIVE BEFORE INSERT
POSITION 0
as
begin
  if (new."CouponId" is null) then
    new."CouponId" = gen_id("GEN_Coupons_ID",1);
end^

SET TERM ; ^

SET TERM ^ ;

CREATE TRIGGER "Coupons_BI1" FOR "Coupons"
ACTIVE BEFORE INSERT
POSITION 1
AS
begin
  new."CreateDate" = current_timestamp;
  new."UpdateDate" = current_timestamp;
end^

SET TERM ; ^

SET TERM ^ ;

CREATE TRIGGER "Coupons_BU0" FOR "Coupons"
ACTIVE BEFORE UPDATE
POSITION 0
AS
begin
  new."UpdateDate" = current_timestamp;
end^

SET TERM ; ^

...
Рейтинг: 0 / 0
02.04.2014, 09:17:33
    #38602574
JuniorSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
А потом этот-же запрос в IBE за сколько выполняется?

Запускал через IBM 2005 for Interbase and Firebird на копии базы.
Тоже очень долго :( не дождался завершения.
...
Рейтинг: 0 / 0
02.04.2014, 09:18:08
    #38602576
JuniorSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
*IBM 2005 = SQLManager 2005
...
Рейтинг: 0 / 0
02.04.2014, 09:22:53
    #38602586
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
JuniorSQL,

Код: sql
1.
CREATE INDEX "Coupons_IDX2" ON "Coupons"("Active");


Смущает меня этот индекс
Он точно нужен???
Попробуй без него
...
Рейтинг: 0 / 0
02.04.2014, 09:24:47
    #38602589
JuniorSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
Пробовал, убирал его.
не помогло... я сразу начал рыть в сторону индекса на поле Active. но без результатно :(
...
Рейтинг: 0 / 0
02.04.2014, 09:25:19
    #38602590
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
JuniorSQL*IBM 2005 = SQLManager 2005
Эм... Я про это ibexpert.com/rus/ibe_sfx.exe
...
Рейтинг: 0 / 0
02.04.2014, 09:34:00
    #38602596
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
JuniorSQL,

что за язык программирования? Версия FB?

по этому коду кажется что нужно обновить одну запись по Code
автор$query = 'UPDATE "Coupons" SET "Active" = 0 WHERE "Code" =' & $sLine
а по этому все записи в таблице Coupons

авторWhile Not $adoRs.EOF
$adoRs.Fields("Active").Value = 0
$adoRs.Fields("UpdateData").Value = $DataTimeNow
$adoRs.Update
$adoRs.MoveNext
WEnd
$adoRs.Close

можно всё таки попонятней озвучить что требуется.
Какова селективность Coupons_IDX1
...
Рейтинг: 0 / 0
02.04.2014, 09:51:44
    #38602610
JuniorSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
авторчто за язык программирования? Версия FB?

подключаюсь через ODBC драйвер. накидал все это дело на AutoIt.
читаю текстовый файл, построчно, значения подставляю в запрос:

Код: autoit
1.
2.
3.
4.
5.
$CountLines = _FileCountLines($PathLoadName & $FileLoadName)
   For $i= 0 To $CountLines Step + 1
	  $count = $count + 1
	  $sLine = FileReadLine($FileLoad)
	  If @error = -1 Then ExitLoop
 	  $query = 'UPDATE "Coupons" SET "Active" = 0 WHERE "Code" =' & $sLine


FB Версия 2.5,


пытаюсь сделать следующее:
в текстовом файле лежат номера разделенные enter'om без пробелов, форматом примерно так:
01234567890
12345678901
23456789012
34567890123
...
их примерно тыс 300.
все это дело я считываю и хочу в базе FB (этим номерам) присвоить значение полю Active = 0

автора по этому все записи в таблице Coupons
я перед этим выбрал Selecto'm нужные мне номера.

З.Ы.без SQL запроса просто считывание строк занимает примерно минуты 2-3.
...
Рейтинг: 0 / 0
02.04.2014, 09:53:35
    #38602612
roadster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
добавить поле NCode типа нумерик или интеджер, заполнить, создать индекс и в where использовать его.
ЗЫ варчар100 с индексом - это сомнительный профит.
...
Рейтинг: 0 / 0
02.04.2014, 09:54:41
    #38602614
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
JuniorSQL, проще будет этот файл загрузить во временную таблицу без индексов и работать с ней посредством stored procedure на сервере, чем обрабатывать построчно (это изврат, имхо).
...
Рейтинг: 0 / 0
02.04.2014, 09:58:04
    #38602617
roadster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
JuniorSQLпытаюсь сделать следующее:
в текстовом файле лежат номера разделенные enter'om без пробелов, форматом примерно так:
01234567890
12345678901
23456789012
34567890123
...
их примерно тыс 300.
все это дело я считываю и хочу в базе FB (этим номерам) присвоить значение полю Active = 0

автора по этому все записи в таблице Coupons
я перед этим выбрал Selecto'm нужные мне номера.

З.Ы.без SQL запроса просто считывание строк занимает примерно минуты 2-3.
пихни все свои номера в отдельную таблицу и сделай
...where "Code" in (select field1 from table1)
...
Рейтинг: 0 / 0
02.04.2014, 09:59:29
    #38602619
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
wadman,

согласен. Мы как-то с Таблоидом проверяли скорость через загрузку в промежуточную GTT, а потом из неё в таблицу, в некоторых случаях скорость существенно возрастала
...
Рейтинг: 0 / 0
02.04.2014, 10:00:54
    #38602622
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
roadster,

только не where "Code" in (select field1 from table1), а через MERGE
...
Рейтинг: 0 / 0
02.04.2014, 10:06:14
    #38602628
roadster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
Симонов Денистолько не where "Code" in (select field1 from table1), а через MERGEчто через мерж? в мачед всё равно как-то надо будет впихнуть селект.
впрочем стоит попробовать и оценить скорость.
хотя не думаю, что мерж будет быстрее простого апдейта.
...
Рейтинг: 0 / 0
02.04.2014, 10:16:18
    #38602645
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
roadster,

MERGE позволит развернуть порядок обхода таблиц.
авторwhere "Code" in (select field1 from table1)
Тем более, что для Code в этом случае индекс не может быть применён, а GTT у нас без индесков
...
Рейтинг: 0 / 0
02.04.2014, 10:23:36
    #38602661
roadster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
Симонов ДенисMERGE позволит развернуть порядок обхода таблиц.в смысле?
Симонов Денисавторwhere "Code" in (select field1 from table1)
Тем более, что для Code в этом случае индекс не может быть применённу про сомнительный профит от индекса на варчар100 я уже писал, но почему не может быть применён?
Симонов Дениса GTT у нас без индескова там всё равно все значения выбирать.
...
Рейтинг: 0 / 0
02.04.2014, 10:31:06
    #38602677
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
roadsterв смысле?
порядок обхода начнётся с GTT. MERGE выполняет RIGHT JOIN с таблицей источником, т.е. она оказывается ведущей.
roadsterну про сомнительный профит от индекса на варчар100 я уже писал
ну здесь я думаю автор от балды воткнул "с запасом". Если подумает, то наверняка выберет приемлемый размер
...
Рейтинг: 0 / 0
02.04.2014, 10:34:39
    #38602683
roadster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
Симонов Дениспорядок обхода начнётся с GTT. MERGE выполняет RIGHT JOIN с таблицей источником, т.е. она оказывается ведущей.ну может так и быстрее будет.
Симонов Денисну здесь я думаю автор от балды воткнул "с запасом". Если подумает, то наверняка выберет приемлемый размерсудя по представленному набору входных данных я бы вообще нумерик выбрал бы.
...
Рейтинг: 0 / 0
02.04.2014, 10:37:30
    #38602688
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
roadster,

NUMBERIC подошёл бы если бы ведущих нулей не было
автор01234567890
хотя если количество символов для вывода всегда одинаково, то можно и NUMERIC хранить а при выводе дополнять нулями слева до нужной длины
...
Рейтинг: 0 / 0
02.04.2014, 10:39:31
    #38602695
roadster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
Симонов ДенисNUMBERIC подошёл бы если бы ведущих нулей не былонадо смотреть логику использования этих данных, собственно от предложения переделать в нумерик меня остановил именно этот первый нолик.
...
Рейтинг: 0 / 0
02.04.2014, 10:44:50
    #38602703
JuniorSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень медленно работает UPDATE
авторзагрузить во временную таблицу

что то типо этого ?

Код: sql
1.
2.
3.
4.
CREATE TABLE TTT(NNN VARCHAR(100) NOT NULL)
BULK INSERT TTT FROM 'C:\file.txt'
WITH (FIRSTROW = 1, ,FIELDTERMINATOR = '\n', ROWTERMINATOR = '\n')
SELECT * FROM TTT
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Очень медленно работает UPDATE / 25 сообщений из 97, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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