Производительность запроса SELECT

2008-05-03 Пенетрантность Ingwar
Как можно ускорить выполнениезапроса:

SELECT ID FROM TOVARY WHERE NOT ID IN
(SELECT T_ID FROM STORAGE UNION
SELECT T_ID FROM INDETAILS UNION
SELECT T_ID FROM OUTDETAILS)


Индексы по полям T_ID в таблицах STORAGE, INDETAILS, OUTDETAILS
существуют.

Re: ������������������ ������� SELECT

2008-05-03 Пенетрантность Dmitry Lendel

 Как можно ускорить выполнениезапроса:

 SELECT ID FROM TOVARY WHERE NOT ID IN
 (SELECT T_ID FROM STORAGE UNION
 SELECT T_ID FROM INDETAILS UNION
 SELECT T_ID FROM OUTDETAILS)


 Индексы по полям T_ID в таблицах STORAGE, INDETAILS, OUTDETAILS
 существуют.

Это классно. План запроса?
вместо not in лучше not exists Быстрее.
Дмитрий




Re: Производительность запроса SELECT

2008-05-03 Пенетрантность Arkhangelskiy A.G.

Ingwar пишет:

Как можно ускорить выполнениезапроса:

SELECT ID FROM TOVARY WHERE NOT ID IN
(SELECT T_ID FROM STORAGE UNION
SELECT T_ID FROM INDETAILS UNION
SELECT T_ID FROM OUTDETAILS)


Индексы по полям T_ID в таблицах STORAGE, INDETAILS, OUTDETAILS
существуют.

Можно использовать следующий запрос:

Select t.ID,us.T_ID
from TOVARY t
Left Outer Join (SELECT T_ID FROM STORAGE UNION
  SELECT T_ID FROM INDETAILS UNION
  SELECT T_ID FROM OUTDETAILS) us
 on us.T_ID=t.ID
where us.T_ID is null

Он работает много быстрее. Количество чтений равно кол. записей в 
TOVARY+ кол. записей во внутреннем запросе


--
С уважением,
Андрей Германович Архангельский



begin:vcard
fn;quoted-printable:=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9 =D0=93. =D0=90=D1=80=D1=85=D0=B0=D0=BD=
	=D0=B3=D0=B5=D0=BB=D1=8C=D1=81=D0=BA=D0=B8=D0=B9
n;quoted-printable;quoted-printable:=D0=90=D1=80=D1=85=D0=B0=D0=BD=D0=B3=D0=B5=D0=BB=D1=8C=D1=81=D0=BA=D0=B8=D0=
	=B9;=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9 =D0=93.
org;quoted-printable:=D0=97=D0=90=D0=9E =D0=90=D0=97=D0=B5=D1=82 =D0=94=D0=B8=D0=B7=D0=B0=D0=B9=
	=D0=BD
adr;quoted-printable;quoted-printable;dom:;;125047, =D0=9C=D0=BE=D1=81=D0=BA=D0=B2=D0=B0, =D0=B0/=D1=8F 103;=D0=9C=D0=BE=D1=81=D0=BA=D0=B2=D0=B0;;125047
email;internet:[EMAIL PROTECTED]
title;quoted-printable:=D0=93=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9 =D0=B4=
	=D0=B8=D1=80=D0=B5=D0=BA=D1=82=D0=BE=D1=80
tel;cell:+7 495 724-4806
note;quoted-printable:=D0=9F=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=B8=D1=81=D1=82, =D1=80=
	=D0=B0=D0=B7=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=87=D0=B8=D0=BA =D0=91=D0=B0=
	=D0=B7 =D0=94=D0=B0=D0=BD=D0=BD=D1=8B=D1=85.
url:http://www.az-design.ru
version:2.1
end:vcard



Re: Производительность запроса SELECT

