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

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


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

2008-05-04 Пенетрантность Vlad Khorsun


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

2008-05-04 Пенетрантность Ingwar
Тут мне умные люди подсказали решение- работает еще лучше:

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

2008-05-04 Пенетрантность RUST



Для сравнения: скорость выполнения запросов в моем конкретном случае
1. Мой изначальный ~1 мин
2. Предложенный Архангельским А.Г. ~130 мс
3. Предложенный в етом сообщении  ~20 мс.


Ты еще посчитай общее время фетча всех записей запросов



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

2008-05-04 Пенетрантность WildSery

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

2008-05-04 Пенетрантность Ingwar
 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

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 Пенетрантность 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 раз
быстрее.

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

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: Производительность запроса 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: Производительность запроса 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, которые НЕ присутствуют в подзапросе

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

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