эффективный способ реализовать подкачку страниц

Во-первых, вам не нужно устанавливать RPM-пакет scala, поскольку SBT сам загружает для вас Scala (какая версия настроена в вашей сборке).

Во-вторых, каждая команда RUN создает новый слой, которого вы обычно избегаете. Объедините их:

RUN cmd1 \
  && cmd2 \
  && cmd3

Почему вы хотите создать образ для каждой из ваших сборок? Это кажется расточительным. Обычно вы создаете свои вещи вне образа Docker и только упаковываете результаты.

Мой совет - использовать плагин sbt-native-packager SBT с интеграцией Docker , чтобы просто создать образ из ваших артефактов после их создания. Таким образом, вам понадобится только JRE в вашем изображении, а не JDK, не SBT. Кроме того, вам не нужно ждать инициализации SBT при запуске вашего изображения.

Вы можете использовать многоэтапные сборки , если у вас установлена ​​новая версия Docker.

114
задан Lukas Eder 26 October 2013 в 18:20
поделиться

3 ответа

Попытка дать Вам, которых краткий ответ на Ваше сомнение, если Вы выполняетесь эти skip(n).take(m) методы на linq (с SQL 2005 / 2008 как сервер базы данных) Ваш запрос, будет использовать Select ROW_NUMBER() Over ... оператор, с, является так или иначе прямой подкачкой страниц в механизме SQL.

Предоставление Вам пример, у меня есть таблица базы данных, названная mtcity, и я записал следующий запрос (работа также с linq к объектам):

using (DataClasses1DataContext c = new DataClasses1DataContext())
{
    var query = (from MtCity2 c1 in c.MtCity2s
                select c1).Skip(3).Take(3);
    //Doing something with the query.
}

получающийся запрос будет:

SELECT [t1].[CodCity], 
    [t1].[CodCountry], 
    [t1].[CodRegion], 
    [t1].[Name],  
    [t1].[Code]
FROM (
    SELECT ROW_NUMBER() OVER (
        ORDER BY [t0].[CodCity], 
        [t0].[CodCountry], 
        [t0].[CodRegion], 
        [t0].[Name],
        [t0].[Code]) AS [ROW_NUMBER], 
        [t0].[CodCity], 
        [t0].[CodCountry], 
        [t0].[CodRegion], 
        [t0].[Name],
        [t0].[Code]
    FROM [dbo].[MtCity] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]

, Который является оконным доступом к данным (довольно прохладный, btw, потому что будет возвращать данные с самого начала и получит доступ к таблице пока, условия соблюдают). Это будет очень похоже на:

With CityEntities As 
(
    Select ROW_NUMBER() Over (Order By CodCity) As Row,
        CodCity //here is only accessed by the Index as CodCity is the primary
    From dbo.mtcity
)
Select [t0].[CodCity], 
        [t0].[CodCountry], 
        [t0].[CodRegion], 
        [t0].[Name],
        [t0].[Code]
From CityEntities c
Inner Join dbo.MtCity t0 on c.CodCity = t0.CodCity
Where c.Row Between @p0 + 1 AND @p0 + @p1
Order By c.Row Asc

За исключением того, что, этот второй запрос будет выполняться быстрее, чем результат linq, потому что он будет использовать исключительно индекс для создания окна доступа к данным; это означает при необходимости в некоторой фильтрации фильтрация должна быть (или должен быть) в списке Объектов (где строка создается), и некоторые индексы должны быть созданы также для поддержания на высоком уровне хорошей производительности.

Теперь, что лучше?

, Если у Вас есть в значительной степени твердый рабочий процесс в Вашей логике, реализовывая надлежащий SQL, путь будет сложным. В этом случае LINQ будет решением.

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

171
ответ дан Lambda 24 November 2019 в 02:33
поделиться

LinqToSql автоматически преобразует.Skip (N1).Take (N2) в синтаксис TSQL для Вас. На самом деле, каждый "запрос", который Вы делаете в Linq, на самом деле просто создает SQL-запрос для Вас в фоновом режиме. Для тестирования этого просто выполните SQL Profiler, в то время как приложение работает.

пропускать/брать методология работала очень хорошо на меня и других от того, что я считал.

Из любопытства, какой запрос самоподкачки страниц Вы имеете, которому Вы верите, более эффективно, чем Linq пропускает/берет?

5
ответ дан mandreko 24 November 2019 в 02:33
поделиться

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

у меня не было шанса посмотреть на T/SQL, который производит LINQ. Кто-то может отправить образец?

Мы не используем LINQ или прямой доступ к таблицам, поскольку мы требуем дополнительного уровня безопасности (допустил, что динамический SQL повреждает это несколько).

Что-то вроде этого должно добиться цели. Можно добавить в параметризованных значениях для параметров, и т.д.

exec sp_executesql 'WITH MyCTE AS (
    SELECT TOP (10) ROW_NUMBER () OVER ' + @SortingColumn + ' as RowID, Col1, Col2
    FROM MyTable
    WHERE Col4 = ''Something''
)
SELECT *
FROM MyCTE
WHERE RowID BETWEEN 10 and 20'
4
ответ дан mrdenny 24 November 2019 в 02:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: