2016-04-20 1 views
2

Мой щеголеватый код приведен ниже с запросом на выборку:Простой щеголеватый запрос на выборку с 20 строками (большинство из столбцов NVARCHAR (макс)) занимает слишком длительный 15 секунд и более

const string Sql = @"SELECT [id] 
           ,[groupName] 
           ,[reqCap] 
           ,[impCap] 
           ,[player] 
           ,[resumeDate] 
           ,[whitelist] 
           ,[blacklist] 
           ,[Macros] 
           FROM [VideoServer].[dbo].[TagGroup]"; 
return await dc.Connection.QueryAsync<TagGroup>(Sql); 

Мой дизайн стола является ниже:

[id] [int] IDENTITY(1,1) NOT NULL, 
[groupName] [varchar](500) NOT NULL, 
[reqCap] [int] NULL CONSTRAINT [DF_TagGroup_reqCap] DEFAULT ((0)), 
[impCap] [int] NULL CONSTRAINT [DF_TagGroup_impCap] DEFAULT ((0)), 
[player] [varchar](500) NULL, 
[resumeDate] [date] NULL, 
[whitelist] [nvarchar](max) NULL, 
[blacklist] [nvarchar](max) NULL, 
[Macros] [nvarchar](max) NULL 

Когда я запускаю этот запрос select в SQL Server Management Studio, он возвращается в пределах 0 миллисекунд. Но тот же запрос от dapper (выше кода) занимает слишком много времени.

Любые идеи? Это из-за nvarchar(max)?

Если я очищаю данные в полях nvarchar(max), это возвращает данные очень быстро.

+0

Сколько данных в полях 'nvarchar (max)'? индексирование не выполняется на поля 'nvarchar (max)', поэтому это может быть одной из причин. Кроме того, максимальные поля хранятся по-разному для полей без макс. – user1666620

+0

200 КБ и более в каждом столбце nvarchar (max) –

+0

нет предложения WHERE, поэтому индекс здесь не может помочь –

ответ

3

Вы пытаетесь вытащить 600 + Kb из базы данных для каждой записи. 20 строк делают это почти 6Mb как минимум за запрос.

Причина, по которой он быстро запускается в SQL Server Management Studio, заключается в том, что он фактически не возвращает полный столбец, он возвращает только первые X символов, поэтому обрабатывается не все 6 + МБ. Когда вы запускаете код (в этом случае dapper), возвращается все 6 + MB.

Если вы храните файлы в базе данных, вам необходимо прекратить это делать и сохранить их в файловой системе и использовать базу данных для хранения местоположений и метаданных файлов.

+0

Это строка json. Конечно, преобразование csv в json array. нужно это таким образом, я не хочу хранить это как файл –

+0

@ManuMohanT, тогда вам нужно выяснить, как уменьшить объем данных, которые вы вытягиваете одновременно. Вытяните только минимальное количество строк/столбцов необходимых для каждого запроса.Если пользователь хочет увидеть CSV, тогда и только затем вытащите этот конкретный столбец. Но вам нужно выяснить лучший способ хранения данных, чем массивную строку JSON в базе данных. – user1666620

0

Я не являюсь антисохранением JSON/XML в базе данных, но он действительно дает очень большие комки данных, которые возвращаются иногда, что потребует времени для возврата - и больше, чем в SSMS, что обычно не верните полную информацию вам.

НО - Когда вы возвращаете это много данных, важно фильтровать. Я сомневаюсь, что вашему приложению действительно нужны все поля или все записи для того, что он пытается сделать; если вы отфильтровываете то, что вам действительно нужно в вашем запросе, вы должны получить более быстрый результат.

+0

Нет Я хочу, чтобы все строки –

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