మునుపటిలో వ్యాసం రిలేషనల్ డేటాబేస్లలో వలె టేబుల్లు మరియు ఫీల్డ్ల కంటే ఫంక్షన్ల ఆధారంగా నిర్మించిన డేటాబేస్ యొక్క భావన మరియు అమలును నేను వివరించాను. ఇది క్లాసికల్ కంటే ఈ విధానం యొక్క ప్రయోజనాలను చూపించే అనేక ఉదాహరణలను అందించింది. చాలా మంది వాటిని తగినంతగా ఒప్పించలేదని కనుగొన్నారు.
ఈ కథనంలో, ఆపరేటింగ్ లాజిక్లో ఎటువంటి మార్పు లేకుండా డేటాబేస్కు రాయడం మరియు చదవడం త్వరగా మరియు సౌకర్యవంతంగా సమతుల్యం చేయడానికి ఈ భావన మిమ్మల్ని ఎలా అనుమతిస్తుంది అని నేను చూపుతాను. ఆధునిక వాణిజ్య DBMSలలో (ముఖ్యంగా, ఒరాకిల్ మరియు మైక్రోసాఫ్ట్ SQL సర్వర్) ఇలాంటి కార్యాచరణ అమలు చేయడానికి ప్రయత్నించబడింది. వ్యాసం చివరలో, వారు ఏమి చేసారో, తేలికగా చెప్పాలంటే, బాగా పని చేయలేదని నేను చూపిస్తాను.
వివరణ
మునుపటిలాగా, మంచి అవగాహన కోసం నేను ఉదాహరణలతో వివరణను ప్రారంభిస్తాను. డిపార్ట్మెంట్ల జాబితాను వాటిలోని ఉద్యోగుల సంఖ్య మరియు వారి మొత్తం జీతంతో తిరిగి ఇచ్చే లాజిక్ను అమలు చేయాలని చెప్పండి.
ఫంక్షనల్ డేటాబేస్లో ఇది ఇలా ఉంటుంది:
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;
ఏదైనా DBMSలో ఈ ప్రశ్నను అమలు చేయడంలో సంక్లిష్టత సమానంగా ఉంటుంది O(ఉద్యోగుల సంఖ్య)ఎందుకంటే ఈ గణనకు ఉద్యోగుల మొత్తం టేబుల్ని స్కాన్ చేసి, ఆపై వారిని డిపార్ట్మెంట్ వారీగా గ్రూప్ చేయడం అవసరం. ఎంచుకున్న ప్లాన్పై ఆధారపడి కొన్ని చిన్న (డిపార్ట్మెంట్ల కంటే ఎక్కువ మంది ఉద్యోగులు ఉన్నారని మేము నమ్ముతున్నాము) అనుబంధం కూడా ఉంటుంది O (ఉద్యోగుల లాగ్ సంఖ్య) లేదా O(విభాగాల సంఖ్య) గ్రూపింగ్ మరియు మొదలైనవి కోసం.
వివిధ DBMSలలో ఎగ్జిక్యూషన్ ఓవర్హెడ్ భిన్నంగా ఉండవచ్చు, కానీ సంక్లిష్టత ఏ విధంగానూ మారదు.
ప్రతిపాదిత అమలులో, ఫంక్షనల్ DBMS ఒక సబ్క్వెరీని రూపొందిస్తుంది, అది డిపార్ట్మెంట్కు అవసరమైన విలువలను గణిస్తుంది, ఆపై పేరును పొందడానికి డిపార్ట్మెంట్ టేబుల్తో జాయిన్ చేయండి. అయితే, ప్రతి ఫంక్షన్ కోసం, డిక్లేర్ చేస్తున్నప్పుడు, ప్రత్యేక మెటీరియలైజ్డ్ మార్కర్ను సెట్ చేయడం సాధ్యపడుతుంది. అటువంటి ప్రతి ఫంక్షన్ కోసం సిస్టమ్ స్వయంచాలకంగా సంబంధిత ఫీల్డ్ను సృష్టిస్తుంది. ఫంక్షన్ విలువను మార్చినప్పుడు, అదే లావాదేవీలో ఫీల్డ్ విలువ కూడా మారుతుంది. ఈ ఫంక్షన్ను యాక్సెస్ చేస్తున్నప్పుడు, ముందుగా లెక్కించిన ఫీల్డ్ యాక్సెస్ చేయబడుతుంది.
ప్రత్యేకించి, మీరు ఫంక్షన్ల కోసం MATERIALIZEDని సెట్ చేస్తే కౌంట్ ఉద్యోగులు и జీతం మొత్తం, అప్పుడు రెండు ఫీల్డ్లు డిపార్ట్మెంట్ల జాబితాతో టేబుల్కి జోడించబడతాయి, ఇది ఉద్యోగుల సంఖ్య మరియు వారి మొత్తం జీతం నిల్వ చేస్తుంది. ఉద్యోగులు, వారి జీతాలు లేదా డిపార్ట్మెంట్ అనుబంధాలలో మార్పు వచ్చినప్పుడల్లా, సిస్టమ్ ఈ ఫీల్డ్ల విలువలను స్వయంచాలకంగా మారుస్తుంది. పై ప్రశ్న నేరుగా ఈ ఫీల్డ్లను యాక్సెస్ చేస్తుంది మరియు అమలు చేయబడుతుంది O(విభాగాల సంఖ్య).
ఆంక్షలు ఏమిటి? ఒకే ఒక విషయం: అటువంటి ఫంక్షన్ దాని విలువ నిర్వచించబడిన పరిమిత సంఖ్యలో ఇన్పుట్ విలువలను కలిగి ఉండాలి. లేకపోతే, దాని విలువలన్నింటినీ నిల్వ చేసే పట్టికను నిర్మించడం అసాధ్యం, ఎందుకంటే అనంతమైన వరుసలతో పట్టిక ఉండకూడదు.
ఉదాహరణకు:
employeesCount ‘Количество сотрудников с зарплатой > N’ (Department d, NUMERIC[10,2] N) =
GROUP SUM salary(Employee e) IF department(e) = d AND salary(e) > N;
ఈ ఫంక్షన్ N యొక్క అనంతమైన విలువల కోసం నిర్వచించబడింది (ఉదాహరణకు, ఏదైనా ప్రతికూల విలువ అనుకూలంగా ఉంటుంది). అందువల్ల, మీరు దానిపై మెటీరియల్ని ఉంచలేరు. కాబట్టి ఇది తార్కిక పరిమితి, సాంకేతికమైనది కాదు (అంటే, మేము దీన్ని అమలు చేయలేనందున కాదు). లేకపోతే, ఎటువంటి పరిమితులు లేవు. మీరు గ్రూపింగ్లు, సార్టింగ్, మరియు మరియు లేదా, పార్టిషన్, రికర్షన్ మొదలైనవాటిని ఉపయోగించవచ్చు.
ఉదాహరణకు, మునుపటి కథనంలోని సమస్య 2.2లో, మీరు రెండు ఫంక్షన్లపై మెటీరియలైజ్డ్ను ఉంచవచ్చు:
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;
సిస్టమ్ స్వయంగా టైప్ కీలతో ఒక టేబుల్ని సృష్టిస్తుంది కస్టమర్, ప్రొడక్ట్స్ и పూర్ణ సంఖ్య, దానికి రెండు ఫీల్డ్లను జోడిస్తుంది మరియు ఏవైనా మార్పులతో వాటిలోని ఫీల్డ్ విలువలను అప్డేట్ చేస్తుంది. ఈ ఫంక్షన్లకు తదుపరి కాల్లు చేసినప్పుడు, అవి లెక్కించబడవు, కానీ సంబంధిత ఫీల్డ్ల నుండి విలువలు చదవబడతాయి.
ఈ మెకానిజం ఉపయోగించి, ఉదాహరణకు, మీరు ప్రశ్నలలో పునరావృత్తులు (CTE) నుండి బయటపడవచ్చు. ప్రత్యేకించి, పిల్లల/తల్లిదండ్రుల సంబంధాన్ని ఉపయోగించి చెట్టును ఏర్పరిచే సమూహాలను పరిగణించండి (ప్రతి సమూహం దాని తల్లిదండ్రులకు లింక్ను కలిగి ఉంటుంది):
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;
ఫంక్షన్ కోసం పేరెంట్ మెటీరియలైజ్డ్ అని గుర్తు పెట్టబడింది, ఆపై దాని కోసం రెండు కీలు (గ్రూప్లు) ఉన్న టేబుల్ సృష్టించబడుతుంది, దీనిలో ఫీల్డ్ పేరెంట్ మొదటి కీ రెండవది బిడ్డ అయితే మాత్రమే నిజం అవుతుంది. ఈ పట్టికలోని ఎంట్రీల సంఖ్య చెట్టు యొక్క సగటు లోతుతో గుణించబడిన సమూహాల సంఖ్యకు సమానంగా ఉంటుంది. మీకు అవసరమైతే, ఉదాహరణకు, ఒక నిర్దిష్ట సమూహం యొక్క వారసుల సంఖ్యను లెక్కించడానికి, మీరు ఈ ఫంక్షన్ను ఉపయోగించవచ్చు:
childrenCount (Group g) = GROUP SUM 1 IF isParent(Group child, g);
SQL ప్రశ్నలో CTE ఉండదు. బదులుగా ఒక సాధారణ GROUP BY ఉంటుంది.
ఈ యంత్రాంగాన్ని ఉపయోగించి, అవసరమైతే మీరు డేటాబేస్ను సులభంగా డీనార్మలైజ్ చేయవచ్చు:
CLASS Order 'Заказ';
date 'Дата' = DATA DATE (Order);
CLASS OrderDetail 'Строка заказа';
order 'Заказ' = DATA Order (OrderDetail);
date 'Дата' (OrderDetail d) = date(order(d)) MATERIALIZED INDEXED;
ఫంక్షన్కి కాల్ చేస్తున్నప్పుడు తేదీ ఆర్డర్ లైన్ కోసం, ఇండెక్స్ ఉన్న ఫీల్డ్ ఆర్డర్ లైన్లతో టేబుల్ నుండి చదవబడుతుంది. ఆర్డర్ తేదీ మారినప్పుడు, సిస్టమ్ స్వయంచాలకంగా లైన్లోని డీనార్మలైజ్డ్ తేదీని తిరిగి గణిస్తుంది.
ప్రయోజనాలు
ఈ మొత్తం యంత్రాంగం దేనికి? క్లాసిక్ DBMSలలో, ప్రశ్నలను తిరిగి వ్రాయకుండా, డెవలపర్ లేదా DBA సూచికలను మాత్రమే మార్చగలదు, గణాంకాలను గుర్తించగలదు మరియు వాటిని ఎలా అమలు చేయాలో ప్రశ్న ప్లానర్కు చెప్పగలదు (మరియు సూచనలు వాణిజ్య DBMSలలో మాత్రమే అందుబాటులో ఉంటాయి). వారు ఎంత ప్రయత్నించినా, వ్యాసంలోని మొదటి ప్రశ్నను పూర్తి చేయలేరు O (విభాగాల సంఖ్య) ప్రశ్నలను మార్చకుండా లేదా ట్రిగ్గర్లను జోడించకుండా. ప్రతిపాదిత పథకంలో, అభివృద్ధి దశలో మీరు డేటా నిల్వ నిర్మాణం మరియు ఏ అగ్రిగేషన్లను ఉపయోగించాలో ఆలోచించాల్సిన అవసరం లేదు. అన్ని ఈ సులభంగా నేరుగా ఆపరేషన్ లో, ఫ్లై న మార్చవచ్చు.
ఆచరణలో ఇది ఇలా కనిపిస్తుంది. కొందరు వ్యక్తులు తమ వద్ద ఉన్న పనిని బట్టి నేరుగా లాజిక్ని అభివృద్ధి చేస్తారు. వారు అల్గారిథమ్లు మరియు వాటి సంక్లిష్టత, లేదా అమలు ప్రణాళికలు, లేదా జాయిన్ల రకాలు లేదా మరే ఇతర సాంకేతిక భాగాలను అర్థం చేసుకోలేరు. ఈ వ్యక్తులు డెవలపర్ల కంటే ఎక్కువ వ్యాపార విశ్లేషకులు. అప్పుడు, ఇదంతా పరీక్ష లేదా ఆపరేషన్లోకి వెళుతుంది. దీర్ఘకాలిక ప్రశ్నల లాగింగ్ను ప్రారంభిస్తుంది. సుదీర్ఘమైన ప్రశ్న కనుగొనబడినప్పుడు, ఇతర వ్యక్తులు (మరింత సాంకేతికంగా - తప్పనిసరిగా DBA) కొన్ని ఇంటర్మీడియట్ ఫంక్షన్లో మెటీరియలైజ్డ్ను ప్రారంభించాలని నిర్ణయించుకుంటారు. ఇది రికార్డింగ్ను కొద్దిగా నెమ్మదిస్తుంది (లావాదేవీలో అదనపు ఫీల్డ్ను నవీకరించడం అవసరం కాబట్టి). అయినప్పటికీ, ఈ ప్రశ్న గణనీయంగా వేగవంతం కావడమే కాకుండా, ఈ ఫంక్షన్ని ఉపయోగించే అన్ని ఇతరాలు కూడా. అదే సమయంలో, ఏ ఫంక్షన్ మెటీరియలైజ్ చేయాలో నిర్ణయించడం చాలా సులభం. రెండు ప్రధాన పారామితులు: సాధ్యమయ్యే ఇన్పుట్ విలువల సంఖ్య (సంబంధిత పట్టికలో ఎన్ని రికార్డ్లు ఉంటాయి) మరియు ఇతర ఫంక్షన్లలో ఇది ఎంత తరచుగా ఉపయోగించబడుతుంది.
సారూప్య
ఆధునిక వాణిజ్య DBMSలు ఒకే విధమైన మెకానిజమ్లను కలిగి ఉన్నాయి: ఫాస్ట్ రిఫ్రెష్ (ఒరాకిల్) మరియు ఇండెక్స్డ్ వ్యూ (మైక్రోసాఫ్ట్ SQL సర్వర్)తో కూడిన మెటీరియలైజ్డ్ వ్యూ. PostgreSQLలో, లావాదేవీలో మెటీరియలైజ్డ్ వీక్షణను నవీకరించడం సాధ్యం కాదు, కానీ అభ్యర్థనపై మాత్రమే (మరియు చాలా కఠినమైన పరిమితులతో కూడా), కాబట్టి మేము దానిని పరిగణించము. కానీ వాటి వినియోగాన్ని గణనీయంగా పరిమితం చేసే అనేక సమస్యలు ఉన్నాయి.
ముందుగా, మీరు ఇప్పటికే సాధారణ వీక్షణను సృష్టించినట్లయితే మాత్రమే మీరు మెటీరియలైజేషన్ను ప్రారంభించగలరు. లేకపోతే, మీరు ఈ మెటీరియలైజేషన్ని ఉపయోగించడానికి కొత్తగా సృష్టించిన వీక్షణను యాక్సెస్ చేయడానికి మిగిలిన అభ్యర్థనలను తిరిగి వ్రాయవలసి ఉంటుంది. లేదా అన్నింటినీ అలాగే వదిలేయండి, కానీ ఇప్పటికే ముందుగా లెక్కించిన డేటా ఉంటే అది కనీసం పనికిరానిదిగా ఉంటుంది, కానీ చాలా ప్రశ్నలు ఎల్లప్పుడూ దానిని ఉపయోగించవు, కానీ మళ్లీ లెక్కించండి.
రెండవది, వారికి భారీ సంఖ్యలో పరిమితులు ఉన్నాయి:
ఒరాకిల్
5.3.8.4 ఫాస్ట్ రిఫ్రెష్పై సాధారణ పరిమితులు
మెటీరియలైజ్డ్ వీక్షణ యొక్క నిర్వచించే ప్రశ్న క్రింది విధంగా పరిమితం చేయబడింది:
మెటీరియలైజ్డ్ వ్యూలో రిపీట్ కాని ఎక్స్ప్రెషన్ల సూచనలు ఉండకూడదు SYSDATE మరియు ROWNUM.
మెటీరియలైజ్డ్ వ్యూలో తప్పనిసరిగా రిఫరెన్స్లు ఉండకూడదు RAW or LONGRAW డేటా రకాలు.
ఇది a కలిగి ఉండకూడదు SELECT జాబితా ఉపప్రశ్న.
ఇది విశ్లేషణాత్మక విధులను కలిగి ఉండకూడదు (ఉదాహరణకు, RANK) లో SELECT నిబంధన.
ఇది ఒక పట్టికను సూచించదు XMLIndex సూచిక నిర్వచించబడింది.
ఇది a కలిగి ఉండకూడదు MODEL నిబంధన.
ఇది a కలిగి ఉండకూడదు HAVING ఉపప్రశ్నతో కూడిన నిబంధన.
ఇది కలిగి ఉన్న సమూహ ప్రశ్నలను కలిగి ఉండదు ANY, ALLలేదా NOTEXISTS.
ఇది a కలిగి ఉండకూడదు [START WITH …] CONNECT BY నిబంధన.
ఇది వేర్వేరు సైట్లలో బహుళ వివరాల పట్టికలను కలిగి ఉండకూడదు.
ONCOMMIT మెటీరియలైజ్డ్ వీక్షణలు రిమోట్ వివరాల పట్టికలను కలిగి ఉండకూడదు.
నెస్టెడ్ మెటీరియలైజ్డ్ వీక్షణలు తప్పనిసరిగా చేరడం లేదా సమగ్రతను కలిగి ఉండాలి.
మెటీరియలైజ్డ్ జాయిన్ వీక్షణలు మరియు మెటీరియలైజ్డ్ అగ్రిగేట్ వీక్షణలు a GROUPBY సూచిక-వ్యవస్థీకృత పట్టిక నుండి నిబంధన ఎంచుకోలేదు.
5.3.8.5 చేరిన వారితో మాత్రమే మెటీరియలైజ్డ్ వీక్షణలపై వేగంగా రిఫ్రెష్ చేయడంపై పరిమితులు
చేరిన వాటితో మాత్రమే మెటీరియలైజ్డ్ వీక్షణల కోసం ప్రశ్నలను నిర్వచించడం మరియు వేగవంతమైన రిఫ్రెష్పై కింది పరిమితులు లేవు:
వారు కలిగి ఉండలేరు GROUPBY నిబంధనలు లేదా సంకలనాలు.
లోని అన్ని టేబుల్ల రౌడ్లు FROM జాబితా తప్పక కనిపిస్తుంది SELECT ప్రశ్న యొక్క జాబితా.
మెటీరియలైజ్డ్ వీక్షణ లాగ్లు తప్పనిసరిగా రోయిడ్లతో అన్ని బేస్ టేబుల్ల కోసం ఉండాలి FROM ప్రశ్న యొక్క జాబితా.
మీరు ఆబ్జెక్ట్ టైప్ కాలమ్ని కలిగి ఉండే సాధారణ చేరికలతో బహుళ పట్టికల నుండి వేగవంతమైన రిఫ్రెష్ చేయగల మెటీరియలైజ్డ్ వీక్షణను సృష్టించలేరు SELECT ప్రకటన.
అలాగే, మీరు ఎంచుకున్న రిఫ్రెష్ పద్ధతి ఉత్తమంగా ప్రభావవంతంగా ఉండదు:
నిర్వచించే ప్రశ్న అంతర్గత చేరిక వలె ప్రవర్తించే బాహ్య చేరికను ఉపయోగిస్తుంది. నిర్వచించే ప్రశ్న అటువంటి చేరికను కలిగి ఉన్నట్లయితే, అంతర్గత చేరికను కలిగి ఉండేలా నిర్వచించే ప్రశ్నను తిరిగి వ్రాయడాన్ని పరిగణించండి.
మా SELECT మెటీరియలైజ్డ్ వీక్షణ జాబితా బహుళ పట్టికల నుండి నిలువు వరుసలపై వ్యక్తీకరణలను కలిగి ఉంటుంది.
వేగవంతమైన రిఫ్రెష్ రెండింటికీ మద్దతు ఇస్తుంది ONCOMMIT మరియు ONDEMAND వాస్తవిక వీక్షణలు, అయితే క్రింది పరిమితులు వర్తిస్తాయి:
మెటీరియలైజ్డ్ వ్యూలోని అన్ని టేబుల్లు తప్పనిసరిగా మెటీరియలైజ్డ్ వ్యూ లాగ్లను కలిగి ఉండాలి మరియు మెటీరియలైజ్డ్ వ్యూ లాగ్లు తప్పనిసరిగా:
మెటీరియలైజ్డ్ వీక్షణలో సూచించబడిన పట్టిక నుండి అన్ని నిలువు వరుసలను కలిగి ఉండండి.
తో పేర్కొనండి ROWID మరియు INCLUDINGNEWVALUES.
పేర్కొనండి SEQUENCE పట్టిక ఇన్సర్ట్లు/డైరెక్ట్-లోడ్లు, డిలీట్లు మరియు అప్డేట్ల మిశ్రమాన్ని కలిగి ఉండాలని భావిస్తే నిబంధన.
మాత్రమే SUM, COUNT, AVG, STDDEV, VARIANCE, MIN మరియు MAX శీఘ్ర రిఫ్రెష్ కోసం మద్దతునిస్తుంది.
COUNT(*) తప్పనిసరిగా పేర్కొనాలి.
సమిష్టి విధులు తప్పనిసరిగా వ్యక్తీకరణ యొక్క వెలుపలి భాగం వలె మాత్రమే జరగాలి. అంటే, వంటి సముదాయాలు AVG(AVG(x)) or AVG(x)+ AVG(x) అనుమతించబడలేదు.
వంటి ప్రతి మొత్తం కోసం AVG(expr), సంబంధిత COUNT(expr) తప్పనిసరిగా ఉండాలి. Oracle అని సిఫార్సు చేస్తున్నారు SUM(expr) పేర్కొనబడాలి.
If VARIANCE(expr) or STDDEV(expr) పేర్కొనబడింది, COUNT(expr) మరియు SUM(expr) తప్పనిసరిగా పేర్కొనాలి. Oracle అని సిఫార్సు చేస్తున్నారు SUM(expr *expr) పేర్కొనబడాలి.
మా SELECT నిర్వచించే ప్రశ్నలోని నిలువు వరుస బహుళ బేస్ పట్టికల నుండి నిలువు వరుసలతో కూడిన సంక్లిష్ట వ్యక్తీకరణ కాదు. సమూహ మెటీరియలైజ్డ్ వీక్షణను ఉపయోగించడం దీనికి సాధ్యమైన ప్రత్యామ్నాయం.
మా SELECT జాబితా తప్పనిసరిగా అన్నింటినీ కలిగి ఉండాలి GROUPBY నిలువు వరుసలు.
మెటీరియలైజ్డ్ వీక్షణ ఒకటి లేదా అంతకంటే ఎక్కువ రిమోట్ టేబుల్లపై ఆధారపడి ఉండదు.
మీరు ఉపయోగిస్తే a CHAR మెటీరియలైజ్డ్ వీక్షణ లాగ్ యొక్క ఫిల్టర్ నిలువు వరుసలలోని డేటా రకం, మాస్టర్ సైట్ యొక్క అక్షర సెట్లు మరియు మెటీరియలైజ్డ్ వీక్షణ ఒకేలా ఉండాలి.
మెటీరియలైజ్డ్ వీక్షణ కింది వాటిలో ఒకదాన్ని కలిగి ఉన్నట్లయితే, సాంప్రదాయ DML ఇన్సర్ట్లు మరియు డైరెక్ట్ లోడ్లపై మాత్రమే ఫాస్ట్ రిఫ్రెష్కు మద్దతు ఉంటుంది.
తో మెటీరియలైజ్డ్ వీక్షణలు MIN or MAX కంకర
కలిగి ఉన్న మెటీరియలైజ్డ్ వీక్షణలు SUM(expr) కానీ కాదు COUNT(expr)
లేకుండా మెటీరియలైజ్డ్ వీక్షణలు COUNT(*)
అటువంటి మెటీరియలైజ్డ్ వీక్షణను ఇన్సర్ట్-ఓన్లీ మెటీరియలైజ్డ్ వ్యూ అంటారు.
తో సాకారమైన వీక్షణ MAX or MIN డిలీట్ చేసిన తర్వాత లేదా మిక్స్ చేసిన DML స్టేట్మెంట్లను కలిగి ఉండకపోతే వేగంగా రిఫ్రెష్ అవుతుంది WHERE నిబంధన.
తొలగించిన తర్వాత గరిష్టంగా/నిమి ఫాస్ట్ రిఫ్రెష్ లేదా మిక్స్డ్ DML ఇన్సర్ట్-ఓన్లీ కేస్ వలె అదే ప్రవర్తనను కలిగి ఉండదు. ఇది ప్రభావిత సమూహాల కోసం గరిష్ట/నిమి విలువలను తొలగిస్తుంది మరియు తిరిగి గణిస్తుంది. మీరు దాని పనితీరు ప్రభావం గురించి తెలుసుకోవాలి.
పేరు ఉన్న వీక్షణలు లేదా సబ్క్వెరీలతో మెటీరియలైజ్డ్ వీక్షణలు FROM వీక్షణలను పూర్తిగా విలీనం చేయగలిగితే నిబంధన త్వరగా రిఫ్రెష్ చేయబడుతుంది. ఏ వీక్షణలు విలీనం అవుతాయో సమాచారం కోసం, చూడండి ఒరాకిల్ డేటాబేస్ SQL లాంగ్వేజ్ రిఫరెన్స్.
బయటి చేరికలు లేకుంటే, మీరు ఏకపక్ష ఎంపికలను కలిగి ఉండవచ్చు మరియు దీనిలో చేరవచ్చు WHERE నిబంధన.
సాంప్రదాయిక DML మరియు డైరెక్ట్ లోడ్ల తర్వాత బాహ్య చేరికలతో కూడిన మెటీరియలైజ్డ్ అగ్రిగేట్ వీక్షణలు వేగంగా రిఫ్రెష్ చేయబడతాయి, బయటి పట్టిక మాత్రమే సవరించబడి ఉంటుంది. అలాగే, ఇన్నర్ జాయిన్ టేబుల్లోని జాయిన్ కాలమ్లపై ప్రత్యేక పరిమితులు తప్పనిసరిగా ఉండాలి. బయటి చేరికలు ఉంటే, అన్ని చేరికలు తప్పనిసరిగా కనెక్ట్ చేయబడాలి ANDలు మరియు సమానత్వాన్ని ఉపయోగించాలి (=) ఆపరేటర్.
తో మెటీరియలైజ్డ్ వీక్షణల కోసం CUBE, ROLLUP, గ్రూపింగ్ సెట్లు లేదా వాటి కలయిక, క్రింది పరిమితులు వర్తిస్తాయి:
మా SELECT జాబితాలో గ్రూపింగ్ డిస్టింగ్విషర్ ఉండాలి, అది ఒక కావచ్చు GROUPING_ID అన్నింటిపై పని చేస్తుంది GROUPBY వ్యక్తీకరణలు లేదా GROUPING ఒక్కోదానికి ఒకటి పనిచేస్తుంది GROUPBY వ్యక్తీకరణ. ఉదాహరణకు, ఉంటే GROUPBY వాస్తవిక దృక్పథం యొక్క నిబంధన "GROUPBYCUBE(a, b)", అప్పుడు ది SELECT జాబితాలో ఏదో ఒకటి ఉండాలి "GROUPING_ID(a, b)» లేదా «GROUPING(a)ANDGROUPING(b)» మెటీరియలైజ్డ్ వీక్షణ వేగంగా రిఫ్రెష్ అవ్వడానికి.
GROUPBY ఎటువంటి నకిలీ సమూహాలకు దారితీయకూడదు. ఉదాహరణకి, "GROUP BY a, ROLLUP(a, b)"త్వరగా రిఫ్రెష్ చేయబడదు ఎందుకంటే ఇది నకిలీ సమూహాలకు దారి తీస్తుంది"(a), (a, b), AND (a)".
5.3.8.7 UNION ALLతో మెటీరియలైజ్డ్ వీక్షణలపై ఫాస్ట్ రిఫ్రెష్పై పరిమితులు
తో మెటీరియలైజ్డ్ వీక్షణలు UNIONALL సెట్ ఆపరేటర్ మద్దతు REFRESHFAST కింది షరతులు సంతృప్తి చెందితే ఎంపిక:
నిర్వచించే ప్రశ్న తప్పనిసరిగా కలిగి ఉండాలి UNIONALL ఉన్నత స్థాయిలో ఆపరేటర్.
మా UNIONALL ఆపరేటర్ని సబ్క్వెరీ లోపల పొందుపరచడం సాధ్యం కాదు, ఒక మినహాయింపుతో: ది UNIONALL లో సబ్క్వెరీలో ఉండవచ్చు FROM నిర్వచించే ప్రశ్న రూపంలో అందించబడిన నిబంధన SELECT * FROM (వీక్షణ లేదా ఉపప్రశ్న UNIONALL) కింది ఉదాహరణలో వలె:
వీక్షణ వీక్షణ_with_unionall AS (కస్టమర్ల నుండి c.rowid crid, c.cust_id, 2 umarker ఎంచుకోండి c ఎక్కడ c.cust_last_name = 'Smith' UNION అన్నీ ఎంపిక c.rowid crid, c.cust_id, 3 umarker c.t_fROM కస్టమర్లు 'జోన్స్'); మెటీరియలైజ్డ్ వీక్షణను యూనియన్ఆల్_ఇన్సైడ్_వ్యూ_ఎమ్విని త్వరగా రిఫ్రెష్ చేయండి డిమాండ్పై ఎంపిక * నుండి వీక్షణ_విత్_యూనియన్అల్;
వీక్షణ అని గమనించండి view_with_unionall ఫాస్ట్ రిఫ్రెష్ కోసం అవసరాలను సంతృప్తిపరుస్తుంది.
లో ప్రతి ప్రశ్న బ్లాక్ UNIONALL సముదాయాలతో వేగవంతమైన రిఫ్రెష్ చేయగల మెటీరియలైజ్డ్ వీక్షణ లేదా చేరికలతో వేగవంతమైన రిఫ్రెష్ చేయదగిన మెటీరియలైజ్డ్ వీక్షణ అవసరాలను ప్రశ్న తప్పనిసరిగా తీర్చాలి.
ఫాస్ట్ రిఫ్రెష్ చేయదగిన మెటీరియలైజ్డ్ వీక్షణ యొక్క సంబంధిత రకం కోసం అవసరమైన విధంగా తగిన మెటీరియలైజ్డ్ వీక్షణ లాగ్లను తప్పనిసరిగా టేబుల్లపై సృష్టించాలి.
ఒరాకిల్ డేటాబేస్ ఒకే టేబుల్ మెటీరియలైజ్డ్ వీక్షణ యొక్క ప్రత్యేక కేస్ను కూడా అనుమతించిందని గమనించండి ROWID కాలమ్లో చేర్చబడింది SELECT జాబితా మరియు మెటీరియలైజ్డ్ వీక్షణ లాగ్లో. వీక్షణ యొక్క నిర్వచించే ప్రశ్నలో ఇది చూపబడింది view_with_unionall.
మా SELECT ప్రతి ప్రశ్న జాబితా తప్పనిసరిగా aని కలిగి ఉండాలి UNIONALL మార్కర్, మరియు UNIONALL నిలువు వరుస ప్రతిదానిలో ప్రత్యేక స్థిరమైన సంఖ్య లేదా స్ట్రింగ్ విలువను కలిగి ఉండాలి UNIONALL శాఖ. ఇంకా, మార్కర్ నిలువు వరుసలో తప్పనిసరిగా అదే ఆర్డినల్ స్థానంలో కనిపించాలి SELECT ప్రతి ప్రశ్న బ్లాక్ జాబితా. చూడు"UNION అన్ని మార్కర్ మరియు ప్రశ్న తిరిగి వ్రాయండి» గురించి మరింత సమాచారం కోసం UNIONALL గుర్తులు.
ఔటర్ జాయిన్లు, ఇన్సర్ట్-మాత్రమే మొత్తం మెటీరియలైజ్డ్ వీక్షణ ప్రశ్నలు మరియు రిమోట్ టేబుల్లు వంటి కొన్ని ఫీచర్లు మెటీరియలైజ్డ్ వీక్షణలకు మద్దతు ఇవ్వవు UNIONALL. అయితే, రెప్లికేషన్లో ఉపయోగించిన మెటీరియలైజ్డ్ వీక్షణలు, జాయిన్లు లేదా అగ్రిగేట్లను కలిగి ఉండవు, వీటిని వేగంగా రిఫ్రెష్ చేయవచ్చని గుర్తుంచుకోండి UNIONALL లేదా రిమోట్ పట్టికలు ఉపయోగించబడతాయి.
దీనితో వేగవంతమైన రిఫ్రెష్ చేయదగిన మెటీరియలైజ్డ్ వీక్షణను సృష్టించడానికి అనుకూలత ప్రారంభ పరామితిని తప్పనిసరిగా 9.2.0 లేదా అంతకంటే ఎక్కువ సెట్ చేయాలి UNIONALL.
నేను ఒరాకిల్ అభిమానులను కించపరచకూడదనుకుంటున్నాను, కానీ వారి పరిమితుల జాబితాను బట్టి చూస్తే, ఈ మెకానిజం సాధారణ సందర్భంలో కాదు, ఒక రకమైన మోడల్ను ఉపయోగించి, వేలాది మంది భారతీయులచే వ్రాయబడిందని అనిపిస్తుంది, ఇక్కడ ప్రతి ఒక్కరికీ అవకాశం ఇవ్వబడింది. వారి స్వంత శాఖను వ్రాయండి మరియు వారిలో ప్రతి ఒక్కరూ తనకు చేతనైనది చేసారు మరియు చేసారు. నిజమైన తర్కం కోసం ఈ యంత్రాంగాన్ని ఉపయోగించడం అనేది మైన్ఫీల్డ్ గుండా నడవడం లాంటిది. స్పష్టంగా లేని పరిమితుల్లో ఒకదానిని కొట్టడం ద్వారా మీరు ఎప్పుడైనా గనిని పొందవచ్చు. ఇది ఎలా పని చేస్తుంది అనేది కూడా ఒక ప్రత్యేక ప్రశ్న, కానీ ఇది ఈ వ్యాసం యొక్క పరిధికి మించినది.
Microsoft SQL సర్వర్
అదనపు అవసరాలు
SET ఎంపికలు మరియు నిర్ణయాత్మక ఫంక్షన్ అవసరాలతో పాటు, కింది అవసరాలు తప్పక తీర్చాలి:
అమలు చేసే వినియోగదారు CREATE INDEX వీక్షణకు యజమాని అయి ఉండాలి.
మీరు సూచికను సృష్టించినప్పుడు, ది IGNORE_DUP_KEY ఎంపికను తప్పనిసరిగా ఆఫ్కి సెట్ చేయాలి (డిఫాల్ట్ సెట్టింగ్).
పట్టికలు తప్పనిసరిగా రెండు భాగాల పేర్లతో సూచించబడాలి, స్కీమా.పట్టిక పేరు వీక్షణ నిర్వచనంలో.
వీక్షణలో సూచించబడిన వినియోగదారు నిర్వచించిన విధులను తప్పనిసరిగా ఉపయోగించి సృష్టించాలి WITH SCHEMABINDING ఎంపిక.
వీక్షణలో సూచించబడిన ఏదైనా వినియోగదారు నిర్వచించిన విధులు తప్పనిసరిగా రెండు-భాగాల పేర్లతో సూచించబడాలి, ..
వినియోగదారు నిర్వచించిన ఫంక్షన్ యొక్క డేటా యాక్సెస్ ప్రాపర్టీ తప్పనిసరిగా ఉండాలి NO SQL, మరియు బాహ్య యాక్సెస్ ప్రాపర్టీ తప్పనిసరిగా ఉండాలి NO.
కామన్ లాంగ్వేజ్ రన్టైమ్ (CLR) ఫంక్షన్లు వీక్షణ ఎంపిక జాబితాలో కనిపించవచ్చు, కానీ క్లస్టర్డ్ ఇండెక్స్ కీ నిర్వచనంలో భాగం కాకూడదు. CLR ఫంక్షన్లు వీక్షణ యొక్క WHERE నిబంధనలో లేదా వీక్షణలో JOIN ఆపరేషన్ యొక్క ON నిబంధనలో కనిపించవు.
వీక్షణ నిర్వచనంలో ఉపయోగించే CLR ఫంక్షన్లు మరియు CLR వినియోగదారు-నిర్వచించిన రకాల పద్ధతులు క్రింది పట్టికలో చూపిన విధంగా సెట్ చేయబడిన లక్షణాలను కలిగి ఉండాలి.
ఆస్తి
గమనిక
డిటర్మినిస్టిక్ = నిజం
Microsoft .NET ఫ్రేమ్వర్క్ పద్ధతి యొక్క లక్షణంగా స్పష్టంగా ప్రకటించబడాలి.
PRECISE = నిజం
.NET ఫ్రేమ్వర్క్ పద్ధతి యొక్క లక్షణంగా స్పష్టంగా ప్రకటించబడాలి.
డేటా యాక్సెస్ = SQL లేదు
DataAccess లక్షణాన్ని DataAccessKind.Noneకి మరియు SystemDataAccess అట్రిబ్యూట్ SystemDataAccessKind.Noneకి సెట్ చేయడం ద్వారా నిర్ణయించబడుతుంది.
బాహ్య యాక్సెస్ = నం
ఈ ప్రాపర్టీ CLR రొటీన్ల కోసం NOకి డిఫాల్ట్ అవుతుంది.
వీక్షణను ఉపయోగించి తప్పక సృష్టించాలి WITH SCHEMABINDING ఎంపిక.
వీక్షణ తప్పనిసరిగా వీక్షణ వలె అదే డేటాబేస్లో ఉన్న బేస్ టేబుల్లను మాత్రమే సూచించాలి. వీక్షణ ఇతర వీక్షణలను సూచించదు.
వీక్షణ నిర్వచనంలోని SELECT స్టేట్మెంట్ కింది లావాదేవీ-SQL మూలకాలను కలిగి ఉండకూడదు:
COUNT
ROWSET విధులు (OPENDATASOURCE, OPENQUERY, OPENROWSET, మరియు OPENXML) OUTER చేరుతుంది(LEFT, RIGHTలేదా FULL)
ఉత్పన్నమైన పట్టిక (ఒక పేర్కొనడం ద్వారా నిర్వచించబడింది SELECT లో ప్రకటన FROM ఉపవాక్య)
స్వీయ చేరికలు
ఉపయోగించి నిలువు వరుసలను పేర్కొనడం SELECT * or SELECT <table_name>.*
DISTINCT STDEV, STDEVP, VAR, VARPలేదా AVG
సాధారణ పట్టిక వ్యక్తీకరణ (CTE)
ఫ్లోట్1, టెక్స్ట్, ntext, చిత్రం, XMLలేదా ఫైల్ స్ట్రీమ్ నిలువు
సబ్క్వెరీ OVER నిబంధన, ఇది ర్యాంకింగ్ లేదా మొత్తం విండో ఫంక్షన్లను కలిగి ఉంటుంది
పూర్తి-వచన అంచనాలు (CONTAINS, FREETEXT) SUM nullable వ్యక్తీకరణను సూచించే ఫంక్షన్ ORDER BY
CLR వినియోగదారు నిర్వచించిన మొత్తం ఫంక్షన్ TOP CUBE, ROLLUPలేదా GROUPING SETS నిర్వాహకులు
MIN, MAX UNION, EXCEPTలేదా INTERSECT నిర్వాహకులు TABLESAMPLE
టేబుల్ వేరియబుల్స్ OUTER APPLY or CROSS APPLY PIVOT, UNPIVOT
చిన్న నిలువు వరుస సెట్లు
ఇన్లైన్ (TVF) లేదా బహుళ-స్టేట్మెంట్ టేబుల్-వాల్యూడ్ ఫంక్షన్లు (MSTVF) OFFSET
CHECKSUM_AGG
1 సూచిక వీక్షణ కలిగి ఉంటుంది ఫ్లోట్ నిలువు వరుసలు; అయినప్పటికీ, అటువంటి నిలువు వరుసలు క్లస్టర్డ్ ఇండెక్స్ కీలో చేర్చబడవు.
If GROUP BY ఉంది, VIEW నిర్వచనం తప్పనిసరిగా కలిగి ఉండాలి COUNT_BIG(*) మరియు కలిగి ఉండకూడదు HAVING. ఈ GROUP BY పరిమితులు సూచిక చేయబడిన వీక్షణ నిర్వచనానికి మాత్రమే వర్తిస్తాయి. ప్రశ్న వీటిని సంతృప్తిపరచనప్పటికీ దాని అమలు ప్రణాళికలో సూచిక చేయబడిన వీక్షణను ఉపయోగించవచ్చు GROUP BY ఆంక్షలు.
వీక్షణ నిర్వచనం కలిగి ఉంటే a GROUP BY నిబంధన, ప్రత్యేక క్లస్టర్డ్ ఇండెక్స్ యొక్క కీలో పేర్కొన్న నిలువు వరుసలను మాత్రమే సూచించవచ్చు GROUP BY నిబంధన.
భారతీయుల ప్రమేయం లేదని ఇక్కడ స్పష్టమైంది, ఎందుకంటే "మేము తక్కువ చేస్తాము, కానీ బాగా చేస్తాము" అనే పథకం ప్రకారం వారు దీన్ని చేయాలని నిర్ణయించుకున్నారు. అంటే, వారు మైదానంలో ఎక్కువ గనులను కలిగి ఉన్నారు, కానీ వారి స్థానం మరింత పారదర్శకంగా ఉంటుంది. అత్యంత నిరుత్సాహకరమైన విషయం ఈ పరిమితి:
వీక్షణ తప్పనిసరిగా వీక్షణ వలె అదే డేటాబేస్లో ఉన్న బేస్ టేబుల్లను మాత్రమే సూచించాలి. వీక్షణ ఇతర వీక్షణలను సూచించదు.
మా పరిభాషలో, ఒక ఫంక్షన్ మరొక మెటీరియలైజ్డ్ ఫంక్షన్ని యాక్సెస్ చేయలేదని దీని అర్థం. ఇది మొగ్గలోని అన్ని భావజాలాన్ని నరికివేస్తుంది.
అలాగే, ఈ పరిమితి (మరియు టెక్స్ట్లో మరింత) వినియోగ సందర్భాలను బాగా తగ్గిస్తుంది:
వీక్షణ నిర్వచనంలోని SELECT స్టేట్మెంట్ కింది లావాదేవీ-SQL మూలకాలను కలిగి ఉండకూడదు:
COUNT
ROWSET విధులు (OPENDATASOURCE, OPENQUERY, OPENROWSET, మరియు OPENXML) OUTER చేరుతుంది(LEFT, RIGHTలేదా FULL)
ఉత్పన్నమైన పట్టిక (ఒక పేర్కొనడం ద్వారా నిర్వచించబడింది SELECT లో ప్రకటన FROM ఉపవాక్య)
స్వీయ చేరికలు
ఉపయోగించి నిలువు వరుసలను పేర్కొనడం SELECT * or SELECT <table_name>.*
DISTINCT STDEV, STDEVP, VAR, VARPలేదా AVG
సాధారణ పట్టిక వ్యక్తీకరణ (CTE)
ఫ్లోట్1, టెక్స్ట్, ntext, చిత్రం, XMLలేదా ఫైల్ స్ట్రీమ్ నిలువు
సబ్క్వెరీ OVER నిబంధన, ఇది ర్యాంకింగ్ లేదా మొత్తం విండో ఫంక్షన్లను కలిగి ఉంటుంది
పూర్తి-వచన అంచనాలు (CONTAINS, FREETEXT) SUM nullable వ్యక్తీకరణను సూచించే ఫంక్షన్ ORDER BY
CLR వినియోగదారు నిర్వచించిన మొత్తం ఫంక్షన్ TOP CUBE, ROLLUPలేదా GROUPING SETS నిర్వాహకులు
MIN, MAX UNION, EXCEPTలేదా INTERSECT నిర్వాహకులు TABLESAMPLE
టేబుల్ వేరియబుల్స్ OUTER APPLY or CROSS APPLY PIVOT, UNPIVOT
చిన్న నిలువు వరుస సెట్లు
ఇన్లైన్ (TVF) లేదా బహుళ-స్టేట్మెంట్ టేబుల్-వాల్యూడ్ ఫంక్షన్లు (MSTVF) OFFSET
CHECKSUM_AGG
ఔటర్ జాయిన్స్, యూనియన్, ఆర్డర్ బై మరియు ఇతరాలు నిషేధించబడ్డాయి. ఏది ఉపయోగించకూడదు అనేదాని కంటే ఏది ఉపయోగించవచ్చో పేర్కొనడం సులభం కావచ్చు. జాబితా బహుశా చాలా చిన్నది కావచ్చు.
సంగ్రహంగా చెప్పాలంటే: LGPL టెక్నాలజీలో ప్రతి ఒక్కటి (వాణిజ్యాత్మకంగా గమనించండి) DBMS vs ఏదీ లేని (ఒక లాజికల్, సాంకేతికత మినహా) పరిమితుల యొక్క భారీ సెట్. అయితే, వివరించిన ఫంక్షనల్ లాజిక్ కంటే రిలేషనల్ లాజిక్లో ఈ మెకానిజం అమలు చేయడం కొంత కష్టమని గమనించాలి.
అమలు
అది ఎలా పని చేస్తుంది? PostgreSQL "వర్చువల్ మెషీన్"గా ఉపయోగించబడుతుంది. ప్రశ్నలను రూపొందించే సంక్లిష్ట అల్గోరిథం లోపల ఉంది. ఇక్కడ మూలం. మరియు ifs యొక్క సమూహముతో కూడిన హ్యూరిస్టిక్స్ యొక్క పెద్ద సెట్ మాత్రమే లేదు. కాబట్టి, మీరు చదువుకోవడానికి రెండు నెలల సమయం ఉంటే, మీరు వాస్తుశిల్పాన్ని అర్థం చేసుకోవడానికి ప్రయత్నించవచ్చు.
ఇది సమర్థవంతంగా పనిచేస్తుందా? చాలా ప్రభావవంతంగా ఉంటుంది. దురదృష్టవశాత్తు, దీనిని నిరూపించడం కష్టం. పెద్ద అప్లికేషన్లలో ఉన్న వేలకొద్దీ ప్రశ్నలను మీరు పరిగణనలోకి తీసుకుంటే, సగటున అవి మంచి డెవలపర్ల కంటే మరింత సమర్థవంతంగా పనిచేస్తాయని మాత్రమే నేను చెప్పగలను. ఒక అద్భుతమైన SQL ప్రోగ్రామర్ ఏదైనా ప్రశ్నను మరింత సమర్ధవంతంగా వ్రాయగలడు, కానీ వెయ్యి ప్రశ్నలతో అతను దానిని చేయడానికి ప్రేరణ లేదా సమయం ఉండదు. ఈ DBMSలో నిర్మించిన ప్లాట్ఫారమ్లో అనేక ప్రాజెక్ట్లు పని చేస్తున్నాయని నేను ఇప్పుడు ప్రభావానికి రుజువుగా చెప్పగలను ERP వ్యవస్థలు, ఇది వేలకొద్దీ వివిధ మెటీరియలైజ్డ్ ఫంక్షన్లను కలిగి ఉంది, వేలకొద్దీ వినియోగదారులు మరియు టెరాబైట్ డేటాబేస్లతో సాధారణ రెండు-ప్రాసెసర్ సర్వర్లో వందల మిలియన్ల రికార్డులు నడుస్తున్నాయి. అయితే, ఎవరైనా డౌన్లోడ్ చేయడం ద్వారా ప్రభావాన్ని తనిఖీ చేయవచ్చు/నిరాకరిస్తారు వేదిక మరియు PostgreSQL, ఆన్ చేస్తోంది SQL ప్రశ్నలను లాగిన్ చేయడం మరియు అక్కడ లాజిక్ మరియు డేటాను మార్చడానికి ప్రయత్నిస్తున్నారు.
కింది కథనాలలో, మీరు ఫంక్షన్లపై పరిమితులను ఎలా సెట్ చేయవచ్చు, మార్పు సెషన్లతో పని చేయడం మరియు మరిన్నింటి గురించి కూడా నేను మాట్లాడతాను.