Thread: вариации выполнения запроса

вариации выполнения запроса

From
Mihail Nasedkin
Date:
Доброго всем.

В общем речь не о проблеме, а так, может кто обсудит такой случай с
запросом. Сам пока не разобрался.

1.
select ...
from ...
where ...
    and xyz.abc ~ 'а' -- кирилическая буква
;
Результат:
------------------------
1601 запис(ь/и/ей)

Время выполнения: 1,420.021 мсек



2. Теперь совершенно тот же запрос, но
where ...
    and xyz.abc ~ 'и' -- кирилическая буква
;
Результат:
------------------------
1140 запис(ь/и/ей)

Время выполнения: 910.013 мсек


3. Теперь совершенно тот же запрос, но
where ...
    and xyz.abc ~ 'щ' -- кирилическая буква
;
Результат:
------------------------
150 запис(ь/и/ей)

Время выполнения: 1,260.019 мсек


Пояснение. Три запуска одного запроса с разными буквами - существенно
различается соотношение количества строк к времени выполнения.

С чем это может быть связано?

--
---
С уважением,
Михаил Наседкин

Re: [pgsql-ru-general] вариации выполнения запроса

From
Dmitriy Igrishin
Date:
Добрый день, Михаил

Рекомендую начать с этого:
http://www.postgresql.org/docs/9.0/static/sql-explain.html

29 октября 2010 г. 14:02 пользователь Mihail Nasedkin <m.nasedkin@gmail.com> написал:
Доброго всем.

В общем речь не о проблеме, а так, может кто обсудит такой случай с
запросом. Сам пока не разобрался.

1.
select ...
from ...
where ...
       and xyz.abc ~ 'а' -- кирилическая буква
;
Результат:
------------------------
1601 запис(ь/и/ей)

Время выполнения: 1,420.021 мсек



2. Теперь совершенно тот же запрос, но
where ...
       and xyz.abc ~ 'и' -- кирилическая буква
;
Результат:
------------------------
1140 запис(ь/и/ей)

Время выполнения: 910.013 мсек


3. Теперь совершенно тот же запрос, но
where ...
       and xyz.abc ~ 'щ' -- кирилическая буква
;
Результат:
------------------------
150 запис(ь/и/ей)

Время выполнения: 1,260.019 мсек


Пояснение. Три запуска одного запроса с разными буквами - существенно
различается соотношение количества строк к времени выполнения.

С чем это может быть связано?

--
---
С уважением,
Михаил Наседкин

