2016-11-30 5 views
1

Я создал несколько достаточно сложных M-запросов и начал сталкиваться с некоторыми серьезными проблемами производительности. Мне интересно, имеет ли отношение к тому, как я когда-либо организовывал свой код.Excel Get & Transform (Power Query) M Стиль и производительность кода

Вопросы у меня были следующие:

1) Мощность запросов постоянно использует все несколько процессорных ядер, вычисляя что-то, даже если я не жду результата.

2) В диспетчере задач иногда можно увидеть, что потоки запроса мощности («Microsoft.mashup.Container.NetFX40.exe») почти простаивают, а Excel.exe использует 100% одного ядра в течение нескольких десятков минут - хотя, по крайней мере, я ищу значения в нескольких таблицах параметров, которые не содержат более пары десятков ячеек.

3) Некоторые шаги требуют очень много времени, чтобы вычислить, хотя задействованные операции тривиальны. Например, у меня есть список из 10 текстовых значений, взятых из таблицы Excel. Этот список появляется как один из моих шагов запроса, когда я его просматриваю. Затем я хочу удалить одно значение, поэтому следующий шаг = List.RemoveItems (myList, {"val"}). Он не вычислялся через 30 минут, хотя я мог видеть, что список был правильно загружен на предыдущем шаге.

4) Пользовательский интерфейс иногда перестает отвечать на запросы в течение нескольких минут после изменения кода. Можно по-прежнему щелкнуть правой кнопкой мыши по запросам слева, чтобы войти в расширенный редактор, и нажмите красный X в верхнем правом углу и выберите сохранить изменения, но все остальное не отвечает. Не сердитый, просто не отвечающий.

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

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

let 
    ThisWB = Excel.CurrentWorkbook(), 
    CfgTbl = ThisWB{[Name="myCfgTbl"]}[Content], 
    x = aFn(CfgTbl), 
    y = bFn(CfgTbl), 
    output = [ThisWB=ThisWB, CfgTbl=CfgTbl, x=x, y=y] 
in 
    output 

Это может привести к каким-либо вопросам? Просто подумал, возможно, потому что в какой-то момент после долгого ожидания для простого результата функции я создал новый запрос = Excel.CurrentWorkbook() {[Name = "myCfgTbl"]} [Content], ссылался на него из другого запроса , и мой результат вычисляется немедленно. Не знаю, почему.

+0

Какую версию Power Query вы используете? Некоторые проблемы с процессором могут быть вызваны фоновым анализом, который вы можете отключить для документа в диалоговом окне «Параметры» в разделе «Текущая рабочая книга | Загрузка данных | Разрешить предварительный просмотр данных в фоновом режиме. –

ответ

1
  1. Он вычисляет превью. Отключите генерацию автоматического предварительного просмотра.
  2. Я испортил что-то подобное в случаях с таблицами с тяжелой формулой.

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

BTW, ваша версия запроса мощности (или Excel 2016) актуальна?

+1

Спасибо, превью были самой моей проблемой. Кроме того, эта [ссылка] (https://blog.crossjoin.co.uk/2016/11/20/referenced-queries-and-caching-in-power-bi-and-power-query/) требует некоторого внимания читать, но помогает мне понять, как оптимизировать запросы. – alazyworkaholic

+0

@alazyworkaholic Спасибо, это много полезной информации! – Eugene

Смежные вопросы