2008-05-03 Пенетрантность Ingwar
 Можно использовать следующий запрос:

 Select t.ID,us.T_ID
 from TOVARY t
 Left Outer Join (SELECT T_ID FROM STORAGE UNION
SELECT T_ID FROM INDETAILS UNION
SELECT T_ID FROM OUTDETAILS) us
   on us.T_ID=t.ID
 where us.T_ID is null

 Он работает много быстрее. Количество чтений равно кол. записей в
 TOVARY+ кол. записей во внутреннем запросе

Огромное спасибо!
Разница в скорости выполнения потрясающая: мой запрос выполняется на
используемой БД 1 мин 1 сек, а Ваш - 125 мс ! То есть почти в 500 раз
быстрее.

А в чем причина? Хотелось бы уяснить на будущее.

Не подключается после рестарта классика. Так и должно быть?

2008-05-03 Пенетрантность Олег Короткий
Доброго времени суток.
Имеем: сервер w2k3 SP2, Firebird 2.1.17755 классик, с десяток
подключенных клиентов. Останавливаю сервер через Firebird2Control.cpl,
запускаю снова (клиенты остаются подключенными) - пробую подключиться
- не пускает, говорит, точно не помню, вроде как удаленный хост отверг
запрос на подключение. Как только обрубаю все существующие подключения
(именно подключения, не процессы), сразу подключаюсь - всё ок.
Насколько я понимаю, это неправильно. Или я не прав?

И ещё такой вопросик: на том же сервере периодически случаются
подвисания, т.е. одновременно зависают все клиенты, при этом к базе
подключение проходит, но дальше - ни гу-гу. На сервере начинаю по
одному обрубать коннекты, обрубаю определённый - все отвисают, т.е.
продолжают работать на своём коннекте, т.е. получается, что один
зависший коннект блокирует все остальные, причем происходит это в
самые неподходящие моменты. Ничего, кроме ошибки 10054 в логе
файрберда не нашел. Кто-нибудь сталкивался с подобным? На более раннем
билде (точно уже не скажу, но где-то из района 15ххх-16ххх) такого не
наблюдалось.

Re: Производительность запроса SELECT

2008-05-03 Пенетрантность Alexander A. Venikov


Hello, Arkhangelskiy!
You wrote  on Sat, 03 May 2008 15:07:56 +0400:

AA Можно использовать следующий запрос:
AA Select t.ID,us.T_ID
AA from TOVARY t
AA Left Outer Join (SELECT T_ID FROM STORAGE UNION
AASELECT T_ID FROM INDETAILS UNION
AASELECT T_ID FROM OUTDETAILS) us
AA   on us.T_ID=t.ID
AA where us.T_ID is null
Можно left outer спокойно заменить на inner (можно явно не указывать, 
inner - по умолчанию), что позволит выбросить кляузу where:

Select t.ID,us.T_ID from TOVARY t
Join (SELECT T_ID FROM STORAGE UNION
 SELECT T_ID FROM INDETAILS UNION
 SELECT T_ID FROM OUTDETAILS) us
 on us.T_ID=t.ID
--
Удач
Alexander A. Venikov, Tobolsk, Russia 





Re: Не подключается после рестарта классика. Так и должно быть?

2008-05-03 Пенетрантность Dmitry Yemanov


Олег Короткий wrote:


Имеем: сервер w2k3 SP2, Firebird 2.1.17755 классик, с десяток
подключенных клиентов. Останавливаю сервер через Firebird2Control.cpl,
запускаю снова (клиенты остаются подключенными) - пробую подключиться
- не пускает, говорит, точно не помню, вроде как удаленный хост отверг
запрос на подключение. Как только обрубаю все существующие подключения
(именно подключения, не процессы), сразу подключаюсь - всё ок.
Насколько я понимаю, это неправильно.


Да, это несколько неожиданно. Я наблюдаю такую же фигню и на версии 
2.0.4. После выгрузки листенера TCP-порт все еще остается связан с уже 
несуществующим процессом и новый листенер не может забиндить этот же порт.



