Hababka lagu wanaajinayo weydiimaha LINQ ee C#.NET
Horudhac
Π maqaalkani hababka hagaajinta qaarkood ayaa la tixgeliyey Su'aalaha LINQ.
Halkan waxaan sidoo kale ku soo bandhigaynaa qaar ka mid ah habab kale oo dheeraad ah oo lagu hagaajinayo koodka ee la xiriira Su'aalaha LINQ.
Waxaa la og yahay in LINQ(Query-isku-dhafan) waa luuqad fudud oo ku habboon in la waydiiyo isha xogta.
Π LINQ ilaa SQL waa tignoolajiyada lagu galo xogta DBMS. Kani waa qalab awood badan oo lagu shaqaynayo xogta, halkaas oo su'aalaha lagu dhisay luuqad caddaynaysa, oo markaa loo rogi doono Su'aalaha SQL madal oo loo diro server-ka xogta si loo fuliyo. Xaaladeena, DBMS waxaan ula jeednaa MS SQL Server.
Si kastaba ha ahaatee, Su'aalaha LINQ looma rogin kuwo si fiican u qoran Su'aalaha SQL, Kaas oo DBA khibrad leh ay ku qori karto dhammaan nuucyada hagaajinta Su'aalaha SQL:
iyadoo la isticmaalayo aragtiyo la tixgaliyay sida mid ka mid ah siyaabaha looga takhaluso akhrinta xogta aan badnayn inta lagu jiro xulashada
Caqabadaha ugu weyn ee waxqabadka ee natiijada Su'aalaha SQL marka la ururinayo Su'aalaha LINQ waa:
xoojinta habka xulashada xogta oo dhan hal codsi
nuqul ka samaynta blocks isku midka ah ee koodka, kaas oo ugu dambeyntii horseedaya in la akhriyo xog badan oo aan loo baahnayn
kooxo xaalado ka kooban qaybo badan (macquul ah "iyo" iyo "ama") - IYO ΠΈ OR, isku darka galay xaaladaha adag, waxay keenaysaa in xaqiiqda ah in optimizer, isagoo ku habboon indexes aan-clustered ee beeraha lagama maarmaanka ah, ugu dambeyntii bilaabay in ay iskaan ka dhanka ah clustered index (clustered index).INDEX SCAN) kooxo shuruudo ah
buul hoose oo qoto dheer ayaa ka dhigaya falanqaynta dhibaato aad u weyn Odhaahyada SQL iyo falanqaynta qorshaha weydiinta ee dhinaca horumarinta iyo DBA
Hababka hagaajinta
Hadda aynu si toos ah ugu dhaqaaqno hababka hagaajinta.
1) Tilmaansi dheeri ah
Way fiican tahay in la tixgeliyo filtarrada miisaska xulashada ugu weyn, maadaama inta badan dhammaan su'aalaha lagu dhiso hal ama laba miis oo waaweyn (arjiyada-shaqada-dadka) iyo shuruudaha caadiga ah (Waa xiran yahay, la joojiyay, la furay, la furay, heerka). Waa muhiim in la sameeyo tusiyo ku habboon shaybaarrada la aqoonsaday.
Xalkani wuxuu macno samaynayaa marka la dooranayo meelahan si weyn u xaddidaya go'aanka lagu soo celiyay weydiinta.
Tusaale ahaan, waxaanu haynaa 500000 codsi. Si kastaba ha ahaatee, waxaa jira kaliya 2000 codsiyo firfircoon. Dabadeed tilmaan si sax ah loo doortay ayaa naga badbaadin doonta INDEX SCAN on miis weyn oo kuu ogolaanaya inaad si degdeg ah u doorato xogta iyada oo loo marayo index aan-clustered.
Sidoo kale, la'aanta tilmaan-bixineed ayaa lagu aqoonsan karaa iyada oo loo marayo dardar-gelinta falanqaynta qorshayaasha weydiinta ama ururinta tirakoobka aragtida nidaamka MS SQL Server:
Dhammaan xogta aragtida waxay ka kooban tahay macluumaadka ku saabsan tusmooyinka maqan, marka laga reebo tusmooyinka boosaska.
Si kastaba ha ahaatee, tusmooyinka iyo kaydinta inta badan waa habab lagula dagaallamo cawaaqibka qoraalka xun Su'aalaha LINQ ΠΈ Su'aalaha SQL.
Sida dhaqanka qallafsan ee noloshu muujinayo, inta badan waxa muhiim u ah ganacsigu in uu hirgeliyo astaamaha ganacsi wakhtiyada kama dambaysta ah. Sidaa darteed, codsiyada culus ayaa badanaa lagu wareejiyaa asalka iyadoo la kaydinayo.
Tani qayb ahaan waa la caddeeyey, maadaama isticmaaluhu aanu had iyo jeer u baahnayn xogtii ugu dambaysay oo ay jirto heer la aqbali karo oo ka jawaab celin is-dhexgalka isticmaalaha.
Waxa kale oo mudan in la xasuusto in habka raadinta tusmooyinka lagama maarmaanka ah lagu daro, soo jeedinta MS SQL hagaajintu waxay noqon kartaa khalad, oo ay ku jiraan xaaladaha soo socda:
haddii ay jiraan tusmooyin la mid ah goobo la mid ah
haddii beeraha shaxda aan la tix-raaci karin sababtoo ah xaddidaadaha tusmaynta (oo si faahfaahsan loo sharraxay halkan).
2) Isku-dubarid sifada hal sifo oo cusub
Mararka qaarkood meelaha qaar ee hal miis, kuwaas oo u adeega sida aasaaska koox shuruudo ah, waxaa lagu bedeli karaa in la soo bandhigo hal goob oo cusub.
Tani waxay si gaar ah run ugu tahay goobaha heerka, kuwaas oo inta badan ah ama xoogaa yar ama tiro ahaan.
Tusaale:
Is-xiran = 0 waana la joojiyay = 0 oo la dajiyay = 0 waxaa bedelay Xaaladda = 1.
Halkani waa meesha sifada heerka isugaynta laga soo bandhigay si loo hubiyo in heerarkan ay ka buuxaan miiska. Marka xigta, sifadan cusub waa la tusmeeyay.
Tani waa xalka aasaasiga ah ee dhibaatada waxqabadka, sababtoo ah Waxaan helnaa xogta iyada oo aan xisaabin loo baahnayn.
3) Qalabaynta aragtida
Nasiib darro gudaha Su'aalaha LINQ Miisaska ku meel gaadhka ah, CTE-yada, iyo doorsoomayaasha miiska si toos ah looma isticmaali karo.
Si kastaba ha ahaatee, waxaa jira hab kale oo lagu hagaajin karo kiiskan - indexed views.
Kooxda xaaladaha (laga bilaabo tusaalaha sare) Is-xiran = 0 waana la joojiyay = 0 oo la dajiyay = 0 (ama shuruudo kale oo la mid ah) waxay noqotaa ikhtiyaar wanaagsan in lagu isticmaalo aragti la tilmaansaday, iyadoo la kaydinayo cad yar oo xog ah oo laga soo qaaday gogol weyn.
Laakiin waxaa jira tiro xaddidaadyo ah marka la xaqiijinayo aragtida:
isticmaalka subqueries, clauses JIRA waa in lagu badalaa iyadoo la isticmaalayo JOIN
ma isticmaali kartid jumlado UNION, MIDOW DHAMMAAN, MARKA LAGA REEBO, INTIRSAN
Ma isticmaali kartid tilmaanta miiska iyo qodobbada OPTION
suurtogal ma aha in lagu shaqeeyo wareegyada
Suurtagal maaha in xogta lagu soo bandhigo hal aragti oo laga soo qaatay miisas kala duwan
Waxaa muhiim ah in la xasuusto in faa'iidada dhabta ah ee isticmaalka aragtida la calaamadeeyay lagu gaari karo oo kaliya in dhab ahaantii la calaamadiyo.
Laakin markaad wacdo aragti, tusmooyinkan waxaa laga yaabaa inaan la isticmaalin, iyo si aad si cad ugu isticmaasho, waa inaad qeexdaa leh (NOEXPAND).
Tan iyo markii Su'aalaha LINQ Suurtagal maaha in la qeexo tilmaamaha miiska, markaa waa inaad abuurtaa matalaad kale - "duub" ee foomka soo socda:
CREATE VIEW ΠΠΠ―_ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ AS SELECT * FROM MAT_VIEW WITH (NOEXPAND);
4) Isticmaalka hawlaha miiska
Inta badan gudaha Su'aalaha LINQ Baloogyo waaweyn oo su'aalo-hoosaadyo ah ama baloogyo isticmaalaya aragtiyo leh qaab-dhismeed kakan ayaa sameeya waydiin kama dambays ah oo leh qaab-fulin aad u adag oo hooseeya.
Faa'iidooyinka Muhiimka ah ee Isticmaalka Hawlaha Miiska ee gudaha Su'aalaha LINQ:
Awoodda, sida dhinaca aragtida, in loo isticmaalo oo lagu qeexo shay ahaan, laakiin waxaad gudbin kartaa jaangooyooyin wax gelin ah: KA SOCOTA SHAQADA (@param1, @param2 ...)
Natiijo ahaan, muunad xog dabacsan ayaa la gaari karaa
Marka laga hadlayo isticmaalka shaqada miiska, ma jiraan xaddidaadyo xooggan sida marka la eego aragtida la tilmaansaday ee kor lagu sharraxay:
Tilmaamaha miiska:
iyada oo loo marayo LINQ Ma cayimi kartid tusmooyinka ay tahay in la isticmaalo oo go'aamin kartid heerka go'doominta xogta marka la waydiinayo.
Laakiin shaqadu waxay leedahay awoodahaas.
Hawsha, waxaad ku gaadhi kartaa qorshe su'aal fulineed oo joogto ah, halkaasoo xeerarka ku shaqaynta tusmooyinka iyo heerarka go'doominta xogta lagu qeexay
Isticmaalka shaqadu waxa ay ogolanaysaa, marka la barbardhigo aragtiyaha la calaamadeeyay, in la helo:
ka soo qaadashada xogta miisasyo badan oo kala duwan
isticmaalka UNION ΠΈ JIRA
Bixi OPTION aad u faa'iido leh marka aan u baahanahay inaan bixino kontoroolka kontoroolka OPTION(MAXDOP N), sida ay u kala horreeyaan qorshaha fulinta weydiinta. Tusaale ahaan:
waxaad qeexi kartaa dib-u-abuur lagu qasbay qorshaha weydiinta Ikhtiyaarka (dib u soo ururi)
waxaad qeexi kartaa inaad ku qasbi karto qorshaha waydiinta inuu isticmaalo amarka ku biirista ee lagu sheegay waydiinta Ikhtiyaarka (AMAR XOOGGA)
Faahfaahin dheeraad ah oo ku saabsan OPTION lagu tilmaamay halkan.
Adigoo isticmaalaya jeex xogta ugu cidhiidhi ah oo loo baahan yahay:
Looma baahna in lagu kaydiyo xogta waaweyn ee khasnado (sida xaaladdu tahay aragtida la tilmaansaday), taas oo aad weli u baahan tahay inaad xogta ku shaandhayso.
Tusaale ahaan, waxa jira miis shaandhayntiisa HALKEE saddex beerood ayaa loo isticmaalaa (a, b, c).
Caadiyan, dhammaan codsiyada waxay leeyihiin xaalad joogto ah a = 0 iyo b = 0.
Si kastaba ha ahaatee, codsiga garoonka c doorsoomayaal badan.
Allow shardi a = 0 iyo b = 0 Waxay runtii naga caawinaysaa inaan xaddidno natiijada loo baahan yahay ee kumanaan diiwaanno ah, laakiin xaaladdu way jirtaa Ρ wuxuu soo koobayaa doorashada ilaa boqol diiwaan.
Halkan shaqada miiska ayaa laga yaabaa inay noqoto ikhtiyaar ka fiican.
Sidoo kale, shaqada miiska ayaa ah mid la saadaalin karo oo joogto ah waqtiga fulinta.
Waxaa jira codsi Dooro, kaas oo isku dara dhawr jadwal oo adeegsada hal aragti (OperativeQuestions), kaas oo xidhiidhka email ahaan lagu hubiyo (iyada oo loo marayo JIRA) ilaa "Su'aalaha Firfircoon" ([OperativeQuestions]):
Codsiga No. 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])
));
Tusaalaha Su'aalaha Operative waa ilaa toban kun oo diiwaan.
Dhibaatada ugu weyn ee su'aashan ayaa ah in diiwaanada ka yimid su'aalaha dibadda, subquery gudaha ah ayaa lagu fuliyay aragtida [OperativeQuestions], taas oo ah [Email] = @p__linq__0 waxay noo ogolaataa inaan xaddidno xulashada wax soo saarka (iyada oo loo marayo JIRA) ilaa boqollaal diiwaan.
Waxayna u ekaan kartaa in subquery uu ku xisaabinayo diiwaanada hal mar [Email] = @p__linq__0, ka dibna labadan boqol ee diiwaanka waa in lagu xidhaa Id Su'aalo, waydiinadu waxay noqon doontaa mid degdeg ah.
Dhab ahaantii, waxaa jira isku xirnaan xiriir ah oo dhammaan miisaska: hubinta waraaqaha Aqoonsiga Su'aalaha Id ee Su'aalaha Operative, iyo ku shaandhaynta iimaylka.
Dhab ahaantii, codsigu wuxuu la shaqeeyaa dhammaan tobanaan kun ee Diiwaanka Su'aalaha Operative, laakiin kaliya xogta xiisaha ayaa looga baahan yahay iimaylka.
OperativeSu'aalaha eeg qoraalka:
Codsiga No. 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));
Khariidaynta aragtida hore ee 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");
}
}
Xaaladdan gaarka ah, waxaan ka fekereynaa xalinta dhibaatadan iyada oo aan isbeddelin kaabayaal dhaqaale ah, iyada oo aan la soo bandhigin miis gaar ah oo leh natiijooyin diyaarsan ("Queries Active"), kaas oo u baahan doona hab lagu buuxiyo xogta iyo la socoshada taariikhda. .
Inkasta oo tani ay tahay xal wanaagsan, waxaa jira ikhtiyaar kale oo lagu hagaajin karo dhibaatadan.
Ujeedada ugu weyn waa in lagu kaydiyo gelinta [Email] = @p__linq__0 laga soo bilaabo aragtida OperativeQuestions.
Soo bandhig shaqada miiska [dbo].[OperativeQuestionsUserMail] gal xogta xogta.
Marka aan dirno iimaylka sidii halbeeg gelinta, waxaanu dib u helaynaa shaxda qiyamka:
Codsiga No. 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
Tani waxay soo celinaysaa shaxda qiyamka oo leh qaab-dhismeed xog hore loo qeexay.
Si su'aalaha OperativeQuestionsUserMail ay u noqdaan kuwa ugu wanaagsan oo ay yeeshaan qorshooyin weydiin wanaagsan, qaabdhismeed adag ayaa loo baahan yahay, oo aan loo baahnayn. MIISKA U SOO NOQDA SIDA SOO NOQOSHADA...
Xaaladdan oo kale, weydiinta 1 ee loo baahan yahay waxaa loo rogaa weydiinta 4:
Codsiga No. 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]);
ku celcelinta baloogyada su'aalaha la midka ah iyo falanqaynta is-goysyada xaaladaha
SSMS ama GUI kale oo loogu talagalay SQL Server is wanaajiso Su'aasha SQL (Qoritaanka kaydinta xogta dhexdhexaadka ah, dhisida su'aalaha natiijada iyadoo la adeegsanayo kaydintan (waxaa jiri kara dhowr))
marxalada ugu danbeysa, anagoo ku salaynaya natiijada Su'aasha SQL, dhismihii waa la dhisayaa Weydiinta LINQ
Natiijada Weydiinta LINQ waa inuu noqdaa mid la mid ah qaab dhismeedka kan la aqoonsaday Su'aasha SQL laga bilaabo qodobka 3aad.
Mahadnaq
Aad baad u mahadsantahay asxaabta jobgemws ΠΈ alex_ozr ka shirkadda Fortis si loogu caawiyo diyaarinta alaabtan.