рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реИ?
рдХреИрд╢рд┐рдВрдЧ рдЕрдХреНрд╕рд░ рдЧреИрд░-рд╕реНрдереИрддрд┐рдХ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреАрдврд╝реА рдХреЛ рдХреБрдЫ рдЕрд╕рдВрддреЛрд╖рдЬрдирдХ рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрд╡рд╛ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдкреИрджрд╛ рд╣реБрдЖ рдерд╛ рдХрд┐ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рдПрдХрд▓-рдореВрд▓реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдкрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
рд╕рдорд╛рдзрд╛рди рдХреЗ рд╡рд┐рдХрд▓реНрдкред
- рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛, рдПрдХ рдиреМрдХрд░реА рдпрд╛ рдЕрдиреНрдп рд╡рд┐рдХреГрдд рдиреГрддреНрдпреЛрдВ рдореЗрдВ рдПрдХ рдЕрдиреБрд╕реВрдЪрд┐рдд рдЕрджреНрдпрддрди рдкреНрд░рдХреНрд░рд┐рдпрд╛, рдЗрд╕ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ / рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рдХрд┐рд╕реА рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░реВрдкреЛрдВред
рдкреЗрд╢реЗрд╡рд░реЛрдВ: рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ, рддреНрд╡рд░рд┐рдд рдЙрдкрдпреЛрдЧ / рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ред
рд╡рд┐рдкрдХреНрд╖: рдЕрддрд┐рд░рд┐рдХреНрдд рдФрд░ рдЕрд╕реБрд╡рд┐рдзрд╛ рдЬрдм рдбреЗрдЯрд╛ рдХреИрд╢рд┐рдВрдЧ - рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛, рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬреЛ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдирд┐рдХрд╛рд▓рддреА рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛ - рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдЗрдХрд┐рд▓ - рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ, рдЕрдЧрд░ рд╡рд╣рд╛рдБ рд╣реИ, рддреЛ рдпрд╣ рджреЗрддрд╛ рд╣реИ, рдирд╣реАрдВ, рдпрд╣ рдЙрдкрд░реЛрдХреНрдд <рд╕реЗрд╡рд╛> рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕реЗ рджреЗрддрд╛ рд╣реИред
рдкреЗрд╢реЗрд╡рд░реЛрдВ: рдХреЙрдореНрдкреИрдХреНрдЯ рд╕рдорд╛рдзрд╛рди
рд╡рд┐рдкрдХреНрд╖: рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, MS SQL рдореЗрдВ рд╣рдо 'StoredProcedure` рд╕реЗ "select * рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓" Table` exec` StoredProcedure` рдореЗрдВ рдбрд╛рд▓реЗрдВ " - рджрд░рдЕрд╕рд▓, рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рд╡рд┐рдХрд▓реНрдкред рд╣рдо рдПрдХ рд╕реНрдерд┐рд░ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реАрдПрд▓рдЖрд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд / рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред
рдкреЗрд╢реЗрд╡рд░реЛрдВ: рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдФрд░ рдХрд╛рдлреА рддреНрд╡рд░рд┐рдд рд╕рдорд╛рдзрд╛рдиред
рд╡рд┐рдкрдХреНрд╖: рд╕реАрдПрд▓рдЖрд░ рдореЗрдВ рд╕реНрдереИрддрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИред - рдФрд░ рдпрд╣ CLR рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рднрдпрд╛рдирдХ рдФрд░ рдХреБрдЯрд┐рд▓ рд╣реИрдХ рд╣реИ, рдЬреЛ рдПрдХ рдЕрд▓рдЧ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рд▓рд┐рдЦ тАЛтАЛрджреЗрдЧрд╛ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рд╣реИ рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрд╡рд╛ рд╣реИ рдЬреЛ рдПрдХ рдкреЗрдбрд╝ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИ рдЬреЛ рдХрд┐ рдЕрдХреНрд╕рд░ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ (рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде, рдЖрдорддреМрд░ рдкрд░ рд▓рдЧрднрдЧ 10-15 рд╕реЗрдХрдВрдб), рдФрд░, рдЕрдиреБрд░реЛрдз рдкрд░, рдЖрдИрдбреА рд╢реАрдЯ (рдкреВрд░реНрд╡ рдЖрдИрдбреА) рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреИрд░-рдЬрд▓реНрджреА рдЙрддреНрдкрдиреНрди рдкрде рджреЗрддрд╛ рд╣реИред 2012, рдкреЗрдЯ = рдореБрдЦреНрдп / рдкрд░реАрдХреНрд╖рдХ / рдЖрдЙрдЯрд▓реЗрдЯ)ред
SQL рд╕рд░реНрд╡рд░ рдкрд░ рд╣реА
CREATE FUNCTION [dbo].[GetPath] ( @ID INT ) RETURNS VARCHAR(512) AS BEGIN DECLARE @__CACHE_ENABLED BIT = 0;
рдФрд░ рд╣рдо рдЗрд╕ рдЦреБрд╢реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдЧрд╛рддрд╛рд░ рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рдЕрдиреБрд░реЛрдз рдЬреИрд╕реЗ рдХрд┐ рдХрд░рддреЗ рд╣реИрдВ
SELECT ID, dbo.GetPath(ID) FROM GROUPS WHERE ID IN (тАж)
рдЦреИрд░, рдФрд░ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╕реМрджрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛
private static readonly ThreadSafeDictionary<string, ThreadSafeDictionary<string, CacheData>> Cache = new ThreadSafeDictionary<string, ThreadSafeDictionary<string, CacheData>>(); [Microsoft.SqlServer.Server.SqlFunction] public static bool CacheAdd(SqlString section, SqlString key, SqlString value, SqlInt32 availms) { ThreadSafeDictionary<string, CacheData> ht; Cache.TryGetValue(section.Value, out ht); if (null == ht) { ht = new ThreadSafeDictionary<string, CacheData>(); Cache[section.Value] = ht; } DateTime dt = DateTime.Now; ht[key.Value] = new CacheData(value.Value, dt.AddMilliseconds(availms.Value)); return true; } [Microsoft.SqlServer.Server.SqlFunction] public static SqlString CacheGet(SqlString section, SqlString key) { ThreadSafeDictionary<string, CacheData> ht; bool b = Cache.TryGetValue(section.Value, out ht); if (!b || null == ht) return SqlString.Null; CacheData sdp; b = ht.TryGetValue(key.Value, out sdp); if (!b) return SqlString.Null; if (sdp.OutDate > DateTime.Now) { return sdp.Value; } else { ht.Remove(key.Value); } return SqlString.Null; }
рдФрд░ рдЕрдВрдд рдореЗрдВ -
SQLServer'e рдкрд░ рдПрдХ рд╕реНрдерд┐рд░ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рд╕реЗрдЯ = рдЕрдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
рд╕рдорд╛рдзрд╛рди, рдмрд▓реНрдХрд┐, "рдЕрдЧрд░ рд╣рдо рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдмрд┐рдЧрд╛рдбрд╝рддреЗ рд╣реИрдВ" рдХреА рд╢реНрд░реЗрдгреА рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд▓реЛрдб рдкрд░ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИред
рдкреВрд░реНрдг рдЕрд╕реЗрдВрдмрд▓реА рдХреЛрдб, рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдореИрдВ рдмрд╛рд╣рд░ рд░рдЦ рд╕рдХрддрд╛ рд╣реВрдВред
рдЕрд╕реНрд╡реАрдХрд░рдг: рдПрдордПрд╕ рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рд╕рдЯреАрдХред рдбреЗрдЯрд╛ рдХреЗ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рднрдВрдбрд╛рд░рдг рдХреА рдХрднреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред