SQL — Блог Валерия Леонтьева https://valera.ws Место публикации личных заметок. Технологии, управление, бизнес, жизнь Mon, 24 Nov 2008 08:32:00 +0000 ru-RU hourly 1 https://wordpress.org/?v=5.6.2 https://valera.ws/wp-content/uploads/2020/02/favicon.png SQL — Блог Валерия Леонтьева https://valera.ws 32 32 Замена SQL_CALC_FOUND_ROWS или подсчет количества записей в PostgreSQL https://valera.ws/2008.07.24~calc-found-rows-in-postgresql/ https://valera.ws/2008.07.24~calc-found-rows-in-postgresql/#comments Thu, 24 Jul 2008 07:59:04 +0000 http://valera.ws/?p=83 Читать далее Замена SQL_CALC_FOUND_ROWS или подсчет количества записей в PostgreSQL ]]> На работе в новом проекте используется СУБД PostgreSQL. Так как до сих пор я работал с MySQL, сейчас приходится изучать и открывать для себя постгри. Первая проблема, которая меня заинтересовала — замена мускулевского SQL_CALC_FOUND_ROWS. Сходу готового решения найти не удалось. На форумах постоянно констатировали, что SQL_CALC_FOUND_ROWS в постгри нет. Некоторые писали, что надо юзать count(*). Но еще из MySQL мне известно, что поиск с count()-запросом работает почти в 2 раза медленнее, чем с SQL_CALC_FOUND_ROWS. Я консультировался у тех, кто пользуется PostgreSQL, день мучал google и в результате получил 4 варианта замены SQL_CALC_FOUND_ROWS в PostgreSQL, один из которых вполне приемлимый по скорости. Итак, сразу представлю те четыре варианта, о которых пойдет речь. Наш целевой запрос ищет в таблице записи, в которых встречается текст adf в поле `text`. Выбираем id 20 записей начиная от 180.000 по порядку и количество найденных всего. Вариант 1. Взят из phpPgAdmin. Я просто заглянул в код этого клиента для PostgreSQL и посмотрел как подсчет сделан у них при просмотре данных таблицы. Используется 2 запроса с подзапросами. Удобство в том, что не надо парсить и менять исходный запрос, чтобы подсчитать количество записей, найденных им.

select count(id) from (select id from testing where text like '%adf%') as sub;
select * from (select id from testing where text like '%adf%') as sub limit 20 offset 180000

Вариант 2. Самый простой вариант, который обычно юзают новички как в MySQL, так и в Postgres и других СУБД. 2 запроса.

select count(id) from testing where text like '%adf%';
select id from testing where text like '%adf%' limit 20 offset 180000

Вариант 3. © max_posedon. Это попытка эмуляции мускулевского SQL_CALC_FOUND_ROWS в Postgres по логике. Правда работает только при сортировке по id (в данном случае). Здесь подставляется id последней записи в выборке, т.е. записи под номером 180.000 + 20.

select * from testing where text like '%adf%' limit 20 offset 180000;
select count(id) from testing where text like '%adf%' and id > 132629;

Вариант 4. По советам пользователей irc.freenode.org, опять же max_posedon‘а, и этого ответа на форуме PostgreSQL, который прятался глубоко в гугле. Используется курсор.

DECLARE curs CURSOR FOR select id from testing where text like '%adf%';
MOVE FORWARD 180000 IN curs;
FETCH 20 FROM curs;
MOVE FORWARD ALL IN curs;

+ фунция PQcmdTuples() API Postgres (или $count = pg_cmdtuples($result); в PHP). Обратите внимание, что все 4 варианта запросов следует выполнять в одной транзакции, тогда они работают быстрее. 4й вариант вовсе не будет работать, если не использовать одну транзакцию: теряется курсор. Теперь о скоростях. Я провел тестирование скорости работы этих четырех вариантов. Вобщем-то тесты подтвердили ожидания. Но отмечу важный факт. Все запросы запускались на конфигурации PostgreSQL по умолчанию, которая не является оптимизированной на производительность. У меня под рукой просто не было оптимизированного сервера. Так что цифры могут немного корректироваться при запуске с «хорошим» конфигом. Однако суть не изменится. Тестовые запуски проводились в PHP по 20 повторов 2 раза на каждый вариант. Доступен php-скрипт, который запускал тесты. Кому интересно, есть полная статистика выборок в Excel™. Здесь опубликую лишь сводную таблицу:

