Балансировка записи ΠΈ чтСния Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…

Балансировка записи ΠΈ чтСния Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…
Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я описал ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, построСнноС Π½Π° основС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π° Π½Π΅ Ρ‚Π°Π±Π»ΠΈΡ† ΠΈ ΠΏΠΎΠ»Π΅ΠΉ ΠΊΠ°ΠΊ Π² рСляционных Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Π’ Π½Π΅ΠΉ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ мноТСство ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… прСимущСства Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΏΠ΅Ρ€Π΅Π΄ классичСским. МногиС сочли ΠΈΡ… нСдостаточно ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я ΠΏΠΎΠΊΠ°ΠΆΡƒ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ такая концСпция позволяСт быстро ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π±Π°Π»Π°Π½ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запись ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ измСнСния Π»ΠΎΠ³ΠΈΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹. ΠŸΠΎΡ…ΠΎΠΆΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² соврСмСнных коммСрчСских Π‘Π£Π‘Π” (Π² частности, Oracle ΠΈ Microsoft SQL Server). Π’ ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ я ΠΏΠΎΠΊΠ°ΠΆΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Ρƒ Π½ΠΈΡ…, мягко говоря, Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ.

ОписаниС

Как ΠΈ Ρ€Π°Π½Π΅Π΅, для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ понимания я Π½Π°Ρ‡Π½Ρƒ описаниС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ список ΠΎΡ‚Π΄Π΅Π»ΠΎΠ² с количСством сотрудников Π² Π½ΠΈΡ… ΠΈ ΠΈΡ… суммарной Π·Π°Ρ€ΠΏΠ»Π°Ρ‚ΠΎΠΉ.

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… это Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

CLASSΒ DepartmentΒ β€˜ΠžΡ‚Π΄Π΅Π»β€™;
nameΒ β€˜ΠΠ°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅β€™Β =Β DATAΒ STRING[100]Β (Department);

CLASSΒ EmployeeΒ β€˜Π‘ΠΎΡ‚Ρ€ΡƒΠ΄Π½ΠΈΠΊβ€™;
departmentΒ β€˜ΠžΡ‚Π΄Π΅Π»β€™Β =Β DATAΒ DepartmentΒ (Employee);
salaryΒ β€˜Π—Π°Ρ€ΠΏΠ»Π°Ρ‚Π°β€™Β =Β Β DATAΒ NUMERIC[10,2]Β (Employee);

countEmployeesΒ β€˜ΠšΠΎΠ»-во сотрудников’ (DepartmentΒ d)Β =Β 
Β Β Β Β GROUPΒ SUMΒ 1Β IFΒ department(EmployeeΒ e)Β =Β d;
salarySumΒ β€˜Π‘ΡƒΠΌΠΌΠ°Ρ€Π½Π°ΡΒ Π·Π°Ρ€ΠΏΠ»Π°Ρ‚Π°β€™Β (DepartmentΒ d)Β =Β 
Β Β Β Β GROUPΒ SUMΒ salary(EmployeeΒ e)Β IFΒ department(e)Β =Β d;

SELECTΒ name(DepartmentΒ d),Β countEmployees(d),Β salarySum(d);

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ выполнСния этого запроса Π² любой Π‘Π£Π‘Π” Π±ΡƒΠ΄Π΅Ρ‚ эквивалСнтна O(ΠΊΠΎΠ»-Π²ΠΎ сотрудников), Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для этого вычислСния Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всю Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ сотрудников, Π° Π·Π°Ρ‚Π΅ΠΌ ΡΠ³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»Ρƒ. Π’Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ нСкоторая нСбольшая (считаСм, Ρ‡Ρ‚ΠΎ сотрудников Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС Ρ‡Π΅ΠΌ ΠΎΡ‚Π΄Π΅Π»ΠΎΠ²) Π΄ΠΎΠ±Π°Π²ΠΊΠ° Π² зависимости ΠΎΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ»Π°Π½Π° O(log ΠΊΠΎΠ»-Π²Π° сотрудников) ΠΈΠ»ΠΈ O(ΠΊΠΎΠ»-Π²ΠΎ ΠΎΡ‚Π΄Π΅Π»ΠΎΠ²) Π½Π° Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π΅.

ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Π² Ρ€Π°Π·Π½Ρ‹Ρ… Π‘Π£Π‘Π”, Π½ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ измСнится Π½ΠΈΠΊΠ°ΠΊ.

Π’ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ Π‘Π£Π‘Π” сформируСт ΠΎΠ΄ΠΈΠ½ подзапрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вычислит Π½ΡƒΠΆΠ½Ρ‹Π΅ значСния ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»Ρƒ, Π° Π·Π°Ρ‚Π΅ΠΌ сдСлаСт JOIN с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ ΠΎΡ‚Π΄Π΅Π»ΠΎΠ² для получСния ΠΈΠΌΠ΅Π½ΠΈ. Однако, для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ объявлСнии Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ MATERIALIZED. БистСма автоматичСски создаст ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ»Π΅ ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Ρ‚Π°ΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. ΠŸΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля. ΠŸΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ΄Ρ‚ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ ΠΊ прСподсчитанному полю.

Π’ частности, Ссли ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ MATERIALIZED для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ countEmployees ΠΈ salarySum, Ρ‚ΠΎ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ со списком ΠΎΡ‚Π΄Π΅Π»ΠΎΠ² добавятся Π΄Π²Π° поля, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄ΡƒΡ‚ хранится количСство сотрудников ΠΈ ΠΈΡ… суммарная Π·Π°Ρ€ΠΏΠ»Π°Ρ‚Π°. ΠŸΡ€ΠΈ любом ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ сотрудников, ΠΈΡ… Π·Π°Ρ€ΠΏΠ»Π°Ρ‚ ΠΈΠ»ΠΈ принадлСТности ΠΊ ΠΎΡ‚Π΄Π΅Π»Π°ΠΌ систСма Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ значСния этих ΠΏΠΎΠ»Π΅ΠΉ. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΆΠ΅ Π²Ρ‹ΡˆΠ΅ запрос станСт ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ нСпосрСдствСнно ΠΊ этим полям ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π·Π° O(ΠΊΠΎΠ»-Π²ΠΎ ΠΎΡ‚Π΄Π΅Π»ΠΎΠ²).

КакиС ограничСния? Волько ΠΎΠ΄Π½ΠΎ: Ρƒ Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ число Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ. Π˜Π½Π°Ρ‡Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, Ρ…Ρ€Π°Π½ΡΡ‰ΡƒΡŽ всС Π΅Π΅ значСния, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ с бСсконСчным количСством рядов.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

employeesCountΒ β€˜ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎΒ ΡΠΎΡ‚Ρ€ΡƒΠ΄Π½ΠΈΠΊΠΎΠ²Β ΡΒ Π·Π°Ρ€ΠΏΠ»Π°Ρ‚ΠΎΠΉΒ >Β N’ (DepartmentΒ d,Β NUMERIC[10,2]Β N)Β =Β 
Β Β Β Β GROUPΒ SUMΒ salary(EmployeeΒ e)Β IFΒ department(e)Β =Β dΒ ANDΒ salary(e)Β >Β N;

Π­Ρ‚Π° функция ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° для бСсконСчного количСства Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ числа N (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ любоС ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π° Π½Π΅Π΅ нСльзя ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ MATERIALIZED. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, это логичСскоС, Π° Π½Π΅ тСхничСскоС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ смогли это Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ). Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ β€” Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠΈ, сортировки, AND ΠΈ OR, PARTITION, рСкурсии ΠΈ Ρ‚.Π΄.

НапримСр, Π² Π·Π°Π΄Π°Ρ‡Π΅ 2.2 ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ MATERIALIZED Π½Π° ΠΎΠ±Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

boughtΒ 'ΠšΡƒΠΏΠΈΠ»'Β (CustomerΒ c,Β ProductΒ p,Β INTEGERΒ y)Β =Β 
Β Β Β Β GROUPΒ SUMΒ sum(DetailΒ d)Β IFΒ 
Β Β Β Β Β Β Β Β customer(order(d))Β =Β cΒ ANDΒ 
Β Β Β Β Β Β Β Β product(d)Β =Β pΒ ANDΒ 
Β Β Β Β Β Β Β Β extractYear(date(order(d)))Β =Β yΒ MATERIALIZED;
ratingΒ 'Π Π΅ΠΉΡ‚ΠΈΠ½Π³'Β (CustomerΒ c,Β ProductΒ p,Β INTEGERΒ y)Β =Β 
Β Β Β Β PARTITIONΒ SUMΒ 1Β ORDERΒ DESCΒ bought(c,Β p,Β y),Β pΒ BYΒ c,Β yΒ MATERIALIZED;
SELECTΒ contactName(CustomerΒ c),Β name(ProductΒ p)Β WHEREΒ rating(c,Β p,Β 1997)Β <Β 3;