И ещё такой вопросик: на том же сервере периодически случаются
подвисания, т.е. одновременно зависают все клиенты, при этом к базе
подключение проходит, но дальше - ни гу-гу. На сервере начинаю по
одному обрубать коннекты, обрубаю определённый - все отвисают, т.е.
продолжают работать на своём коннекте, т.е. получается, что один
зависший коннект блокирует все остальные, причем происходит это в
самые неподходящие моменты.


В оные моменты запускаешь fb_lock_print и смотришь кто кого и на чем 
блокирует.



--
Дмитрий Еманов



Re: Производительность запроса SELECT

2008-05-03 Пенетрантность Arkhangelskiy A.G.

Ingwar пишет:

Можно использовать следующий запрос:

Select t.ID,us.T_ID
from TOVARY t
Left Outer Join (SELECT T_ID FROM STORAGE UNION
   SELECT T_ID FROM INDETAILS UNION
   SELECT T_ID FROM OUTDETAILS) us
  on us.T_ID=t.ID
where us.T_ID is null

Он работает много быстрее. Количество чтений равно кол. записей в
TOVARY+ кол. записей во внутреннем запросе



Огромное спасибо!
Разница в скорости выполнения потрясающая: мой запрос выполняется на
используемой БД 1 мин 1 сек, а Ваш - 125 мс ! То есть почти в 500 раз
быстрее.

А в чем причина? Хотелось бы уяснить на будущее.

Я описание положил здесь:
http://www.az-design.ru/Support/DataBase/SQL/SQL0002.shtml

--
С уважением,
Андрей Германович Архангельский

http://www.az-design.ru
http://www.az-libr.ru
Scape: az-design

begin:vcard
fn;quoted-printable:=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9 =D0=93. =D0=90=D1=80=D1=85=D0=B0=D0=BD=
	=D0=B3=D0=B5=D0=BB=D1=8C=D1=81=D0=BA=D0=B8=D0=B9
n;quoted-printable;quoted-printable:=D0=90=D1=80=D1=85=D0=B0=D0=BD=D0=B3=D0=B5=D0=BB=D1=8C=D1=81=D0=BA=D0=B8=D0=
	=B9;=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9 =D0=93.
org;quoted-printable:=D0=97=D0=90=D0=9E =D0=90=D0=97=D0=B5=D1=82 =D0=94=D0=B8=D0=B7=D0=B0=D0=B9=
	=D0=BD
adr;quoted-printable;quoted-printable;dom:;;125047, =D0=9C=D0=BE=D1=81=D0=BA=D0=B2=D0=B0, =D0=B0/=D1=8F 103;=D0=9C=D0=BE=D1=81=D0=BA=D0=B2=D0=B0;;125047
email;internet:[EMAIL PROTECTED]
title;quoted-printable:=D0=93=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9 =D0=B4=
	=D0=B8=D1=80=D0=B5=D0=BA=D1=82=D0=BE=D1=80
tel;cell:+7 495 724-4806
note;quoted-printable:=D0=9F=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=B8=D1=81=D1=82, =D1=80=
	=D0=B0=D0=B7=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=87=D0=B8=D0=BA =D0=91=D0=B0=
	=D0=B7 =D0=94=D0=B0=D0=BD=D0=BD=D1=8B=D1=85.
url:http://www.az-design.ru
version:2.1
end:vcard



Re: Производительность запроса SELECT

2008-05-03 Пенетрантность Ingwar
Здравствуйте!

 Можно left outer спокойно заменить на inner (можно явно не указывать,
 inner - по умолчанию), что позволит выбросить кляузу where:
 Select t.ID,us.T_ID from TOVARY t
 Join (SELECT T_ID FROM STORAGE UNION
   SELECT T_ID FROM INDETAILS UNION
   SELECT T_ID FROM OUTDETAILS) us
   on us.T_ID=t.ID

У меня такой запрос дает все записи в таблице

Re: Не подключается после рестарта классика. Так и должно быть?

