Ускорение предложения GROUP BY в SQL (Python / Pandas) - PullRequest
0 голосов
/ 24 мая 2018

Я тщательно обыскал этот сайт и не смог найти решение, которое подходит мне.Я пишу на python, и у меня очень мало знаний по SQL.В настоящее время мне нужно создать код для извлечения данных из базы данных SQL, а также организовать / обобщить его.Мой код ниже: (он был очищен в целях безопасности данных)

conn = pc.connect(host=myhost,dbname =mydb, port=myport,user=myuser,password=mypassword)
cur = conn.cursor()
query = ("""CREATE INDEX index ON myTable3 USING btree (name);
    CREATE INDEX index2 ON myTable USING btree (date, state);
    CREATE INDEX index3 ON myTable4 USING btree (currency, type);

    SELECT tp.name AS trading_party_a,
    tp2.name AS trading_party_b,
    ('1970-01-01 00:00:00'::timestamp without time zone + ((mc.date)::double precision * '00:00:00.001'::interval)) AS val_date,
    mco.currency,
    mco.type AS type,
    mc.state,
    COUNT(*) as call_count,
    SUM(mco.call_amount) as total_call_sum,
    SUM(mco.agreed_amount) as agreed_sum,
    SUM(disputed_amount) as disputed_sum


    FROM myTable mc
    INNER JOIN myTable2 cp ON mc.a_amp_id = cp.amp_id
    INNER JOIN myTable3 tp ON cp.amp_id = tp.amp_id
    INNER JOIN myTable2 cp2 ON mc.b_amp_id = cp2.amp_id
    INNER JOIN myTable3 tp2 ON cp2.amp_id = tp2.amp_id,
    myTable4 mco



    WHERE (((mc.amp_id)::text = (mco.call_amp_id)::text))

    GROUP BY tp.name, tp2.name,
    mc.date, mco.currency, mco.type, mc.state

    LIMIT 1000""")

frame = pdsql.read_sql_query(query,conn)

Выполнение запроса занимает более 15 минут, даже если мой лимит установлен на 5. До того, как было добавлено предложение GROUP BY,он будет работать с LIMIT 5000 менее чем за 10 секунд.Мне было интересно, так как я знаю, что мой SQL не очень хорош, если кто-нибудь знает, где может быть причиной задержки, а также какие-либо улучшения должны быть сделаны.

РЕДАКТИРОВАТЬ: я не знаю, какпросматривать производительность SQL-запроса, но если бы кто-то мог сообщить мне об этом, я мог бы опубликовать производительность сценария.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

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

Без группировки не требуется анализировать весь набор данных до того, какон может начать генерировать результаты - он сразу переходит к суммированию и подсчету желаемых переменных.

0 голосов
/ 24 мая 2018

Что касается ускорения вашего рабочего процесса, вас может заинтересовать 3-я часть моего ответа на этот пост: https://stackoverflow.com/a/50457922/5922920

Если вы хотите сохранить SQL-подобный интерфейс при использованиираспределенная файловая система, в которую вы можете заглянуть Hive , Pig и Sqoop в дополнение к Hadoop и Spark .

Кроме того, для отслеживания производительности вашего запроса SQL вы всегда можете отслеживать время выполнения вашего кода на стороне клиента, если это необходимо.

Например:

import timeit

start_time = timeit.default_timer()

#Your code here

end_time = timeit.default_timer()

print end_time - start_time 

Или используйте инструменты, подобные этим, чтобы глубже взглянуть на происходящее: https://stackify.com/performance-tuning-in-sql-server-find-slow-queries/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...