Просто где выписка из таблицы занимает час - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть эта простая строка:

var records = db.MyDbTable.Where(x => x.SupplierId.HasValue).ToList();

И выполнение занимает один час.У меня есть 272 строки в таблице.В таблице есть один столбец NVARCHAR(MAX), а внутри огромные строки.Как я могу оптимизировать утверждение?Впоследствии в коде у меня есть foreach, который просматривает записи и обрабатывает их.

Оператор select в db занимает 5 минут.

Когда я использую SQL-профилировщик для проверки, это утверждение, котороепереводится с C #:

SELECT 
    [Extent1].[id] AS [id], 
    [Extent1].[xml] AS [xml], 
    [Extent1].[name] AS [name], 
    [Extent1].[create] AS [create], 
    [Extent1].[sale] AS [sale], 
    [Extent1].[SupplierId] AS [SupplierId], 
    [Extent1].[Success] AS [Success], 
    [Extent1].[IId] AS [IId]
    FROM [dbo].[MyDbTable] AS [Extent1]
    WHERE [Extent1].[SupplierId] IS NOT NULL

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Как указано в комментарии OP, поле xml является обязательным.Тогда, как сказал D T, вы должны хранить его в отдельной таблице.Далее вы можете добавить это поле после COMPRESSING в C#.Я даю некоторые статистические данные, которые я протестировал, используя BLToolKit, а также EntityFramework.

Я читаю текстовый файл с 70000 строками, и каждая строка содержит 70 символов.Это 5,039,998 длины.Ниже приведена статистика, которой я хочу поделиться.Я только что протестировал 35 записей без сжатия, для каждой строки в базе данных требовалось около 9MB.

enter image description here

Как видите,OutOfMemory Exception, я не копался в этом.Я просто хотел увидеть время.Что я на самом деле сделал, так это

Когда вы вставляете данные в эту таблицу;перед вставкой COMPRESS строки.Тип данных для поля varbinary (MAX), я взял.Когда вы выбираете данные;извлекайте его только тогда, когда вы хотите обработать его.И не забудьте DECOMPRESSSQL Server для извлечения сжатых записей требуется 0 seconds.

Ниже приведен код для сжатия и распаковки. Справочник по коду

    public static void CopyTo(Stream src, Stream dest)
    {
        byte[] bytes = new byte[4096];

        int cnt;

        while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0)
        {
            dest.Write(bytes, 0, cnt);
        }
    }

    public static byte[] Zip(string str)
    {
        var bytes = Encoding.UTF8.GetBytes(str);

        using (var msi = new MemoryStream(bytes))
        using (var mso = new MemoryStream())
        {
            using (var gs = new GZipStream(mso, CompressionMode.Compress))
            {
                //msi.CopyTo(gs);
                CopyTo(msi, gs);
            }

            return mso.ToArray();
        }
    }

    public static string Unzip(byte[] bytes)
    {
        using (var msi = new MemoryStream(bytes))
        using (var mso = new MemoryStream())
        {
            using (var gs = new GZipStream(msi, CompressionMode.Decompress))
            {
                //gs.CopyTo(mso);
                CopyTo(gs, mso);
            }

            return Encoding.UTF8.GetString(mso.ToArray());
        }
    }

Надеюсь, что вам это поможет.

0 голосов
/ 26 апреля 2018

Попробуйте добавить в базу данных индекс вашего поля where (SupplierId) и посмотрите, поможет ли это.

...