2008-05-03 Пенетрантность Олег Короткий
Да, ещё вдогонку, когда делаю netstat -a -o, то у всех процессов
fb_inet_server.exe PID владельца указывается одинаковый, того
процесса, который убивается при остановке классика.

Re: �� ������������ ����� �������� ��������. ��� � ������ ����?

2008-05-03 Пенетрантность Oleg Matveyev

 îÁÓËÏÌØËÏ Ñ ÐÏÎÉÍÁÀ, ÜÔÏ ÎÅÐÒÁ×ÉÌØÎÏ.

 äÁ, ÜÔÏ ÎÅÓËÏÌØËÏ ÎÅÏÖÉÄÁÎÎÏ. ñ ÎÁÂÌÀÄÁÀ ÔÁËÕÀ ÖÅ ÆÉÇÎÀ É ÎÁ ×ÅÒÓÉÉ 2.0.4. 
 ðÏÓÌÅ ×ÙÇÒÕÚËÉ ÌÉÓÔÅÎÅÒÁ TCP-ÐÏÒÔ ×ÓÅ ÅÝÅ ÏÓÔÁÅÔÓÑ Ó×ÑÚÁÎ Ó ÕÖÅ 
 ÎÅÓÕÝÅÓÔ×ÕÀÝÉÍ ÐÒÏÃÅÓÓÏÍ É ÎÏ×ÙÊ ÌÉÓÔÅÎÅÒ ÎÅ ÍÏÖÅÔ ÚÁÂÉÎÄÉÔØ ÜÔÏÔ ÖÅ ÐÏÒÔ.

õ ÍÅÎÑ ÓÉÔÕÁÃÉÑ ×ÏÓÐÒÏÉÚ×ÏÄÉÌÁÓØ É ÎÁ 2.0.1.12855, ÎÏ ÔÏÌØËÏ ÎÁ 
win2003server. õ ËÏÔÏÒÏÊ ÐÏÑ×ÉÌÁÓØ ÞÕÄÎÁÑ ×ÏÚÍÏÖÎÏÓÔØ ÐÏ ÎÏÍÅÒÕ ÐÏÒÔÁ 
ÕÓÔÁÎÏ×ÉÔØ PID ÞÅÒÅÚ GetExtendedTcpTable.

ðÏÓÌÅ ÏÓÔÁÎÏ×ËÉ ÐÒÏÃÅÓÓÁ ÌÉÓÔÅÎÅÒÁ GetExtendedTcpTable ÐÒÏÄÏÌÖÁÅÔ ÕÓÐÅÛÎÏ 
ÒÁÐÏÒÔÏ×ÁÔØ, ÞÔÏ ×ÓÅ ÓÏËÅÔÙ, ÐÏ ËÏÔÏÒÙÍ ÒÁÂÏÔÁÀÔ ×ÓÅ ÄÅÊÓÔ×ÕÀÝÉÅ ÎÁ ÜÔÏÔ 
ÍÏÍÅÎÔ ÐÒÏÃÅÓÓÙ ËÌÁÓÓÉËÁ - ÏÔËÒÙÔÙ ÎÅÄÅÊÓÔ×ÉÔÅÌØÎÙÍ PID.

íÏÖÅÔ × ÜÔÏÍ ÄÅÌÏ?





Re: Производительность запроса SELECT

2008-05-03 Пенетрантность Tonal


Alexander A. Venikov пишет:
Можно left outer спокойно заменить на inner (можно явно не 
указывать, inner - по умолчанию), что позволит выбросить кляузу where:

Select t.ID,us.T_ID from TOVARY t
Join (SELECT T_ID FROM STORAGE UNION
 SELECT T_ID FROM INDETAILS UNION
 SELECT T_ID FROM OUTDETAILS) us
 on us.T_ID=t.ID
Посмотри внимательно - в изначальном запросе автор выбирал все записи из 
таблицы TOVARY, которые НЕ присутствуют в подзапросе

Твой запрос выбирает все записи, которые присутствуют.

--
Александр Замараев