Усулҳои оптимизатсияи дархостҳои LINQ дар C#.NET

Муқаддима

В ин мақола баъзе усулҳои оптимизатсия баррасӣ шуданд Дархостҳои LINQ.
Дар ин ҷо мо инчунин якчанд равишҳои бештареро барои оптимизатсияи коди марбут ба он пешниҳод мекунем Дархостҳои LINQ.

Маълум аст, ки LINQ(Language-Integrated Query) забони содда ва қулай барои пурсиши манбаи додаҳост.

А LINQ ба SQL технологияи дастрасӣ ба маълумот дар DBMS мебошад. Ин як воситаи пуриқтидор барои кор бо додаҳо мебошад, ки дар он дархостҳо тавассути забони декларативӣ сохта мешаванд, ки баъдан ба маълумот табдил дода мешаванд. Дархостҳои SQL платформа ва барои иҷро ба сервери пойгоҳи додаҳо фиристода мешавад. Дар мавриди мо, бо DBMS мо дар назар дорем Сервери MS SQL.

Аммо, Дархостҳои LINQ ба оптималй навишташуда табдил дода намешаванд Дархостҳои SQL, ки DBA ботаҷриба метавонад бо тамоми нозукиҳои оптимизатсия нависад Дархостҳои SQL:

  1. пайвастҳои оптималӣ (ҶОЙҲО) ва филтр кардани натиҷаҳо (НОҲИЯИ ПАНҶ)
  2. нозукиҳои зиёде дар истифодаи пайвастҳо ва шароити гурӯҳ
  3. вариантҳои зиёде дар иваз кардани шароит IN ба Вуҷуд доради НЕ ДАР, <> дар Вуҷуд дорад
  4. кэшкунии фосилавии натиҷаҳо тавассути ҷадвалҳои муваққатӣ, CTE, тағирёбандаҳои ҷадвал
  5. истифодаи ҳукм (OPTION) бо дастурҳо ва маслиҳатҳои ҷадвал БО (...)
  6. бо истифода аз назари индексатсияшуда ҳамчун яке аз воситаҳо барои халос шудан аз хонишҳои зиёдатии маълумот ҳангоми интихобҳо

Мушкилоти асосии иҷрои натиҷа Дархостҳои SQL хангоми тартиб додан Дархостҳои LINQ инҳоянд:

  1. муттаҳидсозии тамоми механизми интихоби маълумот дар як дархост
  2. такрор кардани блокҳои якхелаи код, ки дар ниҳоят ба хондани маълумоти нолозим оварда мерасонад
  3. гурӯҳҳои шартҳои бисёркомпонентӣ (мантиқӣ «ва» ва «ё») - ВА и OR, муттаҳид шудан ба шароити мураккаб, ба он оварда мерасонад, ки оптимизатор дорои индексҳои мувофиқи кластерӣ барои майдонҳои зарурӣ, дар ниҳоят ба скан кардани индекси кластерӣ оғоз мекунад (Сканкунии ИНДЕКС) аз руи гуруххои шартхо
  4. Ҷойгиркунии амиқи зерпурсишҳо таҳлилро хеле мушкил мекунад Изҳороти SQL ва таҳлили нақшаи дархост аз ҷониби таҳиягарон ва DBA

Усулҳои оптимизатсия

Акнун биёед бевосита ба усулҳои оптимизатсия гузарем.

1) индексатсияи иловагӣ

Беҳтар аст, ки филтрҳоро дар ҷадвалҳои интихобии асосӣ баррасӣ кунед, зеро аксар вақт тамоми дархост дар атрофи як ё ду ҷадвали асосӣ (барномаҳо-одамҳо-амалҳо) ва бо маҷмӯи стандартии шартҳо (Басташуда, Бекоршуда, Фаъол, Ҳолат) сохта мешавад. Муҳим аст, ки барои намунаҳои муайяншуда индексҳои мувофиқ эҷод карда шаванд.

Ин ҳалли мантиқӣ ҳангоми интихоби ин майдонҳо маҷмӯи баргардонидашударо ба дархост ба таври назаррас маҳдуд мекунад.

Масалан, мо 500000 2000 ариза дорем. Аммо, танҳо XNUMX барномаҳои фаъол мавҷуданд. Он гоҳ шохиси дуруст интихобшуда моро аз он наҷот медиҳад Сканкунии ИНДЕКС дар ҷадвали калон ва ба шумо имкон медиҳад, ки маълумотро тавассути индекси кластерӣ зуд интихоб кунед.

Инчунин, набудани нишондиҳандаҳоро тавассути дархостҳо барои таҳлили нақшаҳои дархост ё ҷамъоварии омори намоиши система муайян кардан мумкин аст. Сервери MS SQL:

  1. sys.dm_db_missing_index_groups
  2. sys.dm_db_missing_index_group_stats
  3. sys.dm_db_missing_index_details

Ҳама маълумоти намоишӣ дорои маълумот дар бораи индексҳои гумшуда, ба истиснои индексҳои фазои.

Аммо, индексҳо ва кэш аксар вақт усулҳои мубориза бо оқибатҳои нодуруст навишта шудаанд Дархостҳои LINQ и Дархостҳои SQL.

Тавре ки таҷрибаи сахти ҳаёт нишон медиҳад, барои тиҷорат аксар вақт муҳим аст, ки хусусиятҳои тиҷоратро дар мӯҳлатҳои муайян татбиқ кунад. Аз ин рӯ, дархостҳои вазнин аксар вақт бо кэш ба замина интиқол дода мешаванд.

Ин қисман асоснок аст, зеро корбар на ҳамеша ба маълумоти охирин ниёз дорад ва сатҳи қобили қабули посухгӯии интерфейси корбар мавҷуд аст.

Ин равиш имкон медиҳад, ки эҳтиёҷоти тиҷорӣ ҳал карда шавад, аммо дар ниҳоят кори системаи иттилоотиро тавассути ба таъхир андохтани ҳалли мушкилот коҳиш медиҳад.

Инчунин бояд дар хотир дошт, ки дар раванди ҷустуҷӯи индексҳои зарурӣ илова, пешниҳодҳо MS SQL оптимизатсия метавонад нодуруст бошад, аз он ҷумла дар шароити зерин:

  1. агар аллакай индексҳои дорои маҷмӯи шабеҳи майдонҳо мавҷуд бошанд
  2. агар майдонҳои ҷадвал бо сабаби маҳдудиятҳои индексатсия индексатсия карда нашаванд (ба таври муфассал шарҳ дода шудааст) дар ин ҷо).

2) Якҷоя кардани атрибутҳо ба як атрибути нав

Баъзан баъзе майдонҳои як ҷадвалро, ки барои як гурӯҳи шартҳо ҳамчун асос хизмат мекунанд, бо ворид кардани як майдони нав иваз кардан мумкин аст.

Ин махсусан барои майдонҳои статус, ки одатан дар намуди бит ё бутун мебошанд, дуруст аст.

Мисол:

Бастан = 0 ВА Бекоршуда = 0 ВА Фаъол = 0 иваз карда мешавад Статус = 1.

Дар ин ҷо атрибути Статуси бутун ҷорӣ карда мешавад, то ин ки ин статусҳо дар ҷадвал пур карда шаванд. Баъдан, ин атрибути нав индексатсия карда мешавад.

Ин як ҳалли бунёдии мушкилоти иҷроиш аст, зеро мо ба маълумот бе ҳисобҳои нолозим дастрасӣ дорем.

3) Маводизатсияи назар

Мутаассифона, дар Дархостҳои LINQ Ҷадвалҳои муваққатӣ, CTE ва тағирёбандаҳои ҷадвал наметавонанд мустақиман истифода шаванд.

Аммо, роҳи дигари оптимизатсия барои ин ҳолат вуҷуд дорад - назари индексатсияшуда.

Гурӯҳи шартҳо (аз мисоли боло) Бастан = 0 ВА Бекоршуда = 0 ВА Фаъол = 0 (ё маҷмӯи дигар шартҳои шабеҳ) як варианти хуби истифодаи онҳо дар намуди индексатсияшуда, кэшкунии як буридаи хурди маълумот аз маҷмӯи калон мегардад.

Аммо ҳангоми татбиқи назар як қатор маҳдудиятҳо мавҷуданд:

  1. истифодаи зерпурсишҳо, бандҳо Вуҷуд дорад бояд бо истифода аз он иваз карда шавад ҶОЙҲО
  2. шумо наметавонед ҳукмҳоро истифода баред ИТТИФОҚИ, ҲАМА, ИСТИСНО, ЧАНД
  3. Шумо наметавонед маслиҳатҳо ва бандҳои ҷадвалро истифода баред OPTION
  4. имкони кор бо циклхо нест
  5. Намоиш додани маълумот дар як намуди ҷадвалҳои гуногун ғайриимкон аст

Дар хотир доштан муҳим аст, ки фоидаи воқеии истифодаи намуди индексатсияро танҳо тавассути индексатсияи воқеан ба даст овардан мумкин аст.

Аммо ҳангоми даъват кардани намоиш, ин индексҳо наметавонанд истифода шаванд ва барои ба таври возеҳ истифода бурдани онҳо, шумо бояд муайян кунед БО(NOEXPAND).

Аз соли Дархостҳои LINQ Маслиҳатҳои ҷадвалро муайян кардан ғайриимкон аст, аз ин рӯ шумо бояд як намоиши дигар - "печтошка"-и шакли зеринро эҷод кунед:

CREATE VIEW ИМЯ_представления AS SELECT * FROM MAT_VIEW WITH (NOEXPAND);

4) Истифодаи функсияҳои ҷадвал

Аксар вақт дар Дархостҳои LINQ Блокҳои калони зерпурсишҳо ё блокҳое, ки бо истифода аз намудҳо бо сохтори мураккаб дархости ниҳоиро бо сохтори иҷроиши хеле мураккаб ва ноустувор ташкил медиҳанд.

Манфиатҳои асосии истифодаи функсияҳои ҷадвал дар Дархостҳои LINQ:

  1. Қобилият, ба монанди дар мавриди дидан, ҳамчун объект истифода ва муайян карда мешавад, аммо шумо метавонед маҷмӯи параметрҳои вурудро гузаронед:
    АЗ ФУНКЦИЯ(@param1, @param2 ...)
    Дар натиҷа, интихоби тағйирпазири маълумот мумкин аст
  2. Дар мавриди истифодаи функсияи ҷадвал, чунин маҳдудиятҳои қавӣ вуҷуд надоранд, ба монанди дар мавриди назари индексатсияшуда, ки дар боло тавсиф шудаанд:
    1. Маслиҳатҳои ҷадвал:
      через LINQ Шумо наметавонед муайян кунед, ки кадом индексҳо бояд истифода шаванд ва сатҳи ҷудокунии маълумотро ҳангоми дархост муайян кунед.
      Аммо функсия ин қобилиятҳоро дорад.
      Бо ин функсия шумо метавонед нақшаи дархости иҷроиши доимиро ба даст оред, ки дар он қоидаҳои кор бо индексҳо ва сатҳи изолятсияи додаҳо муайян карда мешаванд.
    2. Истифодаи функсия имкон медиҳад, ки дар муқоиса бо намуди индексатсияшуда ба даст оварда шавад:
      • мантиқи мураккаби интихоби маълумот (ҳатто бо истифода аз ҳалқаҳо)
      • гирифтани маълумот аз бисёр ҷадвалҳои гуногун
      • истифодаи ИТТИФОҚИ и Вуҷуд дорад

  3. Биёед OPTION вақте ки мо бояд назорати ҳамзамонро таъмин кунем, хеле муфид аст Опсия (MAXDOP N), тартиби ичрои накшаи дархост. Барои намуна:
    • шумо метавонед дубора маҷбурии нақшаи дархостро муайян кунед Опсия (аз нав тартиб додан)
    • шумо метавонед муайян кунед, ки оё нақшаи дархостро маҷбур кардан лозим аст, ки тартиби ҳамроҳшавӣ дар дархостро истифода барад Опсия (Фармони маҷбурӣ)

    Тафсилоти бештар дар бораи OPTION тавсиф карда шудааст дар ин ҷо.

  4. Бо истифода аз тангтарин ва аз ҳама талабшавандаи маълумот:
    Дар кэшҳо нигоҳ доштани маҷмӯаҳои бузурги додаҳо лозим нест (ба монанди намуди намоишҳои индексатсия), ки аз он шумо ҳоло ҳам маълумотро аз рӯи параметр филтр кунед.
    Масалан, ҷадвале мавҷуд аст, ки филтри он НОҲИЯИ ПАНҶ се майдон истифода мешавад (а, б, в).

    Одатан, ҳама дархостҳо шарти доимӣ доранд a = 0 ва b = 0.

    Бо вуҷуди ин, дархост барои соҳаи c тағйирёбанда бештар.

    Бигзор шарт a = 0 ва b = 0 Он воқеан ба мо кӯмак мекунад, ки маҷмӯи натиҷаҳоро бо ҳазорҳо сабтҳо маҳдуд кунем, аммо шарт с интихобро то сад сабт танг мекунад.

    Дар ин ҷо функсияи ҷадвал метавонад як варианти беҳтар бошад.

    Инчунин, функсияи ҷадвал дар вақти иҷро пешгӯишавандатар ва мувофиқ аст.