БистСма сама создаст ΠΎΠ΄Π½Ρƒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠΎΠ² Customer, Product ΠΈ INTEGER, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ Π² Π½Π΅Π΅ Π΄Π²Π° поля ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Π² Π½ΠΈΡ… значСния ΠΏΠΎΠ»Π΅ΠΉ ΠΏΡ€ΠΈ Π»ΡŽΠ±Ρ‹Ρ… измСнСниях. ΠŸΡ€ΠΈ Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΡ… обращСниях ΠΊ этим функциям Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΡ… расчСт, Π° Π±ΡƒΠ΄ΡƒΡ‚ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ значСния ΠΈΠ· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ»Π΅ΠΉ.

ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ этого ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·Π±Π°Π²Π»ΡΡ‚ΡŒΡΡ ΠΎΡ‚ Π² рСкурсий (CTE) Π² запросах. Π’ частности, рассмотрим Π³Ρ€ΡƒΠΏΠΏΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ child/parent (Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π΅ΡΡ‚ΡŒ ссылка Π½Π° своСго родитСля):

parentΒ =Β DATAΒ GroupΒ (Group);

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π»ΠΎΠ³ΠΈΠΊΡƒ рСкурсий ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

levelΒ (GroupΒ child,Β GroupΒ parent)Β =Β RECURSIONΒ 1lΒ IFΒ childΒ ISΒ GroupΒ ANDΒ parentΒ ==Β child
Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β STEPΒ 2lΒ IFΒ parentΒ ==Β parent($parent);
isParentΒ (GroupΒ child,Β GroupΒ parent)Β =Β TRUEΒ IFΒ level(child,Β parent)Β MATERIALIZED;

