2011-05-12 2 views
2

Допустим, у меня есть таблица с несколькими ключами, счетами и хитами.Postgres efficiency

Который быстрее? Я думаю, мой вопрос, если Postgres (или любой SQL по этому вопросу) имеет оптимизатор интеллектуальный видеть одинаковые функции в запросе

SELECT key, accounts, hits,1.0*hits/accounts as ratio FROM 
(
    SELECT key, COUNT(DISTINCT accounts) as accounts, SUM(hits) as hits 
    FROM table 
    GROUP BY key 
) a; 

ИЛИ

SELECT key, COUNT(DISTINCT accounts) as accounts, SUM(hits) as hits, 1.0*SUM(hits)/COUNT(DISTINCT accounts) as ratio 
FROM table 
GROUP BY key; 

Я хотел бы услышать, что вы имеете сказать или ресурсы, которые вы можете предоставить при понимании такого рода вещей. Благодаря!

+2

Не зная таблиц, индексов и данных, это будет очень сложно сказать. Вы пробовали рассказать об этом? http://www.postgresql.org/docs/8.1/static/sql-explain.html – Ken

+1

Зачем нужно объяснение? Вопрос заключается в том, что оптимизатор достаточно умен, чтобы понять, что учетные записи COUNT (DISTINCT) идентичны в двух местах, а также SUM (хиты), и если он будет вычислять каждый один или два раза. –

+0

Если я использую Explain, однако, версия подзапроса немного дешевле (819804 vs 819807) –

ответ

3

Да, это так. Это и есть функция волатильности.

http://www.postgresql.org/docs/current/static/sql-createfunction.html

См VOLATILE против STABLE против непреложных.

+1

Я не получаю это ... – leonbloy

+0

@ Leonbloy: неизменные функции вызываются планировщиком, если это возможно; они и стабильные функции обрабатываются только один раз в одном выражении. Вызов 'select stable_foo(), stable_foo(), volatile_bar(), volatile_bar();' приведет к одному вызову 'stable_foo()', но два вызова 'volatile_bar()'. –

+0

да, я знаю, что я не понимаю, как это отвечает на вопрос – leonbloy