- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
SELECT
node.nid AS nid,
location.latitude AS location_latitude,
location.longitude AS location_longitude,
node.title AS node_title,
node.language AS node_language,
location.lid AS location_lid,
(IFNULL(ACOS(0.501284223863*COS(RADIANS(location.latitude))*(0.863228195442*COS(RADIANS(location.longitude)) + 0.504813908876*SIN(RADIANS(location.longitude))) + 0.865282686124*SIN(RADIANS(location.latitude))), 0.00000)*6362105.74365) AS location_distance,
node_data_field_rate_prior.field_rate_prior_amount AS node_data_field_rate_prior_field_rate_prior_amount,
node_data_field_rate_prior.field_rate_prior_currency AS node_data_field_rate_prior_field_rate_prior_currency,
node.type AS node_type, node.vid AS node_vid,
node_data_field_rate_prior.field_rate_reg_amount AS node_data_field_rate_prior_field_rate_reg_amount,
node_data_field_rate_prior.field_rate_reg_currency AS node_data_field_rate_prior_field_rate_reg_currency,
node_data_field_rate_prior.field_rate_vip_amount AS node_data_field_rate_prior_field_rate_vip_amount,
node_data_field_rate_prior.field_rate_vip_currency AS node_data_field_rate_prior_field_rate_vip_currency
FROM node node
LEFT JOIN location_instance location_instance ON node.vid = location_instance.vid
LEFT JOIN location location ON location_instance.lid = location.lid
LEFT JOIN content_type_dta_kiosk node_data_field_rate_prior ON node.vid = node_data_field_rate_prior.vid
WHERE node.type in ('dta_kiosk')
AND (location.latitude > 40.9991009563
AND location.latitude < 59.0008990437
AND location.longitude > 5.91311892539
AND location.longitude < 34.0868810746
)
ORDER BY location_distance ASC
striker 14.01.2011 19:12 # +1
Lure Of Chaos 14.01.2011 19:41 # +6
topilnik 13.03.2011 03:05 # −1
Dummy00001 14.01.2011 23:38 # 0
Lure Of Chaos 15.01.2011 00:09 # +1
StriderMan 17.01.2011 11:58 # 0
Dummy00001 17.01.2011 14:18 # 0
> ORDER BY location_distance ASC
в общем, это не базы работа такой херней страдать. на любом языке программирования это будет намного эффективней реализовать.
если в результате много строк и/или выполняется много таких запросов паралельно, т.к. результаты запроса должны быть полностью в памяти кэшированы (что бы отсортировать) то: либо у базы все кэши будут засорены этим мусором, либо сортировка будет идти через диск.
да, современные базы такое тянут. вопрос только "зачем?"
StriderMan 18.01.2011 11:33 # 0
Да, действительно, не заметил.
>>в общем, это не базы работа такой херней страдать
А вот тут спорно, От объема выборки зависит. Собссно сортируя это в скрипте все равно ту же память съешь. А учитывая криворукость разработчика - наверняка еще и потеряешь и в производительности и в ресурсах.
Кстати в Firebird'е например есть специальный механизм для индексирования вычисляемых полей, ключевое слово COMPUTED BY.
Dummy00001 18.01.2011 13:37 # 0
в скрипте эта память все равно должна быть выделена - для хранения результата запроса.
для баз идеально когда они могут данные (почти) на прямую с диска клиенту фигачить. что и есть одно из назначений индексов: маппинг строк таблицы в блоки на диске. в идеале, запрос конвертится в fsm которая просто ходит по индексам и гонит данные с той скоростью с которой их может клиент вычитывать.
> Кстати в Firebird'е например есть специальный механизм для индексирования вычисляемых полей, ключевое слово COMPUTED BY.
да они почти везде есть (function-based index в Оракакле). проблема в том что ты тогда теряешь время на каждом insert/update.
StriderMan 19.01.2011 01:33 # 0
ваще да, тут согласен :)
>>для баз идеально
ну это всем известно, но случай-то совсем не идеальный
>> проблема в том что ты тогда теряешь время на каждом insert/update
Естественно. Нужен сбалансированный подход к индексам, впрочем это тоже азбука
Все таки на не раскрыта тема, почему надо делать эту сортировку самому а не перевалить на плечи БД. ИМХО в лучшем случае, написав идеальный код, получишь немного лучший результат, но потратишь массу времени.
В конце концов лучше сделать сначала так, никто не мешает в случае эпичных тормозов уже задуматься над переносом этой логики в серверный скрипт.
Dummy00001 19.01.2011 02:04 # 0
блин. мануал по тюнингу SQL для твоей любимой RDBMS в руки и читать.
я проходил Оракакловский перформанс тренинг, и такие фишки там упомянались. концепция большинства оптимизаций: чем меньше базе нужно делать, тем лучше; чем лучше то что ты делаешь мапится на нативную функциональность, тем лучше; и т.д. и т.п.
в частности сортировки которые не мапятся на индекс, требуют доп памяти для того что бы данные отсортировать. в худшем случае, только для сортировки, данные могут быть записаны временно на диск, и потом мерж сортом клиенту с диска отдаватся.
> ИМХО в лучшем случае, написав идеальный код, получишь немного лучший результат, но потратишь массу времени.
как в пыхе это делается, не помню. но на перле это почти тривиально, типа `sort { cmp_code } @{$sth->fetchall_arrayref};`
vectoroc 19.01.2011 09:51 # 0
computed by index тут не применим (mysql вроде нет такого?)
если предварительно отфильтровать точки по координатам, получается не такие уж и большие выборки, сортировка которых происходит быстро
StriderMan 19.01.2011 12:04 # 0
>> mysql вроде нет такого?
А где написано что это MySQL ?
>>если предварительно отфильтровать точки по координатам, получается не такие уж и большие выборки, сортировка которых происходит быстро
На самом деле мы не знаем сколько там точек. Может их более 9000 в этих координатах
sectus 26.01.2011 18:41 # 0
StriderMan 19.01.2011 12:07 # +1
Ну это ожидаемо. Естественно, чтобы меньше вопросов к Ораклу возникало, его преподы и учат меньше его грузить. Чтобы потом народ не вопил что Ора-кал !
StriderMan 19.01.2011 12:08 # 0
Может я тупой, но почему вы думаете что MySQL не делает примерно то же самое? А если так, то нафига городить велосипед?
Dummy00001 19.01.2011 13:21 # +1
направление мысли правильное - MySQL делает то же самое. но: devil is in the details.
сортировка требует доп памяти.
память CGI приложения как правило ресайклится почти сразу. и ее много. почти ни один фреймворк (по умолчанию) не ставит никаких жестких ограничений на расход памяти. (наверное Жаба с ее граблями выделения памяти единственное известное мне исключение где глобальный лимит всегда есть.)
память SQL сервака как правило имеет жесткий лимит и используется для многих вещей. самая главная часть: это кэш часто используемых таблиц. память которая будет расходоватся для сортировки скорее всего должна будет отобрана у кэша, что значит что какая-то таблица будет выкинута из памяти. что значит что эта таблицу нужно будет перечитать с диска.
суммируя: с точки зрения производительности память SQL сервака дороже чем память CGI скрипта. один скрипт обламается - это мелкая проблема. один сервак будет постоянно на диск ходит - все скрипты в жопе.
совсем суммируя: сортировка в SQL которая не мапится на индекс есть говно.
StriderMan 19.01.2011 15:39 # 0
>>совсем суммируя: сортировка в SQL которая не мапится на индекс есть говно.
Опять же не всегда. Может этот запрос для административных целей или для построения отчета раз в день. Лучше один раз напрячь сервак неиндексированной сортировкой чем натянуть лишний индекс и напрягать сервак каждой вставкой. Согласны?
Dummy00001 19.01.2011 16:15 # 0
bugmenot 19.01.2011 21:17 # +1
brainstorm 15.01.2011 00:42 # 0
даже по ревизиям ноды есть.
а чо за модуль?
а то сдается мне что это говно нагенерено чем то типа views - особо глядя на вот это
PS. одминам. сделайтежекнопкидляббкода.неудобноблять!
PPS. ниделя друпала на гавнакоде
vectoroc 15.01.2011 01:38 # 0
brainstorm 15.01.2011 02:09 # 0
имеенно потому запросы с более сложными условиями я пишу сам, а потом натравливаю на них db_rewrite_sql и втыкаю в тему(там где можно было бы вьюху к ноде привязать)
ибо писец.
вы на д7 чтото уже апгрейдили? не умирают данные? :)
vectoroc 15.01.2011 13:45 # 0
brainstorm 15.01.2011 14:09 # 0
судя по всему данные то никуда не денутся а код заново писать.
guest 04.04.2011 19:21 # 0