Вар 1 Вар 2 Вар 3 Вар 4
Ср. время (мс) 647,41 648,25 450,64 370,67
Отношение к вар 4 1,75 1,75 1,22

Для сравнения время запросов без использования транзакции:

  • Вар 1: 1204 мс,
  • Вар 2: 689 мс,
  • Вар 3: 560 мс,
  • Вар 4 работает только в пределах транзакции.

Итоги. Самый быстрый вариант 4 с использованием курсора. Его скорость обусловлена тем, что «тяжелый» поисковый запрос выполняется только один раз. Далее проводятся операции с курсором. Аналогично работает и SQL_CALC_FOUND_ROWS в MySQL. На 20% от него отстает вариант 3 — попытка эмуляции SQL_CALC_FOUND_ROWS в PostgreSQL. Варианты 1 и 2 работат примерно с одинаковой скоростью и на 75% (более чем на 2/3!) уступают по скорости запросу с курсором.

]]>
https://valera.ws/2008.07.24~calc-found-rows-in-postgresql/feed/ 2
Рейтинг языков программирования: поиски в Яндексе и вакансии в Беларуси https://valera.ws/2008.03.28~programming-languages-ratings/ https://valera.ws/2008.03.28~programming-languages-ratings/#comments Fri, 28 Mar 2008 09:42:18 +0000 http://valera.ws/2008.03.28~programming-languages-ratings/ Читать далее Рейтинг языков программирования: поиски в Яндексе и вакансии в Беларуси ]]> Решил подойти к вопросу рейтинга языков еще с одной стороны. Собрал небольшую статистику по размещенным вакансиям/резюме на белорусском сайте работы, и статистику количества запросов по данным языкам в Яндексе.

На сайте Praca.by провел поиск вакансий и резюме по ключевым словам. Поиск на jobs.tut.by выдавал какие-то нереально малые цифры, потому пишлось ограничится статистикой с працы. Результаты представлены в таблице.

Вакансии Резюме
Ключевое слово Количетсво Ключевое слово Количество
1 программист 166 1 программист 53
2 Java 95 2 SQL 37
3 SQL 94 3 C++ 36
4 HTML 85 4 Delphi 34
5 JavaScript и JS 68 5 Java 29
6 PHP 48 6 PHP 22
7 C# 37 7 C# 12
8 C++ 33 8 JavaScript и JS 12
9 Delphi 13 9 HTML 9
10 Python 5 10 Ruby 0
11 Ruby 4 11 Python 0
Сравнительная таблица
Ключевое слово Количество вакансий Количество резюме
1 C# 37 12
2 C++ 33 36
3 Delphi 13 34
4 HTML 85 9
5 Java 95 29
6 JavaScript и JS 68 12
7 PHP 48 22
8 Python 5 0
9 Ruby 4 0
10 SQL 94 37
11 программист 166 53

А вот таблица по количеству поисковых запросан на Яндексе за месяц:

Ключевое слово Количество
запросов
php 5 758 454
html 1 892 564
C++ 427 059
C# 427 059
Java 376 318
Delphi 190 121
sql 101 706
javascript 71 217
программист 43 701
js 11 826
Python 7 758
Ruby 5 570

Выводы (кратко). Не забывайте, что статистика рабочих мест касается только Беларуси, а поиска — только рунета.

  1. PHP все еще актуален и в лидерах. В то же врмемя, раз много ищут в яндексе, значит много новичков и чайников им интерисуются.
  2. C# жжот.
  3. HTML ищут много. Профессионалам по HTML искать почти нечего, вывод — студенты, новички все еще атакуют :)
  4. Java-программеры давно поняли, что помощь надо просить у гугла. Тех, кто еще не понял, осталось мало :)
  5. JavaScript солидно отстает по популярности от того же PHP.

