ProHoster > Blog > Pulega > Metotia mo le fa'asilisiliina ole LINQ fesili ile C#.NET
Metotia mo le fa'asilisiliina ole LINQ fesili ile C#.NET
Faatomuaga
В lenei tusiga o nisi auala fa'alelei sa iloiloina LINQ fesili.
O iinei matou te tuʻuina atu ai foʻi nisi auala e faʻaogaina ai le code optimization e fesoʻotaʻi ma LINQ fesili.
Ua iloa lena LINQ(Language-Integrated Query) o se gagana faigofie ma faigofie mo le fesiligia o se puna o faʻamatalaga.
А LINQ ile SQL ose tekonolosi mo le mauaina o faʻamatalaga i totonu o se DBMS. O se meafaigaluega mamana lea mo le galue i faʻamaumauga, lea e fausia ai fesili e ala i se gagana faʻaalia, lea o le a faʻaliliuina i totonu. SQL fesili tulaga ma auina atu i le server database mo le faatinoga. I la matou tulaga, o le DBMS o lona uiga MS SQL Server.
Ae ui i lea, LINQ fesili e le'i liua i ni tusitusiga sili ona lelei SQL fesili, lea e mafai e se DBA poto masani ona tusia ma faʻamatalaga uma o le faʻaleleia SQL fesili:
feso'ota'iga sili ona lelei (AUAI) ma fa'amama fa'ai'uga (O FEA)
tele nuances i le faʻaaogaina o fesoʻotaʻiga ma tulaga faʻavae
tele fesuiaiga i tulaga suitulaga IN i O LOO IAIи E LE'I I, <> luga O LOO IAI
fa'aputuga vaeluaga o fa'ai'uga e ala i laulau le tumau, CTE, fesuia'iga laulau
fa'aogaina o le fuaiupu (filifiliga) faʻatasi ai ma faʻatonuga ma faʻamatalaga laulau MA (...)
fa'aaogā fa'asinomaga fa'asinomaga o se tasi o auala e fa'ate'a'ese ai fa'amaumauga fa'amaumauga e tele i taimi o filifiliga
O fa'atinoga autu bottlenecks o le taunuuga SQL fesili pe a tuufaatasia LINQ fesili o:
fa'amaopoopoina le faiga atoa o le filifiliga o fa'amaumauga i se talosaga e tasi
fa'aluaina poloka tutusa o code, lea e i'u ai i le tele o fa'amaumauga e le mana'omia
vaega o tulaga e tele vaega (fa'atatau "ma" ma le "po'o") - MA и OR, tuʻufaʻatasia i tulaga faʻalavelave, e taʻitaʻia ai le mea moni e faapea o le optimizer, o loʻo i ai faʻamatalaga talafeagai e le faʻapipiʻiina mo fanua talafeagai, e iu lava ina amata ona suʻesuʻe faʻasaga i le faʻamaufaʻailoga faʻapipiʻi (INDEX SCAN) e vaega o tulaga
O le fa'amomoe loloto o subqueries e fa'alavelave tele ai le fa'avasegaina fa'amatalaga SQL ma au'ili'iliga ole fuafuaga ole fesili ile vaega a le au atia'e ma DBA
Fa'atonu auala
Se'i o tatou aga'i sa'o atu loa i metotia fa'asilisili.
1) Fa'asinomaga fa'aopoopo
E sili ona lelei le iloiloina o filiga i luga o laulau filifilia autu, talu ai e masani lava o le fesili atoa e fausia i luga o le tasi pe lua laulau autu (talosaga-tagata-faʻagaioiga) ma faʻatasi ai ma se seti masani o tulaga (IsClosed, Canceled, Enabled, Status). E taua le faia o fa'ailoga talafeagai mo fa'ata'ita'iga ua fa'ailoa mai.
O lenei fofo e talafeagai pe a filifilia nei matā'upu fa'atapula'aina le seti fa'afo'i ile fesili.
Mo se faʻataʻitaʻiga, e 500000 a matou talosaga. Ae ui i lea, e naʻo le 2000 talosaga faʻamalosi. Ona faasaoina ai lea oi tatou e se faasino igoa sa'o INDEX SCAN i luga o se laulau tele ma o le a faʻatagaina oe e vave filifili faʻamatalaga e ala i se faʻamaufaʻailoga e le faʻapipiʻiina.
E le gata i lea, o le leai o ni fa'asinomaga e mafai ona iloa e ala i fa'atonuga mo le fa'avasegaina o fuafuaga o fesili po'o le aoina o fa'amaumauga o va'aiga. MS SQL Server:
O fa'amatalaga va'aiga uma o lo'o i ai fa'amatalaga e uiga i fa'asinomaga o lo'o misi, se'i vagana ai fa'asinomaga fa'afanua.
Ae ui i lea, o fa'asinomaga ma le fa'asao e masani lava o auala ia e fa'afefe ai i'uga o le le lelei o le tusiaina LINQ fesili и SQL fesili.
E pei ona faʻaalia e le faʻataʻitaʻiga faigata o le olaga, e masani ona taua mo se pisinisi le faʻatinoina o pisinisi i ni taimi faʻapitoa. Ma o le mea lea, o talosaga mamafa e masani ona faʻafeiloaʻi i tua ma le faʻaogaina.
O se vaega e tauamiotonuina, talu ai e le manaʻomia e le tagata faʻaoga faʻamatalaga lata mai ma o loʻo i ai se tulaga taliaina o le tali atu o le tagata faʻaoga.
O lenei faiga e mafai ai ona foia manaoga tau pisinisi, ae iu ai ina faaitiitia le faatinoga o le faiga o faamatalaga i le na o le faatuai o fofo i faafitauli.
E taua foi le manatuaina i le faagasologa o le suʻeina o faʻamatalaga talafeagai e faʻaopoopo, fautuaga MS SQL atonu e le sa'o le fa'atonuga, e aofia ai i lalo o tulaga nei:
pe afai o loʻo i ai faʻasino igoa ma se seti tutusa o fanua
pe afai e le mafai ona fa'asinoina fanua i le laulau ona o tapula'a fa'asinomaga (fa'amatala auiliili iinei).
2) Tuufaatasia uiga i se tasi uiga fou
O nisi taimi o nisi fanua mai le tasi laulau, lea e avea ma faavae mo se vaega o tulaga, e mafai ona suia e ala i le faʻaofiina o se tasi fanua fou.
E moni lava lenei mea mo tulaga tulaga, lea e masani lava a le itiiti po'o le numera i le ituaiga.
Faataitaiga:
IsClosed = 0 MA Fa'aleaogaina = 0 MA Fa'agaoioi = 0 ua suia e Tulaga = 1.
O i'ina e fa'ailoa mai ai le uiga fa'atatau Tulaga integer e fa'amautinoa ai o lo'o fa'atumuina nei tulaga ile laulau. O le isi, o lenei uiga fou e faasino igoa.
O se fofo faʻavae lea i le faʻafitauli faʻatinoga, aua Matou te mauaina faʻamaumauga e aunoa ma ni faʻatusatusaga le manaʻomia.
3) Fa'atinoina o le va'aiga
Ae paga lea, i LINQ fesili E le mafai ona fa'aoga sa'o ia laulau le tumau, CTEs, ma fesuiaiga o laulau.
Ae ui i lea, o loʻo i ai se isi auala e sili ona lelei mo lenei mataupu - faʻasino igoa.
Tulaga vaega (mai le fa'ata'ita'iga i luga) IsClosed = 0 MA Fa'aleaogaina = 0 MA Fa'agaoioi = 0 (po'o se seti o isi tulaga tutusa) avea ma filifiliga lelei e fa'aoga ai i se va'aiga fa'asino igoa, fa'apipi'i sina fasi fa'amaumauga mai se seti tele.
Ae o loʻo i ai le tele o tapulaʻa pe a faʻaalia se vaaiga:
fa'aogaina o subqueries, fuaiupu O LOO IAI e tatau ona suia i le faʻaaogaina AUAI
e le mafai ona e faaaogaina fuaiupu UNION, UNION UMA, FAʻAALIGA, FAATALANOA
E le mafai ona e fa'aogaina fa'ata'ita'iga o laulau ma fa'ai'uga filifiliga
leai se avanoa e galue ai i ta'amilosaga
E le mafai ona faʻaalia faʻamatalaga i le tasi vaaiga mai laulau eseese
E taua le manatua o le aoga moni o le faʻaaogaina o se vaʻaiga faʻasino igoa e mafai ona ausia e ala i le faʻasinoina moni.
Ae a vala'au se va'aiga, e le mafai ona fa'aogaina nei fa'asinomaga, ma ia fa'aoga manino, e tatau ona e fa'ama'oti. MA(NOEXPAND).
Talu mai i totonu LINQ fesili E le mafai ona faʻamatalaina faʻamatalaga laulau, o lea e tatau ai ona e faia se isi faʻatusa - o se "afifi" o le fomu nei:
CREATE VIEW ИМЯ_представления AS SELECT * FROM MAT_VIEW WITH (NOEXPAND);
4) Fa'aaogā galuega fa'atino
E masani i totonu LINQ fesili O poloka tetele o subqueries poʻo poloka e faʻaogaina ai vaaiga faʻatasi ai ma se fausaga lavelave e fausia ai se fesili mulimuli ma se faʻalavelave faʻapitoa ma le faʻaogaina o le faʻatinoga.
Fa'amanuiaga Autu o le Fa'aaogaina o Fuafuaga Laulau i LINQ fesili:
Le gafatia, e pei o le tulaga o manatu, e faʻaaogaina ma faʻamaonia e avea o se mea, ae e mafai ona e pasia se seti o mea faʻaoga: MAI GALUEGA(@param1, @param2 ...)
O le i'uga, e mafai ona maua fa'ata'ita'iga fa'amatalaga fetu'una'i
I le tulaga o le faʻaaogaina o se laulau, e leai ni faʻatapulaʻa malosi e pei o le tulaga o faʻamatalaga faasinoupu o loʻo faʻamatalaina i luga:
Fa'amatalaga o laulau:
e ala i LINQ E le mafai ona e fa'ama'oti po'o fea fa'asino igoa e tatau ona fa'aoga ma fa'amautu le tulaga tu'ufua fa'amaumauga pe a fesiligia.
Ae o le galuega o loʻo i ai nei gafatia.
Fa'atasi ai ma le galuega, e mafai ona e ausia se fuafuaga fa'atino faifai pea, lea e fa'amatalaina ai tulafono mo le galulue fa'atasi ma fa'asinomaga ma fa'amaumauga tu'ufua.
O le faʻaaogaina o le galuega e mafai ai, pe a faʻatusatusa i faʻamatalaga faasino igoa, e maua ai:
fa'amatalaga lavelave fa'ata'ita'iga manatu (tusa lava ma le fa'aogaina o matasele)
aumai fa'amatalaga mai le tele o laulau 'ese'ese
le faaaogaina o UNION и O LOO IAI
Taulaga filifiliga aoga tele pe a tatou manaʻomia le tuʻuina atu o le faʻatonuga faʻatasi FILIFILI(MAXDOP N), le fa'asologa o le fa'atinoga o fuafuaga fa'atatau. Faataitaiga:
e mafai ona e fa'ailoaina se toe fa'atupu fa'amalosi ole fuafuaga ole fesili FILIFILI (RECOMPILE)
e mafai ona e faʻamaonia pe tatau ona faʻamalosia le fuafuaga o fesili e faʻaaoga ai le soʻotaga o loʻo faʻamaonia i le fesili FILIFILI (FORCE ORDER)
Fa'amatalaga atili e uiga i filifiliga faamatalaina iinei.
Fa'aaogā le fasi fa'amatalaga sili ona vaapiapi ma mana'omia:
E le manaʻomia le teuina o faʻamaumauga tetele i totonu o faʻamaumauga (pei o le tulaga i faʻamatalaga faʻasinomaga), lea e te manaʻomia pea ona faʻamama le faʻamaumauga e ala i le parakalafa.
Mo se faʻataʻitaʻiga, o loʻo i ai se laulau e faʻamamaina ai O FEA e tolu fanua e fa'aaogaina (a, b, c).
E masani lava, o talosaga uma e iai se tulaga tumau a = 0 ma le b = 0.
Ae ui i lea, o le talosaga mo le fanua c sili atu le fesuisuiai.
Tuu le tulaga a = 0 ma le b = 0 E fesoasoani tele ia i matou e faʻatapulaʻa le manaʻomia o taunuuga seti i le faitau afe o faʻamaumauga, ae o le tulaga i luga с fa'aititia le filifiliga i lalo i le selau fa'amaumauga.
O le galuega o le laulau atonu o se filifiliga sili atu.
E le gata i lea, o le galuega o le laulau e sili atu ona vaʻaia ma tumau i le taimi o le faʻatinoga.
faataitaiga
Se'i o tatou va'ai i se fa'ata'ita'iga fa'atinoga e fa'aaoga ai le fa'amaumauga o Fesili e fai ma fa'ata'ita'iga.
E iai se talosaga FILIFILI, lea e tu'ufa'atasia ai le tele o laulau ma fa'aoga tasi le va'aiga (OperativeQuestions), lea e siaki ai le feso'ota'iga i imeli (e ala i O LOO IAI) i “Operative Questions”:
Talosaga Nu.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])
));
O le vaaiga e fai si lavelave le fausaga: o loʻo i ai soʻotaga subquery ma faʻaogaina le faʻavasegaina TUSI, lea i se tulaga lautele o se faʻagaioiga faʻapitoa-maualuga.
O se fa'ata'ita'iga mai le OperativeQuestions e tusa ma le sefulu afe fa'amaumauga.
O le fa'afitauli autu i lenei fesili o le mo fa'amaumauga mai le fesili i fafo, o lo'o fa'atinoina se su'esu'ega i totonu i luga o le vaaiga [OperativeQuestions], lea e tatau mo [Imeli] = @p__linq__0 matou te fa'atapula'aina le filifiliga o galuega (e ala i O LOO IAI) e oo atu i le selau o faamaumauga.
Ma e foliga mai e tatau i le subquery ona fuafua faʻamaumauga i le taimi e tasi e [Imeli] = @p__linq__0, ona faʻafesoʻotaʻi lea o nei lua selau faamaumauga e Id ma Fesili, ma o le a vave le fesili.
O le mea moni, o loʻo i ai se fesoʻotaʻiga faʻasolosolo o laulau uma: siaki le fesoʻotaʻiga o Id Questions ma Id mai OperativeQuestions, ma le faʻamamaina e ala ile Email.
O le mea moni, o le talosaga e galue ma le fiasefulu afe o faamaumauga OperativeQuestions, ae naʻo faʻamatalaga o tului e manaʻomia e ala ile Email.
OperativeQuestions va'ai tusitusiga:
Talosaga Nu.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));
Uluai va'aiga fa'afanua ile 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");
}
}
I lenei tulaga faʻapitoa, o loʻo matou iloiloina se fofo i lenei faʻafitauli e aunoa ma ni suiga faʻapitoa, e aunoa ma le faʻaofiina o se laulau eseʻese ma faʻaiʻuga ua saunia ("Active Queries"), lea e manaʻomia ai se masini mo le faʻatumuina o faʻamaumauga ma faʻamaumau i le taimi nei. .
E ui lava o se fofo lelei lea, o loʻo i ai se isi filifiliga e faʻamalieina ai lenei faʻafitauli.
O le fa'amoemoega autu o le fa'asaoina o fa'amaumauga e le [Imeli] = @p__linq__0 mai le vaaiga OperativeQuestions.
Fa'ailoa le galuega o le laulau [dbo].[OperativeQuestionsUserMail] i totonu o fa'amaumauga.
E ala i le tuʻuina atu o le imeli e fai ma faʻamaufaʻailoga, matou te toe maua se laulau o tau:
Talosaga Nu.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
Ole mea lea e toe fa'afo'i ai se laulau o tau fa'atasi ma se fa'asologa o fa'amaumauga.
Ina ia mafai ona sili atu fesili i le OperativeQuestionsUserMail ma maua ni fuafuaga sili ona lelei, e manaʻomia se fausaga faʻapitoa, ae le. FA'AFO'I LA'AU FA'A'ALI'I...
I lenei tulaga, o le Query 1 mana'omia ua liua i le Query 4:
Talosaga Nu.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]);
Fa'afanua vaaiga ma galuega i le 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})");
}
O le faasologa o le taimi o le faʻatinoga ua pa'ū mai le 200-800 ms, i le 2-20 ms, ma isi, o lona uiga o le sefulu taimi vave.
Afai e sili atu le averesi, o lona uiga nai lo le 350 ms e maua le 8 ms.
Mai fa'amanuiaga manino tatou te maua fo'i:
fa'aitiitiga lautele i uta faitau,
fa'aitiitiga taua i le ono poloka
fa'aitiitia le averesi taimi poloka i tau e talia
iʻuga
Fa'asilisili ma fa'alelei fa'alelei o telefoni fa'amaumauga MS SQL e ala i LINQ o se faafitauli e mafai ona foia.
O le gauai atu ma le tumau e taua tele i lenei galuega.
I le amataga o le faagasologa:
e tatau ona siaki faʻamaumauga o loʻo galue ai le talosaga (taua, ituaiga faʻamaumauga filifilia)
faia le fa'asinomaga tatau o nei fa'amaumauga
siaki le sa'o o le tu'ufa'atasiga i le va o laulau
O le isi su'esu'ega fa'alelei e fa'aalia:
fa'avae ole talosaga ma fa'amatala le fa'amama ole talosaga autu
toe fai poloka fesili tutusa ma au'ili'ili le vaeluaga o tulaga
i SSMS poʻo isi GUI mo Tūmau SQL optimizes ia lava SQL fesili (tuuina o se teuina o faʻamatalaga vavalo, fausia le faʻaiʻuga e faʻaaoga ai lenei teuina (atonu e tele))
i le tulaga mulimuli, avea ma faavae o le taunuuga SQL fesili, o loʻo toe faʻaleleia le fausaga LINQ fesili
O le taunuuga LINQ fesili e tatau ona tutusa le fausaga i le tulaga sili ona lelei SQL fesili mai le vaega 3.
Faʻafetai
Faafetai tele i paaga galuega и alex_ozr mai le kamupani Fortis mo fesoasoani i le sauniaina o lenei mea.