![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как обойти Timeot Expired [D6, MSSQL]
tormoz © (2005-08-11 15:26:00)Здравствуйте. Есть две таблицы: в первой 1550000 записей, во второй 950000. Необходимо выполнить запрос
SELECT pf1.*
FROM pf1 INNER JOIN
pfp ON pf1.SPOL = pfp.S_POL AND pf1.NPOL = pfp.N_POL
Точнее надо в первой таблице изменить значение одного поля, которое будет браться из второй таблицы по соответствию двух полей. Но не то что update, даже просто select не выполняется: пишет Timeout expired. Посоветуйте что-нибудь. Запросы пытаюсь выполнить через SQL Server Enterprise Manager.
Nikolay M. (2005-08-11 16:53:00) [41]
> sniknik © (11.08.05 16:33) [12]
> для изменения одного поля, полное обьеднение... сделай левое.
> не в пример быстрее отработает
А вот я интересуюсь, откуда такая однозначность?
Честно говоря, для меня это вообще до наст. времени неизвестный факт, где-бы подтверждение найти?
Fay (2005-08-11 16:43:00) [42]2 sniknik © (11.08.05 16:38) [15]
1) Вам бы сцнарии для ужастиков писать.
2) left join, конечно, совсем иначе работает, т.к. в общем случае возвращает больше записей. Так? Просто смешно.
3) Предлагаю подождать план запроса.
sniknik (2005-08-11 16:38:00) [43]Fay © (11.08.05 16:35) [13]
ну... данный случай рассматриваем? тогда, представь себе полное декартово обьеденение по этим таблицам (обьемам). представил? а ведь делается полное при иннер а после отсекаются неподходящие.
sniknik (2005-08-11 16:36:00) [44]да, недосмтрел... добавка к запросу
WHERE pfp.S_POL IS NOT NULL
(иначе при переносе в апдейт потреш записи при пустых, ненайденых полях)
Fay (2005-08-11 16:35:00) [45]2 sniknik © (11.08.05 16:33) [12]
>> сделай левое. не в пример быстрее отработает
Слишком категорично. Бывает быстрее, не более того. А бывает не в пример медленнее.
sniknik (2005-08-11 16:33:00) [46]для изменения одного поля, полное обьеднение... сделай левое. не в пример быстрее отработает
SELECT pf1.*
FROM pf1 LEFTJOIN pfp ON pf1.SPOL=pfp.S_POL AND pf1.NPOL=pfp.N_POL
плюс предварительно сделай индексы на полях pf1.SPOL и pf1.NPOL (в принципе на присоеденяемой таблице тоже не помешают... но эти вожнее)
глядиш и вложишся в таймаут. ;о))
а нет, то выполняй в QA там этот параметр можно изменить(может и в EM можно но не знаю как). в QA правой кнопкой мыши на сервере -> scripting options -> connections -> query time aut.
да и просто так, все одно выполняй в QA.
tormoz (2005-08-11 16:32:00) [47]
> Fay © (11.08.05 16:23) [9]
это к чему? так же не работает - висит, делает вид, что выполняется, и - НИЧЕГО...
Fay (2005-08-11 16:24:00) [48]2 tormoz (11.08.05 16:18) [7]
И вАщЕ, давай струкатуру этих таблиц с индексами!
Fay (2005-08-11 16:23:00) [49]2 tormoz (11.08.05 16:18) [7]
set showplan_text on
go
set noexec on
update pf1
set pf1.ndog=pfp.ndog
from pf1,pfp
where (pf1.spol=pfp.s_pol) and (pf1.npol=pfp.n_pol)
Fay (2005-08-11 16:19:00) [50]2 tormoz (11.08.05 16:18) [7]
План запроса не покажешь?
tormoz (2005-08-11 16:18:00) [51]индексы - естественно, а тригеры пока еще не разрабатывал... потом надо будет делать, но не на update.
Fay (2005-08-11 16:17:00) [52]2 tormoz (11.08.05 16:10) [5]
А индексы есть? А триггеры?
tormoz (2005-08-11 16:10:00) [53]так ничего и не работает. сейчас пробую QA, запрос
update pf1
set pf1.ndog=pfp.ndog
from pf1,pfp
where (pf1.spol=pfp.s_pol) and (pf1.npol=pfp.n_pol)
выполняется уже 13 минут... :-(
Nikolay M. (2005-08-11 16:09:00) [54]Думаю, дело не в фетче. Ради эксперимента можно, конечно, поставить SELECT TOP 1 ...., но никто, имхо, в здравом уме не будет обрывать процесс передачи данных. Ко мне не раз приползал миллион записей, когда условие связки для какой-нибудь таблицы упускал - и ничего :)
А вот наличие индексов по связываемым полям и конфигурация сервера - это более актуальные вопросы.
Fay (2005-08-11 16:00:00) [55]2 Nikolay M. © (11.08.05 15:52) [2]
>> Он имеет ввиду, что если селект отваливается по таймауту, то апдейт - тем более.
Представь на секунду, что автор юзает клиентский курсор и ждёт когда к нему вползёт 950000 записей.
Nikolay M. (2005-08-11 15:52:00) [56]
> Fay © (11.08.05 15:37) [1]
Он имеет ввиду, что если селект отваливается по таймауту, то апдейт - тем более.
> пишет Timeout expired
Увеличить? И чем QA не угодил для выполнения запросов?
Fay (2005-08-11 15:37:00) [57]2 tormoz (11.08.05 15:26)
1) CommandTimeout = много.
2) Нафиг тебе SELECT?! Типа такого не прокатит?
update T1 set
T1.Field2 = T2.Field2
from Table1 T1, Table2 T2
where T1.Field1 = T2.Field1