намунаи

Биёед мисоли татбиқро бо истифода аз пойгоҳи додаҳои саволҳо ҳамчун намуна дида бароем.

Дархост ҳаст SELECT, ки якчанд ҷадвалҳоро муттаҳид мекунад ва як намоишро истифода мебарад (OperativeQuestions), ки дар он мансубият тавассути почтаи электронӣ тафтиш карда мешавад (тавассути Вуҷуд дорад) ба "Дархостҳои фаъол" ([Оперативӣ]):

Дархости №1

(@p__linq__0 nvarchar(4000))SELECT
1 AS [C1],
[Extent1].[Id] AS [Id],
[Join2].[Object_Id] AS [Object_Id],
[Join2].[ObjectType_Id] AS [ObjectType_Id],
[Join2].[Name] AS [Name],
[Join2].[ExternalId] AS [ExternalId]
FROM [dbo].[Questions] AS [Extent1]
INNER JOIN (SELECT [Extent2].[Object_Id] AS [Object_Id],
[Extent2].[Question_Id] AS [Question_Id], [Extent3].[ExternalId] AS [ExternalId],
[Extent3].[ObjectType_Id] AS [ObjectType_Id], [Extent4].[Name] AS [Name]
FROM [dbo].[ObjectQuestions] AS [Extent2]
INNER JOIN [dbo].[Objects] AS [Extent3] ON [Extent2].[Object_Id] = [Extent3].[Id]
LEFT OUTER JOIN [dbo].[ObjectTypes] AS [Extent4] 
ON [Extent3].[ObjectType_Id] = [Extent4].[Id] ) AS [Join2] 
ON [Extent1].[Id] = [Join2].[Question_Id]
WHERE ([Extent1].[AnswerId] IS NULL) AND (0 = [Extent1].[Exp]) AND ( EXISTS (SELECT
1 AS [C1]
FROM [dbo].[OperativeQuestions] AS [Extent5]
WHERE (([Extent5].[Email] = @p__linq__0) OR (([Extent5].[Email] IS NULL) 
AND (@p__linq__0 IS NULL))) AND ([Extent5].[Id] = [Extent1].[Id])
));

Намоиш дорои сохтори хеле мураккаб аст: он дорои зерпурсишҳо мебошад ва аз навъбандӣ истифода мешавад DISTINCT, ки умуман як амалиёти хеле серталаб аст.

Намунае аз OperativeQuestions тақрибан даҳ ҳазор сабт аст.

Мушкилоти асосии ин дархост дар он аст, ки барои сабтҳои дархости беруна зерпурсишҳои дохилӣ дар намуди [OperativeQuestions] иҷро карда мешаванд, ки бояд барои [Email] = @p__linq__0 ба мо имкон диҳад, ки интихоби баромадро маҳдуд кунем (тавассути Вуҷуд дорад) то садҳо сабтҳо.

Ва чунин ба назар мерасад, ки зерпурсиш бояд сабтҳоро як маротиба тавассути [Email] = @p__linq__0 ҳисоб кунад ва он гоҳ ин якчанд сад сабтҳо бояд бо Id бо Саволҳо пайваст карда шаванд ва дархост зуд хоҳад буд.

Дарвоқеъ, пайвасти пайдарпайи ҳамаи ҷадвалҳо вуҷуд дорад: тафтиши мукотибаи саволҳои Id бо Id аз OperativeQuestions ва филтр кардани почтаи электронӣ.

Дар асл, дархост бо ҳама даҳҳо ҳазор сабтҳои OperativeQuestions кор мекунад, аммо танҳо маълумоти мавриди таваҷҷӯҳ тавассути почтаи электронӣ лозим аст.

Намоиши саволҳои оперативӣ:

Дархости №2

 
CREATE VIEW [dbo].[OperativeQuestions]
AS
SELECT DISTINCT Q.Id, USR.email AS Email
FROM            [dbo].Questions AS Q INNER JOIN
                         [dbo].ProcessUserAccesses AS BPU ON BPU.ProcessId = CQ.Process_Id 
