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

скажите как лучше всего решить задачу.
В общем нужно обновить в одной таблице одно поле. записей примерно 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
Очень медленно работает UPDATE
    #38602556
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JuniorSQL, какой тип поля у Code? По нему есть индекс?
...
Рейтинг: 0 / 0
Очень медленно работает UPDATE
    #38602560
JuniorSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тип поля Code VARCHAR(100), индекс имеется.
поле Active тип Integer висит тригер так же индекс.
...
Рейтинг: 0 / 0
Очень медленно работает UPDATE
    #38602562
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Придется ддл таблицы и план показать.

А потом этот-же запрос в IBE за сколько выполняется?
...
Рейтинг: 0 / 0
Очень медленно работает UPDATE
    #38602567
JuniorSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Очень медленно работает UPDATE
    #38602574
JuniorSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А потом этот-же запрос в IBE за сколько выполняется?

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

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


Смущает меня этот индекс
Он точно нужен???
Попробуй без него
...
Рейтинг: 0 / 0
Очень медленно работает UPDATE
    #38602589
JuniorSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробовал, убирал его.
не помогло... я сразу начал рыть в сторону индекса на поле Active. но без результатно :(
...
Рейтинг: 0 / 0
Очень медленно работает UPDATE
    #38602590
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JuniorSQL*IBM 2005 = SQLManager 2005
Эм... Я про это ibexpert.com/rus/ibe_sfx.exe
...
Рейтинг: 0 / 0
Очень медленно работает UPDATE
    #38602596
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Очень медленно работает UPDATE
    #38602610
JuniorSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторчто за язык программирования? Версия 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
Очень медленно работает UPDATE
    #38602612
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавить поле NCode типа нумерик или интеджер, заполнить, создать индекс и в where использовать его.
ЗЫ варчар100 с индексом - это сомнительный профит.
...
Рейтинг: 0 / 0
Очень медленно работает UPDATE
    #38602614
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JuniorSQL, проще будет этот файл загрузить во временную таблицу без индексов и работать с ней посредством stored procedure на сервере, чем обрабатывать построчно (это изврат, имхо).
...
Рейтинг: 0 / 0
Очень медленно работает UPDATE
    #38602617
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Очень медленно работает UPDATE
    #38602619
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

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

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

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

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

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

Код: 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
25 сообщений из 97, страница 1 из 4
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Очень медленно работает UPDATE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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