Re: Производительность запроса SELECT
Hello, Tonal! You wrote on Sun, 04 May 2008 12:56:44 +0700: T Посмотри внимательно - в изначальном запросе автор T выбирал се записи из таблицы TOVARY, которые T НЕ присутствуют в подзапросе Твой запрос выбирает T все записи, которые присутствуют. А, ну да. Сорри. -- Удач Alexander A. Venikov, Tobolsk, Russia
Re: Производительность запроса SELECT
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 LEFT JOIN нужно делать с DISTINCT выборкой из правого множества. В случае Ingwar'а DISTINCT обеспечен UNION'ом, но в общем случае, о котором идёт речь в вышеприведенном описании, это не так. -- Хорсун Влад
Re: Производительность запроса SELECT
Тут мне умные люди подсказали решение- работает еще лучше: SELECT T.ID, T.NAME FROM TOVARY T WHERE NOT EXISTS ( SELECT T_ID FROM STORAGE WHERE T_ID = T.ID UNION ALL SELECT T_ID FROM INDETAILS WHERE T_ID = T.ID UNION ALL SELECT T_ID FROM OUTDETAILS WHERE T_ID = T.ID ) Для сравнения: скорость выполнения запросов в моем конкретном случае 1. Мой изначальный ~1 мин 2. Предложенный Архангельским А.Г. ~130 мс 3. Предложенный в етом сообщении ~20 мс.
Re: Производительность запроса SELECT
Для сравнения: скорость выполнения запросов в моем конкретном случае 1. Мой изначальный ~1 мин 2. Предложенный Архангельским А.Г. ~130 мс 3. Предложенный в етом сообщении ~20 мс. Ты еще посчитай общее время фетча всех записей запросов
Re: Производительность запроса SELECT
On Sun, 04 May 2008 15:19:42 +0400, Ingwar [EMAIL PROTECTED] wrote: Для сравнения: FetchAll делаешь, или до получения первой записи? Кроме того, попробуй ещё такой вариант: WHERE NOT EXISTS (SELECT T_ID FROM STORAGE WHERE T_ID = T.ID) AND NOT EXISTS (SELECT T_ID FROM INDETAILS WHERE T_ID = T.ID) AND NOT EXISTS (SELECT T_ID FROM OUTDETAILS WHERE T_ID = T.ID) Птицеводы меня поправят, есть ли какое существенное отличие в алгоритме работы сервера в таком варианте от варианта с UNION ALL, но мне кажется, тут ещё и неполная проверка булевых выражений должна дать свой бонус. -- Сергей Смирнов.
Re: Производительность запроса SELECT
FetchAll делаешь, или до получения первой записи? FetchAll Кроме того, попробуй ещё такой вариант: WHERE NOT EXISTS (SELECT T_ID FROM STORAGE WHERE T_ID = T.ID) AND NOT EXISTS (SELECT T_ID FROM INDETAILS WHERE T_ID = T.ID) AND NOT EXISTS (SELECT T_ID FROM OUTDETAILS WHERE T_ID = T.ID) Да, такой вариант работает также хорошо как и предыдущий. Если судить по времени выполнения, то предыдущий иногда даже быстрее работает (в моем конкретном случае).
Производительность запроса 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
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 раз быстрее. А в чем причина? Хотелось бы уяснить на будущее.
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: Производительность запроса 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: Производительность запроса 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, которые НЕ присутствуют в подзапросе Твой запрос выбирает все записи, которые присутствуют. -- Александр Замараев