OUTER APPLY
                     (SELECT   1 AS HasNoObjects
                      WHERE   NOT EXISTS
                                    (SELECT   1
                                     FROM     [dbo].ObjectUserAccesses AS BOU
                                     WHERE   BOU.ProcessUserAccessId = BPU.[Id] AND BOU.[To] IS NULL)
) AS BO INNER JOIN
                         [dbo].Users AS USR ON USR.Id = BPU.UserId
WHERE        CQ.[Exp] = 0 AND CQ.AnswerId IS NULL AND BPU.[To] IS NULL 
AND (BO.HasNoObjects = 1 OR
              EXISTS (SELECT   1
                           FROM   [dbo].ObjectUserAccesses AS BOU INNER JOIN
                                      [dbo].ObjectQuestions AS QBO 
                                                  ON QBO.[Object_Id] =BOU.ObjectId
                               WHERE  BOU.ProcessUserAccessId = BPU.Id 
                               AND BOU.[To] IS NULL AND QBO.Question_Id = CQ.Id));

Харитасозии намуди ибтидоӣ дар DbContext (EF Core 2)

public class QuestionsDbContext : DbContext
{
    //...
    public DbQuery<OperativeQuestion> OperativeQuestions { get; set; }
    //...
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Query<OperativeQuestion>().ToView("OperativeQuestions");
    }
}

Дархости ибтидоии LINQ

var businessObjectsData = await context
    .OperativeQuestions
    .Where(x => x.Email == Email)
    .Include(x => x.Question)
    .Select(x => x.Question)
    .SelectMany(x => x.ObjectQuestions,
                (x, bo) => new
                {
                    Id = x.Id,
                    ObjectId = bo.Object.Id,
                    ObjectTypeId = bo.Object.ObjectType.Id,
                    ObjectTypeName = bo.Object.ObjectType.Name,
                    ObjectExternalId = bo.Object.ExternalId
                })
    .ToListAsync();

Дар ин ҳолат, мо роҳи ҳалли ин мушкилотро бидуни тағироти инфрасохторӣ, бидуни ҷорӣ кардани ҷадвали алоҳида бо натиҷаҳои тайёр ("Дархостҳои фаъол") баррасӣ мекунем, ки механизми пур кардани он бо маълумот ва навсозии онро талаб мекунад. .

Гарчанде ки ин як роҳи ҳалли хуб аст, як варианти дигари оптимизатсияи ин мушкилот вуҷуд дорад.

Мақсади асосӣ ин аст, ки сабтҳо аз ҷониби [Email] = @p__linq__0 аз намуди OperativeQuestions кэш карда шаванд.

Функсияи ҷадвали [dbo].[OperativeQuestionsUserMail]-ро ба базаи маълумот ворид кунед.

Бо фиристодани почтаи электронӣ ҳамчун параметри вуруд, мо ҷадвали арзишҳоро бармегардонем:

Дархости №3


CREATE FUNCTION [dbo].[OperativeQuestionsUserMail]
(
    @Email  nvarchar(4000)
)
RETURNS
@tbl TABLE
(
    [Id]           uniqueidentifier,
    [Email]      nvarchar(4000)
)
AS
BEGIN
        INSERT INTO @tbl ([Id], [Email])
        SELECT Id, @Email
        FROM [OperativeQuestions]  AS [x] WHERE [x].[Email] = @Email;
     
    RETURN;
END

Ин ҷадвали арзишҳоро бо сохтори пешакии додаҳо бармегардонад.

Барои он ки дархостҳо ба OperativeQuestionsUserMail оптималӣ бошанд ва нақшаҳои оптималии дархост дошта бошанд, сохтори қатъӣ лозим аст, на Бозгашти Љадвали ҳамчун бозгашт...

Дар ин ҳолат, дархости 1 ба дархости 4 табдил дода мешавад:

Дархости №4