--
Sent via pgsql-ru-general mailing list (pgsql-ru-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-ru-general



--
// Dmitriy.


Re: вариации выполнения запроса

From
"Andrey N. Oktyabrski"
Date:
On 10/29/10 14:02, Mihail Nasedkin wrote:
> Пояснение. Три запуска одного запроса с разными буквами - существенно
> различается соотношение количества строк к времени выполнения.
>
> С чем это может быть связано?
А план запроса посмотреть не пришло в голову? Что там написано?
Подозреваю, что SeqScan. Причём, в таблице сильно больше записей, чем в
результате запроса.

Re: [pgsql-ru-general] вариации выполнения запроса

From
Mihail Nasedkin
Date:
29.10.10, Dmitriy Igrishin<dmitigr@gmail.com> написал(а):
> Добрый день, Михаил
>
> Рекомендую начать с этого:
> http://www.postgresql.org/docs/9.0/static/sql-explain.html
>

Неужели план существенно меняется из-за одной буквы в критерии?
Оптимизатор ловчит?

Пока разбираться со сложным планом не стал.

--
---
С уважением,
Михаил Наседкин

Re: [pgsql-ru-general] вариации выполнения запроса

From
Sergey Konoplev
Date:
Привет,

2010/10/29 Mihail Nasedkin <m.nasedkin@gmail.com>:
> Пояснение. Три запуска одного запроса с разными буквами - существенно
> различается соотношение количества строк к времени выполнения.
>
> С чем это может быть связано?

На время выполнения в основном влияет кол-во записей, по которым
ведётся поиск, а не кол-во найденных записей.

>
> --
> ---
> С уважением,
> Михаил Наседкин
>
> --
> Sent via pgsql-ru-general mailing list (pgsql-ru-general@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-ru-general
>



--
Sergey Konoplev

Blog: http://gray-hemp.blogspot.com /
Linkedin: http://ru.linkedin.com/in/grayhemp /
JID/GTalk: gray.ru@gmail.com / Skype: gray-hemp

Re: [pgsql-ru-general] вариации выполнения запроса

From
Mihail Nasedkin
Date:
29.10.10, Andrey N. Oktyabrski<ano@bestmx.ru> написал(а):
> On 10/29/10 14:02, Mihail Nasedkin wrote:
>> Пояснение. Три запуска одного запроса с разными буквами - существенно
>> различается соотношение количества строк к времени выполнения.
>>
>> С чем это может быть связано?
> А план запроса посмотреть не пришло в голову? Что там написано?
> Подозреваю, что SeqScan. Причём, в таблице сильно больше записей, чем в
> результате запроса.
>

Вы полностью правы - гораздо сильно больше.

--
---
С уважением,
Михаил Наседкин

Re: [pgsql-ru-general] вариации выполнения запроса

From
Mihail Nasedkin
Date:
29.10.10, Sergey Konoplev<gray.ru@gmail.com> написал(а):
> Привет,

>
> На время выполнения в основном влияет кол-во записей, по которым
> ведётся поиск, а не кол-во найденных записей.
>

Поиск во всех трех вариантах ведется по одинаковому количеству записей.

--
---
С уважением,
Михаил Наседкин

Re: [pgsql-ru-general] вариации выполнения запроса

From
Sergey Konoplev
Date:
2010/10/29 Mihail Nasedkin <m.nasedkin@gmail.com>:
> 29.10.10, Sergey Konoplev<gray.ru@gmail.com> написал(а):
>> Привет,
>
>>
>> На время выполнения в основном влияет кол-во записей, по которым
>> ведётся поиск, а не кол-во найденных записей.
>>
>
> Поиск во всех трех вариантах ведется по одинаковому количеству записей.

В этом и дело.

>
> --
> ---
> С уважением,
> Михаил Наседкин
>



--
Sergey Konoplev

Blog: http://gray-hemp.blogspot.com /
Linkedin: http://ru.linkedin.com/in/grayhemp /
JID/GTalk: gray.ru@gmail.com / Skype: gray-hemp

Re: [pgsql-ru-general] вариации выполнения запроса

From
Mihail Nasedkin
Date:
29.10.10, Sergey Konoplev<gray.ru@gmail.com> написал(а):
> 2010/10/29 Mihail Nasedkin <m.nasedkin@gmail.com>:
>> 29.10.10, Sergey Konoplev<gray.ru@gmail.com> написал(а):
>>> Привет,
>>
>>>
>>> На время выполнения в основном влияет кол-во записей, по которым
>>> ведётся поиск, а не кол-во найденных записей.
>>>
>>
>> Поиск во всех трех вариантах ведется по одинаковому количеству записей.
>
> В этом и дело.
>

Так как же? Вы утвердили, что результат зависит ..., я утвердил, что
запрос полностью идентичен, поле и таблица поиска таже и не менялась
между запросами, количество строк одинаково. Теперь вы подтверждаете
мое утверждение, тем самым противоречя первому своему утверждению.


--
---
С уважением,
Михаил Наседкин

Re: [pgsql-ru-general] вариации выполнения запроса

From
Mihail Nasedkin
Date:
Все же глянул план - полностью идентичен во всех трех вариантах!

--
---
С уважением,
Михаил Наседкин

Re: [pgsql-ru-general] вариации выполнения запроса

From
Mihail Nasedkin
Date:
Что меня мучает - чем одна буква "лучше" другой в запросе по колонке текста.

29.10.10, Mihail Nasedkin<m.nasedkin@gmail.com> написал(а):
> Все же глянул план - полностью идентичен во всех трех вариантах!
>
> --
> ---
> С уважением,
> Михаил Наседкин
>


--
---
С уважением,
Михаил Наседкин

2010/10/29 Mihail Nasedkin <m.nasedkin@gmail.com>:
> Все же глянул план - полностью идентичен во всех трех вариантах!

Хорошо, давайте упростим задачу. Есть массив из 100 элементов, 97 букв
"а" и 3 буквы "и". Чтобы найти буквы "а" надо пройти по всему массиву,
чтобы найти буквы "и" надо тоже пройти по всему массиву. Кол-во
итераций одинаковое в обоих случаях не смотря на то, что букв "а" 97,
а "и" всего 3.

>
> --
> ---
> С уважением,
> Михаил Наседкин
>
> --
> Sent via pgsql-ru-general mailing list (pgsql-ru-general@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-ru-general
>



--
Sergey Konoplev

Blog: http://gray-hemp.blogspot.com /
Linkedin: http://ru.linkedin.com/in/grayhemp /
JID/GTalk: gray.ru@gmail.com / Skype: gray-hemp

Михаил,

А Вы запустите тестовый сценарий, который выполнит для каждой искомой
буквы не под одному запросу, а скажем, по 100, и сосчитайте среднее время.
Полагаю, что оно будет примерно одинаковым, если происходит перебор
всех записей таблицы.

29 октября 2010 г. 14:35 пользователь Mihail Nasedkin <m.nasedkin@gmail.com> написал:
Что меня мучает - чем одна буква "лучше" другой в запросе по колонке текста.

29.10.10, Mihail Nasedkin<m.nasedkin@gmail.com> написал(а):
> Все же глянул план - полностью идентичен во всех трех вариантах!
>
> --
> ---
> С уважением,
> Михаил Наседкин
>


--
---
С уважением,
Михаил Наседкин

--
Sent via pgsql-ru-general mailing list (pgsql-ru-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-ru-general



--
// Dmitriy.


Re: [pgsql-ru-general] вариации выполнения запроса

From
Mihail Nasedkin
Date:
Еще смотрю, что селективность буквы 'щ' выше в простом запросе на одну
таблицу, чем буквы 'и', что естественно для нормального текста:

88 запис(ь/и/ей)
Время выполнения: 10.000 мсек

Против

2348 запис(ь/и/ей)
Время выполнения: 600.009 мсек

Не разобрался :( ....

--
---
С уважением,
Михаил Наседкин

29.10.10, Dmitriy Igrishin<dmitigr@gmail.com> написал(а):
> Михаил,
>
> А Вы запустите тестовый сценарий, который выполнит для каждой искомой
> буквы не под одному запросу, а скажем, по 100, и сосчитайте среднее время.
> Полагаю, что оно будет примерно одинаковым, если происходит перебор
> всех записей таблицы.

Я уже 1000 раз запустил, естественно все записи на seqscan.
Результат стабильный.

Куда еще? Повторяю - это не проблема, но хотелось докопаться.

Всем промежуточное спасибо.

--
---
С уважением,
Михаил Наседкин

Поясните, Вы запустили 3000 запросов (по 1000 на каждую из 3-х букв),
потом вычислили суммарное время выполнения каждой тысячи запросов,
разделили эти три суммы на 1000 по отдельности, и, очевиден сильный
разброс значений?

29 октября 2010 г. 14:46 пользователь Mihail Nasedkin <m.nasedkin@gmail.com> написал:
29.10.10, Dmitriy Igrishin<dmitigr@gmail.com> написал(а):
> Михаил,
>
> А Вы запустите тестовый сценарий, который выполнит для каждой искомой
> буквы не под одному запросу, а скажем, по 100, и сосчитайте среднее время.
> Полагаю, что оно будет примерно одинаковым, если происходит перебор
> всех записей таблицы.

Я уже 1000 раз запустил, естественно все записи на seqscan.
Результат стабильный.

Куда еще? Повторяю - это не проблема, но хотелось докопаться.

Всем промежуточное спасибо.

--
---
С уважением,
Михаил Наседкин



--
// Dmitriy.


Re: вариации выполнения запроса

From
"Andrey N. Oktyabrski"
Date:
On 10/29/10 14:14, Mihail Nasedkin wrote:
> 29.10.10, Andrey N. Oktyabrski<ano@bestmx.ru>  написал(а):
>> On 10/29/10 14:02, Mihail Nasedkin wrote:
>>> Пояснение. Три запуска одного запроса с разными буквами - существенно
>>> различается соотношение количества строк к времени выполнения.
>>> С чем это может быть связано?
>> А план запроса посмотреть не пришло в голову? Что там написано?
>> Подозреваю, что SeqScan. Причём, в таблице сильно больше записей, чем в
>> результате запроса.
> Вы полностью правы - гораздо сильно больше.
Поэтому количество найденных записей не сильно влияет на время выдачи
результата.

Re: [pgsql-ru-general] вариации выполнения запроса

From
Mihail Nasedkin
Date:
Я же говорю, что сильно влияет, причем в обратную логике сторону.

--
---
С уважением,
Михаил Наседкин

29.10.10, Dmitriy Igrishin<dmitigr@gmail.com> написал(а):
> Поясните, Вы запустили 3000 запросов (по 1000 на каждую из 3-х букв),
> потом вычислили суммарное время выполнения каждой тысячи запросов,
> разделили эти три суммы на 1000 по отдельности, и, очевиден сильный
> разброс значений?
>

Нет пока только "~1000" всего на три. Мне этого хватает, не уверен,
что вариация выровняется после 5000...Если Вы настаиваете, придется
сделать.

Твердого знака вообще "не дождался", а его практически нет в записях.


--
---
С уважением,
Михаил Наседкин

Теперь другая незадача - независимые тесты на скорость при тысячных
повторностях.

Опять нерадость...

29.10.10, Mihail Nasedkin<m.nasedkin@gmail.com> написал(а):
> 29.10.10, Dmitriy Igrishin<dmitigr@gmail.com> написал(а):
>> Поясните, Вы запустили 3000 запросов (по 1000 на каждую из 3-х букв),
>> потом вычислили суммарное время выполнения каждой тысячи запросов,
>> разделили эти три суммы на 1000 по отдельности, и, очевиден сильный
>> разброс значений?
>>
>
> Нет пока только "~1000" всего на три. Мне этого хватает, не уверен,
> что вариация выровняется после 5000...Если Вы настаиваете, придется
> сделать.
>
> Твердого знака вообще "не дождался", а его практически нет в записях.
>
>
> --
> ---
> С уважением,
> Михаил Наседкин
>


--
---
С уважением,
Михаил Наседкин

Re: вариации выполнения запроса

From
"Andrey N. Oktyabrski"
Date:
On 10/29/10 15:29, Mihail Nasedkin wrote:
> Я же говорю, что сильно влияет, причем в обратную логике сторону.
Разброс максимум в полтора раза, судя по приведённым результатам.

P.S. Вообще, разговор беспредметный, пока не озвучены версия постгреса,
кодировка базы, общее количество записей,
максимальная/минимальная/средняя длина поля и т.п.

Создайте ф-ю:
CREATE OR REPLACE FUNCTION seq_scan_test(a_pattern text)
 RETURNS void
 STABLE
 LANGUAGE plpgsql
AS $f$
DECLARE
  i_ integer;
BEGIN
FOR i_ IN 1..1000 LOOP
  PERFORM * FROM tab WHERE col ~ a_pattern;
END LOOP;
END;
$f$;

заменив предварительно "tab" и "col" на имя таблицы и столбца в
ней, по которому ищете и запустите 3 раза для каждой буквы.

29 октября 2010 г. 15:41 пользователь Mihail Nasedkin <m.nasedkin@gmail.com> написал:
Теперь другая незадача - независимые тесты на скорость при тысячных
повторностях.

Опять нерадость...

29.10.10, Mihail Nasedkin<m.nasedkin@gmail.com> написал(а):
> 29.10.10, Dmitriy Igrishin<dmitigr@gmail.com> написал(а):
>> Поясните, Вы запустили 3000 запросов (по 1000 на каждую из 3-х букв),
>> потом вычислили суммарное время выполнения каждой тысячи запросов,
>> разделили эти три суммы на 1000 по отдельности, и, очевиден сильный
>> разброс значений?
>>
>
> Нет пока только "~1000" всего на три. Мне этого хватает, не уверен,
> что вариация выровняется после 5000...Если Вы настаиваете, придется
> сделать.
>
> Твердого знака вообще "не дождался", а его практически нет в записях.
>
>
> --
> ---
> С уважением,
> Михаил Наседкин
>


--
---
С уважением,
Михаил Наседкин



--
// Dmitriy.


Спасибо Дмитрий за конструктивное предложение. Сейчас запустил, но не
для одной таблицы, всеже для конечного запроса.

Что я должен увидеть после запуска? Пока ничего не видно, выполняется...

--
---
С уважением,
Михаил Наседкин

В функции не хватает промежуточного вывода.

--
---
С уважением,
Михаил Наседкин

Здравствуйте, Mihail.

Вы писали 29 октября 2010 г., 15:35:53:

MN> Твердого знака вообще "не дождался", а его практически нет в записях.
ИМХО.. Ключевая фраза! Буковка "а" наверно быстрее всех находится?

Чем быстрее буковка нашлась в поле записи - тем быстрее ясно что запись
попадает в выборку... и до конца смотреть поле не надо.

--
  Сергей


Предполагалось, что запуск будет таков:
SELECT seq_scan_test('а');
SELECT seq_scan_test('б');
-- и т.д.
Запуск из psql в режиме \timing on. В конце каждого вызова
будет время выполнения ф-ии.

29 октября 2010 г. 16:48 пользователь Mihail Nasedkin <m.nasedkin@gmail.com> написал:
В функции не хватает промежуточного вывода.

--
---
С уважением,
Михаил Наседкин



--
// Dmitriy.


Хмм, возможно. То есть, чем более у буквы мода, тем
больше вероятность встретить ее в каждой записи при
обходе таблицы.

29 октября 2010 г. 17:18 пользователь serg-sale <serg-sale@yandex.ru> написал:
Здравствуйте, Mihail.

Вы писали 29 октября 2010 г., 15:35:53:

MN> Твердого знака вообще "не дождался", а его практически нет в записях.
ИМХО.. Ключевая фраза! Буковка "а" наверно быстрее всех находится?

Чем быстрее буковка нашлась в поле записи - тем быстрее ясно что запись
попадает в выборку... и до конца смотреть поле не надо.

--
 Сергей


--
Sent via pgsql-ru-general mailing list (pgsql-ru-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-ru-general



--
// Dmitriy.


29.10.10, serg-sale<serg-sale@yandex.ru> написал(а):
> Здравствуйте, Mihail.
>
> Вы писали 29 октября 2010 г., 15:35:53:
>
> MN> Твердого знака вообще "не дождался", а его практически нет в записях.
> ИМХО.. Ключевая фраза! Буковка "а" наверно быстрее всех находится?
>
> Чем быстрее буковка нашлась в поле записи - тем быстрее ясно что запись
> попадает в выборку... и до конца смотреть поле не надо.
>
> --
>   Сергей

Похоже на истину. Спасибо большое.


--
---
С уважением,
Михаил Наседкин