Π’Π°ΠΊ ΠΊΠ°ΠΊ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ isParent проставлСн MATERIALIZED, Ρ‚ΠΎ ΠΏΠΎΠ΄ Π½Π΅Π΅ Π±ΡƒΠ΄Π΅Ρ‚ создана Ρ‚Π°Π±Π»ΠΈΡ†Π° с двумя ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ (Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»Π΅ isParent Π±ΡƒΠ΄Π΅Ρ‚ истинным Ρ‚ΠΎΠ»ΡŒΠΊΠΎ, Ссли ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ являСтся ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ записСй Π² этой Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ количСству Π³Ρ€ΡƒΠΏΠΏ, ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½Π½ΠΎΠΌΡƒ Π½Π° ΡΡ€Π΅Π΄Π½ΡŽΡŽ Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ Π΄Π΅Ρ€Π΅Π²Π°. Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ количСство ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

childrenCountΒ (GroupΒ g)Β =Β GROUPΒ SUMΒ 1Β IFΒ isParent(GroupΒ child,Β g);

Никакого CTE Π² SQL запросС ΠΏΡ€ΠΈ этом Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. ВмСсто этого Π±ΡƒΠ΄Π΅Ρ‚ простой GROUP BY.

ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ этого ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π»Π΅Π³ΠΊΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π΄Π΅Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ нСобходимости:

CLASSΒ OrderΒ 'Π—Π°ΠΊΠ°Π·';
dateΒ 'Π”Π°Ρ‚Π°'Β =Β DATAΒ DATEΒ (Order);

CLASSΒ OrderDetailΒ 'Π‘Ρ‚Ρ€ΠΎΠΊΠ°Β Π·Π°ΠΊΠ°Π·Π°';
orderΒ 'Π—Π°ΠΊΠ°Π·'Β =Β DATAΒ OrderΒ (OrderDetail);
dateΒ 'Π”Π°Ρ‚Π°'Β (OrderDetailΒ d)Β =Β date(order(d))Β MATERIALIZEDΒ INDEXED;

ΠŸΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ date для строки Π·Π°ΠΊΠ°Π·Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ΄Ρ‚ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ со строками Π·Π°ΠΊΠ°Π·ΠΎΠ² поля, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π΅ΡΡ‚ΡŒ индСкс. ΠŸΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΄Π°Ρ‚Ρ‹ Π·Π°ΠΊΠ°Π·Π° систСма Π±ΡƒΠ΄Π΅Ρ‚ сама автоматичСски ΠΏΠ΅Ρ€Π΅ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π΅Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΡƒΡŽ Π΄Π°Ρ‚Ρƒ Π² строкС.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°

Для Ρ‡Π΅Π³ΠΎ вСсь этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π½ΡƒΠΆΠ΅Π½? Π’ классичСских Π‘Π£Π‘Π”, Π±Π΅Π· пСрСписывания запросов, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΠ»ΠΈ DBA ΠΌΠΎΠ³ΡƒΡ‚ лишь ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ индСксы, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ статистику ΠΈ ΠΏΠΎΠ΄ΡΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΡƒ запросов, ΠΊΠ°ΠΊ ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ (ΠΏΡ€ΠΈΡ‡Π΅ΠΌ HINT’Ρ‹ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² коммСрчСских Π‘Π£Π‘Π”). Как Π±Ρ‹ ΠΎΠ½ΠΈ Π½Π΅ ΡΡ‚Π°Ρ€Π°Π»ΠΈΡΡŒ, ΠΎΠ½ΠΈ Π½Π΅ смогут ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ запрос Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π·Π° О (ΠΊΠΎΠ»-Π²ΠΎ ΠΎΡ‚Π΄Π΅Π»ΠΎΠ²) Π±Π΅Π· измСнСния запросов ΠΈ дописывания Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠ². Π’ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ ΠΆΠ΅ схСмС, Π½Π° этапС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎ структурС хранСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ Π°Π³Ρ€Π΅Π³Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π­Ρ‚ΠΎ всС ΠΌΠΎΠΆΠ½ΠΎ спокойно ΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π° Π»Π΅Ρ‚Ρƒ ΡƒΠΆΠ΅ нСпосрСдствСнно Π² эксплуатации.

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ это выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. НСкоторыС люди Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ нСпосрСдствСнно Π»ΠΎΠ³ΠΈΠΊΡƒ Π½Π° основС поставлСнной Π·Π°Π΄Π°Ρ‡ΠΈ. Они Π½Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Π½ΠΈ Π² Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°Ρ… ΠΈ ΠΈΡ… слоТности, Π½ΠΈ Π² ΠΏΠ»Π°Π½Π°Ρ… выполнСния, Π½ΠΈ Π² Ρ‚ΠΈΠΏΠ°Ρ… join’ов, Π½ΠΈ Π² любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ тСхничСской ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ. Π­Ρ‚ΠΈ люди β€” скорСС бизнСс-Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ, Ρ‡Π΅ΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ. Π—Π°Ρ‚Π΅ΠΌ, всС это ΠΈΠ΄Π΅Ρ‚ Π² тСстированиС ΠΈΠ»ΠΈ ΡΠΊΡΠΏΠ»ΡƒΠ°Ρ‚Π°Ρ†ΠΈΡŽ. Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… запросов. Когда обнаруТиваСтся Π΄ΠΎΠ»Π³ΠΈΠΉ запрос, Ρ‚ΠΎ ΡƒΠΆΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ людьми (Π±ΠΎΠ»Π΅Π΅ тСхничСскими β€” ΠΏΠΎ сути DBA) принимаСтся Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ MATERIALIZED Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Π΅ΠΌ самым Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ замСдляСтся запись (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ трСбуСтся ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поля Π² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ). Однако, Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ускоряСтся Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ этот запрос, Π½ΠΎ ΠΈ всС Π΄Ρ€ΡƒΠ³ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. ΠŸΡ€ΠΈ этом принятиС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΡƒΡŽ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ принимаСтся ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСслоТно. Π”Π²Π° основных ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: ΠΊΠΎΠ»-Π²ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ (ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ записСй Π±ΡƒΠ΄Π΅Ρ‚ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅), ΠΈ насколько часто ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… функциях.

Аналоги

Π’ соврСмСнных коммСрчСских Π‘Π£Π‘Π” Π΅ΡΡ‚ΡŒ схоТиС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹: MATERIALIZED VIEW с FAST REFRESH (Oracle) ΠΈ INDEXED VIEW (Microsoft SQL Server). Π’ PostgreSQL MATERIALIZED VIEW Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ Π² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ запросу (Π΄Π° Π΅Ρ‰Π΅ с совсСм ТСсткими ограничСниями), Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π½Π΅ рассматриваСм. Но Ρƒ Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ нСсколько ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΈΡ… использованиС.

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ, Ссли Ρƒ вас ΡƒΠΆΠ΅ Π±Ρ‹Π» создан ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ VIEW. Π˜Π½Π°Ρ‡Π΅ придСтся ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ запросы Π½Π° ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ вновь созданному ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Или ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ всС ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ, Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ нСэффСктивно, Ссли Π΅ΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΡƒΠΆΠ΅ прСподсчитанныС Π΄Π°Π½Π½Ρ‹Π΅, Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ запросы ΠΈΡ… Π½Π΅ всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚, Π° Π²Ρ‹ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ Π·Π°Π½ΠΎΠ²ΠΎ.

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ρƒ Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ количСство ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ:

Oracle

5.3.8.4 General Restrictions on Fast Refresh

The defining query of the materialized view is restricted as follows:

  • The materialized view must not contain references to non-repeating expressions like SYSDATE and ROWNUM.
  • The materialized view must not contain references to RAW or LONG RAW data types.
  • It cannot contain a SELECT list subquery.
  • It cannot contain analytic functions (for example, RANK) in the SELECT clause.
  • It cannot reference a table on which an XMLIndex index is defined.
  • It cannot contain a MODEL clause.
  • It cannot contain a HAVING clause with a subquery.
  • It cannot contain nested queries that have ANY, ALL, or NOT EXISTS.
  • It cannot contain a [START WITH …] CONNECT BY clause.
  • It cannot contain multiple detail tables at different sites.
  • ON COMMIT materialized views cannot have remote detail tables.
  • Nested materialized views must have a join or aggregate.
  • Materialized join views and materialized aggregate views with a GROUP BY clause cannot select from an index-organized table.

5.3.8.5 Restrictions on Fast Refresh on Materialized Views with Joins Only

Defining queries for materialized views with joins only and no aggregates have the following restrictions on fast refresh:

  • All restrictions from «General Restrictions on Fast Refresh«.
  • They cannot have GROUP BY clauses or aggregates.
  • Rowids of all the tables in the FROM list must appear in the SELECT list of the query.
  • Materialized view logs must exist with rowids for all the base tables in the FROM list of the query.
  • You cannot create a fast refreshable materialized view from multiple tables with simple joins that include an object type column in the SELECT statement.

Also, the refresh method you choose will not be optimally efficient if:

  • The defining query uses an outer join that behaves like an inner join. If the defining query contains such a join, consider rewriting the defining query to contain an inner join.
  • The SELECT list of the materialized view contains expressions on columns from multiple tables.

5.3.8.6 Restrictions on Fast Refresh on Materialized Views with Aggregates

Defining queries for materialized views with aggregates or joins have the following restrictions on fast refresh:

Fast refresh is supported for both ON COMMIT and ON DEMAND materialized views, however the following restrictions apply:

  • All tables in the materialized view must have materialized view logs, and the materialized view logs must:
    • Contain all columns from the table referenced in the materialized view.
    • Specify with ROWID and INCLUDING NEW VALUES.
    • Specify the SEQUENCE clause if the table is expected to have a mix of inserts/direct-loads, deletes, and updates.

  • Only SUM, COUNT, AVG, STDDEV, VARIANCE, MIN and MAX are supported for fast refresh.
  • COUNT(*) must be specified.
  • Aggregate functions must occur only as the outermost part of the expression. That is, aggregates such as AVG(AVG(x)) or AVG(x)+ AVG(x) are not allowed.
  • For each aggregate such as AVG(expr), the corresponding COUNT(expr) must be present. Oracle recommends that SUM(expr) be specified.
  • If VARIANCE(expr) or STDDEV(expr) is specified, COUNT(expr) and SUM(expr) must be specified. Oracle recommends that SUM(expr *expr) be specified.
  • The SELECT column in the defining query cannot be a complex expression with columns from multiple base tables. A possible workaround to this is to use a nested materialized view.
  • The SELECT list must contain all GROUP BY columns.
  • The materialized view is not based on one or more remote tables.
  • If you use a CHAR data type in the filter columns of a materialized view log, the character sets of the master site and the materialized view must be the same.
  • If the materialized view has one of the following, then fast refresh is supported only on conventional DML inserts and direct loads.
    • Materialized views with MIN or MAX aggregates
    • Materialized views which have SUM(expr) but no COUNT(expr)
    • Materialized views without COUNT(*)

    Such a materialized view is called an insert-only materialized view.

  • A materialized view with MAX or MIN is fast refreshable after delete or mixed DML statements if it does not have a WHERE clause.
    The max/min fast refresh after delete or mixed DML does not have the same behavior as the insert-only case. It deletes and recomputes the max/min values for the affected groups. You need to be aware of its performance impact.
  • Materialized views with named views or subqueries in the FROM clause can be fast refreshed provided the views can be completely merged. For information on which views will merge, see Oracle Database SQL Language Reference.
  • If there are no outer joins, you may have arbitrary selections and joins in the WHERE clause.
  • Materialized aggregate views with outer joins are fast refreshable after conventional DML and direct loads, provided only the outer table has been modified. Also, unique constraints must exist on the join columns of the inner join table. If there are outer joins, all the joins must be connected by ANDs and must use the equality (=) operator.
  • For materialized views with CUBE, ROLLUP, grouping sets, or concatenation of them, the following restrictions apply:
    • The SELECT list should contain grouping distinguisher that can either be a GROUPING_ID function on all GROUP BY expressions or GROUPING functions one for each GROUP BY expression. For example, if the GROUP BY clause of the materialized view is «GROUP BY CUBE(a, b)«, then the SELECT list should contain either «GROUPING_ID(a, b)» or «GROUPING(a) AND GROUPING(b)» for the materialized view to be fast refreshable.
    • GROUP BY should not result in any duplicate groupings. For example, «GROUP BY a, ROLLUP(a, b)» is not fast refreshable because it results in duplicate groupings «(a), (a, b), AND (a)«.

5.3.8.7 Restrictions on Fast Refresh on Materialized Views with UNION ALL

Materialized views with the UNION ALL set operator support the REFRESH FAST option if the following conditions are satisfied:

  • The defining query must have the UNION ALL operator at the top level.

    The UNION ALL operator cannot be embedded inside a subquery, with one exception: The UNION ALL can be in a subquery in the FROM clause provided the defining query is of the form SELECT * FROM (view or subquery with UNION ALL) as in the following example:

    CREATE VIEW view_with_unionall AS
    (SELECT c.rowid crid, c.cust_id, 2 umarker
     FROM customers c WHERE c.cust_last_name = 'Smith'
     UNION ALL
     SELECT c.rowid crid, c.cust_id, 3 umarker
     FROM customers c WHERE c.cust_last_name = 'Jones');
    
    CREATE MATERIALIZED VIEW unionall_inside_view_mv
    REFRESH FAST ON DEMAND AS
    SELECT * FROM view_with_unionall;
    

    Note that the view view_with_unionall satisfies the requirements for fast refresh.

  • Each query block in the UNION ALL query must satisfy the requirements of a fast refreshable materialized view with aggregates or a fast refreshable materialized view with joins.

    The appropriate materialized view logs must be created on the tables as required for the corresponding type of fast refreshable materialized view.
    Note that the Oracle Database also allows the special case of a single table materialized view with joins only provided the ROWID column has been included in the SELECT list and in the materialized view log. This is shown in the defining query of the view view_with_unionall.

  • The SELECT list of each query must include a UNION ALL marker, and the UNION ALL column must have a distinct constant numeric or string value in each UNION ALL branch. Further, the marker column must appear in the same ordinal position in the SELECT list of each query block. See «UNION ALL Marker and Query Rewrite» for more information regarding UNION ALL markers.
  • Some features such as outer joins, insert-only aggregate materialized view queries and remote tables are not supported for materialized views with UNION ALL. Note, however, that materialized views used in replication, which do not contain joins or aggregates, can be fast refreshed when UNION ALL or remote tables are used.
  • The compatibility initialization parameter must be set to 9.2.0 or higher to create a fast refreshable materialized view with UNION ALL.

НС Ρ…ΠΎΡ‡Ρƒ ΠΎΠ±ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΠΎΠΊΠ»ΠΎΠ½Π½ΠΈΠΊΠΎΠ² Oracle, Π½ΠΎ судя ΠΏΠΎ ΠΈΡ… списку ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ, создаСтся Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ писали Π½Π΅ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ модСль, Π° тысячи индусов, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π΄Π°Π»ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ свою Π²Π΅Ρ‚ΠΊΡƒ, ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… Ρ‡Ρ‚ΠΎ смог, Ρ‚ΠΎ ΠΈ сдСлал. ИспользованиС этого ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° для Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ β€” это ΠΊΠ°ΠΊ Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΌΠΈΠ½Π½ΠΎΠΌΡƒ полю. Π’ любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΠΈΠ½Ρƒ, ΠΏΠΎΠΏΠ°Π² Π½Π° ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ. Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ β€” Ρ‚ΠΎΠΆΠ΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ вопрос, Π½ΠΎ ΠΎΠ½ находится Π²Π½Π΅ Ρ€Π°ΠΌΠΎΠΊ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ.

Microsoft SQL Server

Additional Requirements

In addition to the SET options and deterministic function requirements, the following requirements must be met:

  • The user that executes CREATE INDEX must be the owner of the view.
  • When you create the index, the IGNORE_DUP_KEY option must be set to OFF (the default setting).
  • Tables must be referenced by two-part names, schema.tablename in the view definition.
  • User-defined functions referenced in the view must be created by using the WITH SCHEMABINDING option.
  • Any user-defined functions referenced in the view must be referenced by two-part names, <schema>.<function>.
  • The data access property of a user-defined function must be NO SQL, and external access property must be NO.
  • Common language runtime (CLR) functions can appear in the select list of the view, but cannot be part of the definition of the clustered index key. CLR functions cannot appear in the WHERE clause of the view or the ON clause of a JOIN operation in the view.
  • CLR functions and methods of CLR user-defined types used in the view definition must have the properties set as shown in the following table.

    Property
    Note

    DETERMINISTIC = TRUE
    Must be declared explicitly as an attribute of the Microsoft .NET Framework method.

    PRECISE = TRUE
    Must be declared explicitly as an attribute of the .NET Framework method.

    DATA ACCESS = NO SQL
    Determined by setting DataAccess attribute to DataAccessKind.None and SystemDataAccess attribute to SystemDataAccessKind.None.

    EXTERNAL ACCESS = NO
    This property defaults to NO for CLR routines.

  • The view must be created by using the WITH SCHEMABINDING option.
  • The view must reference only base tables that are in the same database as the view. The view cannot reference other views.
  • The SELECT statement in the view definition must not contain the following Transact-SQL elements:

    COUNT
    ROWSET functions (OPENDATASOURCE, OPENQUERY, OPENROWSET, AND OPENXML)
    OUTER joins (LEFT, RIGHT, or FULL)

    Derived table (defined by specifying a SELECT statement in the FROM clause)
    Self-joins
    Specifying columns by using SELECT * or SELECT <table_name>.*

    DISTINCT
    STDEV, STDEVP, VAR, VARP, or AVG
    Common table expression (CTE)

    float1, text, ntext, image, XML, or filestream columns
    Subquery
    OVER clause, which includes ranking or aggregate window functions

    Full-text predicates (CONTAINS, FREETEXT)
    SUM function that references a nullable expression
    ORDER BY

    CLR user-defined aggregate function
    TOP
    CUBE, ROLLUP, or GROUPING SETS operators

    MIN, MAX
    UNION, EXCEPT, or INTERSECT operators
    TABLESAMPLE

    Table variables
    OUTER APPLY or CROSS APPLY
    PIVOT, UNPIVOT

    Sparse column sets
    Inline (TVF) or multi-statement table-valued functions (MSTVF)
    OFFSET

    CHECKSUM_AGG

    1 The indexed view can contain float columns; however, such columns cannot be included in the clustered index key.

  • If GROUP BY is present, the VIEW definition must contain COUNT_BIG(*) and must not contain HAVING. These GROUP BY restrictions are applicable only to the indexed view definition. A query can use an indexed view in its execution plan even if it does not satisfy these GROUP BY restrictions.
  • If the view definition contains a GROUP BY clause, the key of the unique clustered index can reference only the columns specified in the GROUP BY clause.

Π—Π΄Π΅ΡΡŒ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ индусов Π½Π΅ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Π»ΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎ схСмС β€œΡΠ΄Π΅Π»Π°Π΅ΠΌ ΠΌΠ°Π»ΠΎ, Π½ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎβ€. Π’ΠΎ Π΅ΡΡ‚ΡŒ Ρƒ Π½ΠΈΡ… ΠΌΠΈΠ½ Π½Π° ΠΏΠΎΠ»Π΅ побольшС, Π½ΠΎ ΠΈΡ… располоТСниС ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Π΅Π΅. Π‘ΠΎΠ»ΡŒΡˆΠ΅ всСго ΠΎΠ³ΠΎΡ€Ρ‡Π°Π΅Ρ‚ Π²ΠΎΡ‚ это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅:

The view must reference only base tables that are in the same database as the view. The view cannot reference other views.

Π’ нашСй Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ функция Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ Ρ€ΡƒΠ±ΠΈΡ‚ всю идСологию Π½Π° ΠΊΠΎΡ€Π½ΡŽ.
Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΡ‚ это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ (ΠΈ дальшС ΠΏΠΎ тСксту) ΠΎΡ‡Π΅Π½ΡŒ сильно ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования:

The SELECT statement in the view definition must not contain the following Transact-SQL elements:

COUNT
ROWSET functions (OPENDATASOURCE, OPENQUERY, OPENROWSET, AND OPENXML)
OUTER joins (LEFT, RIGHT, or FULL)

Derived table (defined by specifying a SELECT statement in the FROM clause)
Self-joins
Specifying columns by using SELECT * or SELECT <table_name>.*

DISTINCT
STDEV, STDEVP, VAR, VARP, or AVG
Common table expression (CTE)

float1, text, ntext, image, XML, or filestream columns
Subquery
OVER clause, which includes ranking or aggregate window functions

Full-text predicates (CONTAINS, FREETEXT)
SUM function that references a nullable expression
ORDER BY

CLR user-defined aggregate function
TOP
CUBE, ROLLUP, or GROUPING SETS operators

MIN, MAX
UNION, EXCEPT, or INTERSECT operators
TABLESAMPLE

Table variables
OUTER APPLY or CROSS APPLY
PIVOT, UNPIVOT

Sparse column sets
Inline (TVF) or multi-statement table-valued functions (MSTVF)
OFFSET

CHECKSUM_AGG

Π—Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Ρ‹ OUTER JOINS, UNION, ORDER BY ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ Π±Ρ‹Π»ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Π΅ΠΌ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ нСльзя. Бписок вСроятно Π±Ρ‹Π» Π±Ρ‹ Π³ΠΎΡ€Π°Π·Π΄ΠΎ мСньшС.

Подводя ΠΈΡ‚ΠΎΠ³: ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ (Π·Π°ΠΌΠ΅Ρ‡Ρƒ коммСрчСской) Π‘Π£Π‘Π” vs Π½ΠΈΠΊΠ°ΠΊΠΈΡ… (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ логичСского, Π° Π½Π΅ тСхничСского) Π² LGPL Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ. Однако слСдуСт ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π² рСляционной Π»ΠΎΠ³ΠΈΠΊΠ΅ нСсколько слоТнСС, Ρ‡Π΅ΠΌ Π² описанной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ.

РСализация

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚? Π’ качСствС Β«Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹Β» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ PostgreSQL. Π’Π½ΡƒΡ‚Ρ€ΠΈ Π΅ΡΡ‚ΡŒ слоТный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ занимаСтся построСниСм запросов. Π’ΠΎΡ‚ исходный ΠΊΠΎΠ΄. И Ρ‚Π°ΠΌ Π½Π΅ просто большой Π½Π°Π±ΠΎΡ€ эвристик с ΠΊΡƒΡ‡Π΅ΠΉ if’ов. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ, Ссли Π΅ΡΡ‚ΡŒ ΠΏΠ°Ρ€Ρƒ мСсяцСв Π½Π° ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅.

Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π»ΠΈ это эффСктивно? Достаточно эффСктивно. К соТалСнию, Π΄ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ это тяТСло. ΠœΠΎΠ³Ρƒ лишь ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ссли Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ тысячи запросов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΡΡ‚ΡŒ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΡ… прилоТСниях, Ρ‚ΠΎ Π² срСднСм ΠΎΠ½ΠΈ эффСктивнСС, Ρ‡Π΅ΠΌ Ρƒ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. ΠžΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ SQL-программист ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ любой запрос эффСктивнСС, Π½ΠΎ Π½Π° тысячС запросов Ρƒ Π½Π΅Π³ΠΎ просто Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΈ ΠΌΠΎΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ, Π½ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ это Π΄Π΅Π»Π°Ρ‚ΡŒ. ЕдинствСнноС, Ρ‡Ρ‚ΠΎ я ΠΌΠΎΠ³Ρƒ сСйчас привСсти ΠΊΠ°ΠΊ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ эффСктивности β€” это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π° Π±Π°Π·Π΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, построСнной Π½Π° этой Π‘Π£Π‘Π” Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ нСсколько ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² ERP-систСмы, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ тысячи Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… MATERIALIZED Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, с тысячСй ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Ρ‚Π΅Ρ€Ρ€Π°Π±Π°ΠΉΡ‚Π½Ρ‹ΠΌΠΈ Π±Π°Π·Π°ΠΌΠΈ с сотнями ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² записСй, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ Π΄Π²ΡƒΡ…-процСссорном сСрвСрС. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, любой ΠΆΠ΅Π»Π°ΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ/ΠΎΠΏΡ€ΠΎΠ²Π΅Ρ€Π³Π½ΡƒΡ‚ΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ, скачав ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ ΠΈ PostgreSQL, Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ² Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ SQL-запросов ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π² ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚Π°ΠΌ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈ Π΄Π°Π½Π½Ρ‹Π΅.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΡΡ‚Π°Ρ‚ΡŒΡΡ…, я Ρ‚Π°ΠΊΠΆΠ΅ расскаТу ΠΏΡ€ΠΎ Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π²Π΅ΡˆΠ°Ρ‚ΡŒ ограничСния Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ€Π°Π±ΠΎΡ‚Ρƒ с сСссиями ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com