Производительность запроса SELECT
Как можно ускорить выполнениезапроса: 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
Как можно ускорить выполнениезапроса: 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
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
Можно использовать следующий запрос: 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 раз быстрее. А в чем причина? Хотелось бы уяснить на будущее.
Не подключается после рестарта классика. Так и должно быть?
Доброго времени суток. Имеем: сервер w2k3 SP2, Firebird 2.1.17755 классик, с десяток подключенных клиентов. Останавливаю сервер через Firebird2Control.cpl, запускаю снова (клиенты остаются подключенными) - пробую подключиться - не пускает, говорит, точно не помню, вроде как удаленный хост отверг запрос на подключение. Как только обрубаю все существующие подключения (именно подключения, не процессы), сразу подключаюсь - всё ок. Насколько я понимаю, это неправильно. Или я не прав? И ещё такой вопросик: на том же сервере периодически случаются подвисания, т.е. одновременно зависают все клиенты, при этом к базе подключение проходит, но дальше - ни гу-гу. На сервере начинаю по одному обрубать коннекты, обрубаю определённый - все отвисают, т.е. продолжают работать на своём коннекте, т.е. получается, что один зависший коннект блокирует все остальные, причем происходит это в самые неподходящие моменты. Ничего, кроме ошибки 10054 в логе файрберда не нашел. Кто-нибудь сталкивался с подобным? На более раннем билде (точно уже не скажу, но где-то из района 15ххх-16ххх) такого не наблюдалось.
Re: Производительность запроса SELECT
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: Не подключается после рестарта классика. Так и должно быть?
Олег Короткий wrote: Имеем: сервер w2k3 SP2, Firebird 2.1.17755 классик, с десяток подключенных клиентов. Останавливаю сервер через Firebird2Control.cpl, запускаю снова (клиенты остаются подключенными) - пробую подключиться - не пускает, говорит, точно не помню, вроде как удаленный хост отверг запрос на подключение. Как только обрубаю все существующие подключения (именно подключения, не процессы), сразу подключаюсь - всё ок. Насколько я понимаю, это неправильно. Да, это несколько неожиданно. Я наблюдаю такую же фигню и на версии 2.0.4. После выгрузки листенера TCP-порт все еще остается связан с уже несуществующим процессом и новый листенер не может забиндить этот же порт. И ещё такой вопросик: на том же сервере периодически случаются подвисания, т.е. одновременно зависают все клиенты, при этом к базе подключение проходит, но дальше - ни гу-гу. На сервере начинаю по одному обрубать коннекты, обрубаю определённый - все отвисают, т.е. продолжают работать на своём коннекте, т.е. получается, что один зависший коннект блокирует все остальные, причем происходит это в самые неподходящие моменты. В оные моменты запускаешь fb_lock_print и смотришь кто кого и на чем блокирует. -- Дмитрий Еманов
Re: Производительность запроса SELECT
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
Здравствуйте! Можно 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: Не подключается после рестарта классика. Так и должно быть?
Да, ещё вдогонку, когда делаю netstat -a -o, то у всех процессов fb_inet_server.exe PID владельца указывается одинаковый, того процесса, который убивается при остановке классика.
Re: �� ������������ ����� �������� ��������. ��� � ������ ����?
îÁÓËÏÌØËÏ Ñ ÐÏÎÉÍÁÀ, ÜÔÏ ÎÅÐÒÁ×ÉÌØÎÏ. äÁ, ÜÔÏ ÎÅÓËÏÌØËÏ ÎÅÏÖÉÄÁÎÎÏ. ñ ÎÁÂÌÀÄÁÀ ÔÁËÕÀ ÖÅ ÆÉÇÎÀ É ÎÁ ×ÅÒÓÉÉ 2.0.4. ðÏÓÌÅ ×ÙÇÒÕÚËÉ ÌÉÓÔÅÎÅÒÁ TCP-ÐÏÒÔ ×ÓÅ ÅÝÅ ÏÓÔÁÅÔÓÑ Ó×ÑÚÁÎ Ó ÕÖÅ ÎÅÓÕÝÅÓÔ×ÕÀÝÉÍ ÐÒÏÃÅÓÓÏÍ É ÎÏ×ÙÊ ÌÉÓÔÅÎÅÒ ÎÅ ÍÏÖÅÔ ÚÁÂÉÎÄÉÔØ ÜÔÏÔ ÖÅ ÐÏÒÔ. õ ÍÅÎÑ ÓÉÔÕÁÃÉÑ ×ÏÓÐÒÏÉÚ×ÏÄÉÌÁÓØ É ÎÁ 2.0.1.12855, ÎÏ ÔÏÌØËÏ ÎÁ win2003server. õ ËÏÔÏÒÏÊ ÐÏÑ×ÉÌÁÓØ ÞÕÄÎÁÑ ×ÏÚÍÏÖÎÏÓÔØ ÐÏ ÎÏÍÅÒÕ ÐÏÒÔÁ ÕÓÔÁÎÏ×ÉÔØ PID ÞÅÒÅÚ GetExtendedTcpTable. ðÏÓÌÅ ÏÓÔÁÎÏ×ËÉ ÐÒÏÃÅÓÓÁ ÌÉÓÔÅÎÅÒÁ GetExtendedTcpTable ÐÒÏÄÏÌÖÁÅÔ ÕÓÐÅÛÎÏ ÒÁÐÏÒÔÏ×ÁÔØ, ÞÔÏ ×ÓÅ ÓÏËÅÔÙ, ÐÏ ËÏÔÏÒÙÍ ÒÁÂÏÔÁÀÔ ×ÓÅ ÄÅÊÓÔ×ÕÀÝÉÅ ÎÁ ÜÔÏÔ ÍÏÍÅÎÔ ÐÒÏÃÅÓÓÙ ËÌÁÓÓÉËÁ - ÏÔËÒÙÔÙ ÎÅÄÅÊÓÔ×ÉÔÅÌØÎÙÍ PID. íÏÖÅÔ × ÜÔÏÍ ÄÅÌÏ?
Re: Производительность запроса SELECT
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, которые НЕ присутствуют в подзапросе Твой запрос выбирает все записи, которые присутствуют. -- Александр Замараев