(@p__linq__0 nvarchar(4000))SELECT
1 AS [C1],
[Extent1].[Id] AS [Id],
[Join2].[Object_Id] AS [Object_Id],
[Join2].[ObjectType_Id] AS [ObjectType_Id],
[Join2].[Name] AS [Name],
[Join2].[ExternalId] AS [ExternalId]
FROM (
    SELECT Id, Email FROM [dbo].[OperativeQuestionsUserMail] (@p__linq__0)
) AS [Extent0]
INNER JOIN [dbo].[Questions] AS [Extent1] ON([Extent0].Id=[Extent1].Id)
INNER JOIN (SELECT [Extent2].[Object_Id] AS [Object_Id], [Extent2].[Question_Id] AS [Question_Id], [Extent3].[ExternalId] AS [ExternalId], [Extent3].[ObjectType_Id] AS [ObjectType_Id], [Extent4].[Name] AS [Name]
FROM [dbo].[ObjectQuestions] AS [Extent2]
INNER JOIN [dbo].[Objects] AS [Extent3] ON [Extent2].[Object_Id] = [Extent3].[Id]
LEFT OUTER JOIN [dbo].[ObjectTypes] AS [Extent4] 
ON [Extent3].[ObjectType_Id] = [Extent4].[Id] ) AS [Join2] 
ON [Extent1].[Id] = [Join2].[Question_Id]
WHERE ([Extent1].[AnswerId] IS NULL) AND (0 = [Extent1].[Exp]);

Харитасозии намудҳо ва функсияҳо дар DbContext (EF Core 2)

public class QuestionsDbContext : DbContext
{
    //...
    public DbQuery<OperativeQuestion> OperativeQuestions { get; set; }
    //...
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Query<OperativeQuestion>().ToView("OperativeQuestions");
    }
}
 
public static class FromSqlQueries
{
    public static IQueryable<OperativeQuestion> GetByUserEmail(this DbQuery<OperativeQuestion> source, string Email)
        => source.FromSql($"SELECT Id, Email FROM [dbo].[OperativeQuestionsUserMail] ({Email})");
}

Дархости ниҳоии LINQ

var businessObjectsData = await context
    .OperativeQuestions
    .GetByUserEmail(Email)
    .Include(x => x.Question)
    .Select(x => x.Question)
    .SelectMany(x => x.ObjectQuestions,
                (x, bo) => new
                {
                    Id = x.Id,
                    ObjectId = bo.Object.Id,
                    ObjectTypeId = bo.Object.ObjectType.Id,
                    ObjectTypeName = bo.Object.ObjectType.Name,
                    ObjectExternalId = bo.Object.ExternalId
                })
    .ToListAsync();

Тартиби вақти иҷро аз 200-800 мс, ба 2-20 мс ва ғайра, яъне даҳҳо маротиба тезтар.

Агар мо онро ба ҳисоби миёна гирем, пас ба ҷои 350 мс 8 мс гирифтем.

Аз бартариҳои ошкор мо инчунин ба даст меорем:

  1. камшавии умумии сарбории хониш,
  2. камшавии назарраси эҳтимолияти басташавӣ
  3. кам кардани вақти миёнаи басташавӣ ба арзишҳои қобили қабул

хулоса

Оптимизатсия ва танзими дақиқи зангҳои пойгоҳи додаҳо MS SQL через LINQ масъалаест, ки хал кардан мумкин аст.

Дар ин кор бодиккат ва устуворй ахамияти калон дорад.

Дар оғози раванд:

  1. тафтиш кардани маълумоте, ки дархост бо он кор мекунад (арзишҳо, намудҳои интихобшудаи додаҳо) зарур аст
  2. индексатсияи дурусти ин маълумотро анҷом диҳед
  3. дурустии шартхои пайвастани байни чадвалхоро тафтиш кунед

Итератсияи навбатии оптимизатсия нишон медиҳад:

  1. асоси дархост ва филтри дархости асосиро муайян мекунад
  2. такрори блокҳои дархости шабеҳ ва таҳлили буриши шартҳо
  3. дар SSMS ё дигар GUI барои Сервери SQL худаш оптимизатсия мекунад Дархости SQL (тақсим кардани нигаҳдории фосилавии маълумот, сохтани дархости натиҷавӣ бо истифода аз ин нигаҳдорӣ (мумкин аст, якчанд вуҷуд дошта бошанд))
  4. дар мархалаи охир натичахои ба дастомадаро ба асос гирифта Дархости SQL, структура аз нав сохта мешавад Дархости LINQ

Дар натиҷа Дархости LINQ бояд аз чихати сохтор ба оптималии муайяншуда якхела шавад Дархости SQL аз банди 3.

Эътирофҳо

Ташаккури зиёд ба ҳамкорон jobgemws и alex_ozr аз ширкат Фортис барои ёрй дар тайёр кардани ин материал.

Манбаъ: will.com

Илова Эзоҳ