Теперь выводы из поиска вакансий/резюме.

  1. Ищут в основном Java-девелоперов. Причем, как спрос, так и предложение (относительно других языков) велики. Специалисты могут выбирать, имеют возможность менять работу в поиске лучших условий и з/п.
  2. С#: спрос в 3 раза превышает предложение. Ищут много, большенство уже нашли себе теплые места и сидят там :) Ждем лета-осени, когда работу начнут искать выпущенные студенты… (тут сказали, что нихера не ждем, потому что распределение и все дела. Ну и ладно, значит не ждем :)
  3. Delphi: мест мало, резюме много. Дельфи знают многие, это популярный язык у чайников. Но серьезные конторы не работают с этой средой.
  4. C++: все хорошо, все на своих местах…
  5. PHP-программистов не хватает. Всех хороших разобрали, плохие никому не нужны. Однако, и спрос, и предложение, меньше традиционных системных языков. Сайт-бум прошел.
  6. Python и Ruby: есть мизерный спрос, предложение нулевое. Эти языки у нас не популярны. Больше как хобби расматриваются.
  7. SQL жив. Правда программировать на нем довольно грустно и сложно (имеется в виду программирование бизнес-логики в хранимых процедурах), потому предложение в 3 раза меньше спроса. Но при этом, в большенстве вакансий ищут не SQL-разработчика, а c++, php, c#, а SQL только прилагается. Это объясняет второе место после Java. А вообще, банки атакуют :)
  8. JavaScript и HTML получили 3-е и 4-е места только потому, что они вечно к чему то прилагаются. В основном к PHP и C#.

Короче говоря, лучше всех живется джаверам: огромный спрос, относительно спроса малое предложение :)

]]>
https://valera.ws/2008.03.28~programming-languages-ratings/feed/ 1
Мартовский рейтинг языков программирования от TIOBE https://valera.ws/2008.03.27~tiobe-march08/ https://valera.ws/2008.03.27~tiobe-march08/#comments Thu, 27 Mar 2008 21:02:58 +0000 http://valera.ws/2008.03.27~tiobe-march08/ Читать далее Мартовский рейтинг языков программирования от TIOBE ]]> Оказывается, есть такая компания TIOBE Software, которая ежемесячно рассчитывает глобальный рейтинг языков программирования. Называется этот рейтинг «TIOBE Programming Community Index». А вот версия этой штуки за март 2008 года.

Рейтинг основан на количестве разработчиков на данных языках по всему миру, количеству различных курсов и производителей, использующих те или иные языки. Для рассчета рейтинга используются популярные западные поисковики Google, MSN, Yahoo!, и YouTube. По-этому, не стоит понимать данный рейтинг, как выбор лучшего языка программирования, или показателя количетсва написанных строк кода на предствеленных языках.

Итак, предствим 20-ку лучших. Позиции с 21 по 50 представлены на сайте-источнике.

Position
Mar 2008
Position
Mar 2007
Delta in Position Programming Language Ratings Mar 2008 Delta Mar 2007 Status

Status обозначает принадлежность языка программирования к группе основных используемых (A) или второстевенных (B). A- означает сдвиг в сторону второстепенных.

Как видно, Java лидирует и за год набрал 2,6% пользователей. За ним идет Си, который не поменял позиции. А вдвоем они держат 35% рынка (если так можно выразиться).

Не совсем понятно поднятие на 2 позиции Visual Basic. Он обогнал PHP, который сумел удержаться. Зато 2 позиции сдал C++. Это падение как раз объеснимо: +1 позиция C# и +3 позиции Delphi немного потеснили C++. Эти 3 языка можно включить в одну группу взаимозаменяемости.

JavaScript, который сейчас, казалось бы, на пике популярности, сдал 3 позиции. Почему? Рискну предположить, что пользователи стали меньше искать по JS в поисковиках за счет появления фрейморков. Программировать на нем стало проще, он стал меньше обсуждаться.

6-ю и 7-ю позиции Perl’а и Python’а мне честно говоря вообще сложно объяснить. Казалось, что первый давно забыт, а второй используется довольно редко. Возможно Python удерживается и за счет того, что до сих под активно используется в Google.

Интересно так же то, что в 20-ку нагло ворвались Pascal и Lua (+5 позиций). Неужели на Pascal еще пишут софт?

Вообще, рейтинг довольно спорный, но интересный :)

Источник: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

]]>
https://valera.ws/2008.03.27~tiobe-march08/feed/ 1