SELECT * FROM Sales.SalesOrderHeader
WHERE OrderDate < '2014-06-29'
ORDER BY OrderDate DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY
Мушкилот дар он аст, ки OrderDate майдони беназир аст ва шарти дар боло нишондодашуда эҳтимоли бисёр сатрҳои заруриро аз даст медиҳад. Барои илова кардани номуайянӣ ба ин дархост, шумо бояд майдони беназирро ба шарт илова кунед (фарз кунед, ки 75074 арзиши охирини калиди ибтидоӣ аз қисми аввал аст):
SELECT * FROM Sales.SalesOrderHeader
WHERE (OrderDate = '2014-06-29' AND SalesOrderID < 75074)
OR (OrderDate < '2014-06-29')
ORDER BY OrderDate DESC, SalesOrderID DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY
Ин хосият дуруст кор мекунад, аммо дар маҷмӯъ оптимизатсия кардан душвор хоҳад буд, зеро шарт оператори OR-ро дар бар мегирад. Агар арзиши калиди асосӣ бо зиёд шудани OrderDate зиёд шавад, пас шартро бо гузоштани танҳо филтр аз SalesOrderID содда кардан мумкин аст. Аммо агар байни арзишҳои калиди ибтидоӣ ва майдоне, ки натиҷа ба он мураттаб карда мешавад, таносуби қатъӣ вуҷуд надошта бошад, дар аксари DBMS аз ин Ё худдорӣ кардан мумкин нест. Истисное, ки ман медонам, PostgreSQL мебошад, ки муқоисаи наворҳоро комилан дастгирӣ мекунад ва шарти дар боло зикршударо метавон ҳамчун "КУҶО (OrderDate, SalesOrderID) < ('2014-06-29', 75074)" навишт. Бо назардошти калиди таркибӣ бо ин ду майдон, дархости монанди ин бояд хеле осон бошад.
Як равиши алтернативии дуюмро метавон пайдо кард, масалан, дар API паймоиш ElasticSearch ё Cosmos DB — вақте ки дархост, ба ғайр аз маълумот, идентификатори махсусро бармегардонад, ки бо он шумо метавонед қисми навбатии маълумотро гиред. Агар ин идентификатор мӯҳлати бемаҳдуд дошта бошад (чунон ки дар Comsos DB), он гоҳ ин як роҳи олиҷаноб барои амалӣ кардани пейджинг бо гузариши пайдарпай байни саҳифаҳо аст (варианти №2 дар боло зикршуда). Камбудиҳои эҳтимолии он: он дар ҳама DBMS дастгирӣ намешавад; идентификатори порчаи навбатии натиҷавӣ метавонад мӯҳлати маҳдуд дошта бошад, ки одатан барои амалисозии ҳамкории корбар мувофиқ нест (ба монанди API паймоиши ElasticSearch).
Филтри мураккаб
Биёед вазифаро боз хам мураккабтар кунем. Фарз мекунем, ки барои татбиқи ҷустуҷӯи ба истилоҳ паҳлӯӣ, ки барои ҳама аз мағозаҳои онлайн хеле шинос аст, вуҷуд дорад. Намунаҳои дар асоси ҷадвали фармоишҳо овардашуда дар ин ҳолат чандон тасвирӣ надоранд, аз ин рӯ биёед аз пойгоҳи додаҳои AdventureWorks ба ҷадвали Маҳсулот гузарем:
Идеяи паси ҷустуҷӯи паҳлӯӣ чист? Гап дар он аст, ки барои ҳар як унсури филтр шумораи сабтҳое, ки ба ин меъёр мувофиқанд, нишон дода шудаанд бо назардошти филтрҳои интихобшуда дар ҳамаи категорияҳои дигар.
Масалан, агар мо категорияи Дучархаҳо ва ранги Сиёҳро дар ин мисол интихоб кунем, ҷадвал танҳо велосипедҳои сиёҳро нишон медиҳад, аммо:
Барои ҳар як меъёр дар гурӯҳи Категорияҳо, шумораи маҳсулоти ин категория бо ранги сиёҳ нишон дода мешавад.
Барои ҳар як меъёри гурӯҳи "Рангҳо" шумораи велосипедҳои ин ранг нишон дода мешавад.
Акнун биёед тасаввур кунем, ки ин корро дар асоси муносибатҳо чӣ гуна амалӣ кардан мумкин аст. Ҳар як гурӯҳи меъёрҳо, ба монанди Категория ва Ранг, дархости алоҳидаро талаб мекунад:
SELECT pc.ProductCategoryID, pc.Name, COUNT(1) FROM Production.Product p
INNER JOIN Production.ProductSubcategory ps ON p.ProductSubcategoryID = ps.ProductSubcategoryID
INNER JOIN Production.ProductCategory pc ON ps.ProductCategoryID = pc.ProductCategoryID
WHERE p.Color = 'Black'
GROUP BY pc.ProductCategoryID, pc.Name
ORDER BY COUNT(1) DESC
SELECT Color, COUNT(1) FROM Production.Product p
INNER JOIN Production.ProductSubcategory ps ON p.ProductSubcategoryID = ps.ProductSubcategoryID
WHERE ps.ProductCategoryID = 1 --Bikes
GROUP BY Color
ORDER BY COUNT(1) DESC
Одатан пас аз ин изҳорот ба ман баъзе роҳҳои ҳалли худро пешниҳод мекунанд, аз ҷумла:
Ҳама ҳисобҳои миқдорро дар як дархост муттаҳид кунед. Аз ҷиҳати техникӣ ин бо истифода аз калимаи калидии UNION имконпазир аст, аммо он ба иҷрои он чандон кумак намекунад - базаи маълумот бояд ҳар як порчаро аз сифр иҷро кунад.
Миқдори кэш. Ин ба ман тақрибан ҳар боре, ки ман мушкилотро тавсиф мекунам, пешниҳод карда мешавад. Огоҳӣ ин аст, ки ин умуман ғайриимкон аст. Фарз мекунем, ки мо 10 "ҷиҳат" дорем, ки ҳар яки онҳо 5 арзиш доранд. Ин дар муқоиса бо он чизе, ки дар ҳамон мағозаҳои онлайн дидан мумкин аст, хеле "хоксорона" аст. Интихоби як унсури ҷиҳат ба миқдори 9-и дигар таъсир мерасонад, ба ибораи дигар, барои ҳар як комбинатсияи меъёрҳо миқдорҳо метавонанд гуногун бошанд. Дар мисоли мо, ҳамагӣ 50 меъёр мавҷуд аст, ки корбар метавонад онҳоро интихоб кунад, бинобар ин, 250 комбинатсияи имконпазир вуҷуд дорад. Барои пур кардани чунин массиви маълумот хотира ё вақти кофӣ нест. Дар ин ҷо шумо метавонед эътироз кунед ва бигӯед, ки на ҳама комбинатсияҳо воқеӣ ҳастанд ва корбар хеле кам беш аз 5-10 меъёрро интихоб мекунад. Бале, боркунии танбалӣ ва кэш кардани миқдори танҳо он чизе, ки қаблан интихоб шудааст, имконпазир аст, аммо ҳар қадаре, ки интихобҳо зиёд бошанд, чунин кэш ҳамон қадар самараноктар мешавад ва мушкилоти вақти вокуниш ба назар намоёнтар мешавад (хусусан агар маҷмӯи маълумот мунтазам тағйир меёбад).
Хушбахтона, чунин мушкилот муддати тӯлонӣ ҳалли хеле муассир дорад, ки дар ҳаҷми калони маълумот пешгӯишаванда кор мекунанд. Барои ҳар яке аз ин вариантҳо, тақсим кардани ҳисобкунии дубораи ҷабҳаҳо ва қабули саҳифаи натиҷаҳоро ба ду занги мувозӣ ба сервер ва ташкили интерфейси корбар тавре ташкил кардан лозим аст, ки боркунии маълумот аз рӯи паҳлӯҳо ба намоиши натиҷаҳои ҷустуҷӯ.
Ҳисобкунии пурраи "ҷиҳатҳо" -ро то ҳадди имкон кам даъват кунед. Масалан, ҳар дафъае, ки меъёрҳои ҷустуҷӯ тағйир меёбад, ҳама чизро аз нав ҳисоб накунед, балки ба ҷои он шумораи умумии натиҷаҳоеро, ки ба шароити ҷорӣ мувофиқанд, пайдо кунед ва аз корбар хоҳиш кунед, ки онҳоро нишон диҳад - "1425 сабт ёфт шуд, нишон диҳед?" Истифодабаранда метавонад ё тағир додани шартҳои ҷустуҷӯро идома диҳад ё тугмаи "нишон" -ро пахш кунад. Танҳо дар ҳолати дуюм ҳамаи дархостҳо барои ба даст овардани натиҷаҳо ва аз нав ҳисоб кардани миқдорҳо аз рӯи ҳама «ҷиҳатҳо» иҷро карда мешаванд. Дар ин ҳолат, тавре ки шумо ба осонӣ мебинед, шумо бояд бо дархост барои ба даст овардани шумораи умумии натиҷаҳо ва оптимизатсияи он муроҷиат кунед. Ин усулро дар бисёр мағозаҳои хурди онлайн пайдо кардан мумкин аст. Аён аст, ки ин як даво барои ин мушкилот нест, аммо дар ҳолатҳои оддӣ он метавонад як созиши хуб бошад.
Барои дарёфти натиҷаҳо ва ҳисоб кардани паҳлӯҳо, аз қабили Solr, ElasticSearch, Sphinx ва дигарон аз муҳаррикҳои ҷустуҷӯ истифода баред. Ҳамаи онҳо барои сохтани "ҷиҳатҳо" тарҳрезӣ шудаанд ва ин корро аз ҳисоби индекси инвертсионалӣ хеле самаранок иҷро мекунанд. Муҳаррикҳои ҷустуҷӯ чӣ гуна кор мекунанд, чаро дар чунин мавридҳо онҳо нисбат ба пойгоҳи додаҳои умумӣ самараноктаранд, кадом амалияҳо ва домҳо вуҷуд доранд - ин мавзӯъ барои мақолаи алоҳида аст. Дар ин ҷо мехоҳам таваҷҷӯҳи шуморо ба он ҷалб намоям, ки системаи ҷустуҷӯӣ ивазкунандаи нигаҳдории маълумоти асосӣ шуда наметавонад, он ҳамчун илова истифода мешавад: ҳама гуна тағйирот дар базаи асосӣ, ки барои ҷустуҷӯ мувофиқанд, ба индекси ҷустуҷӯ ҳамоҳанг карда мешаванд; Муҳаррики ҷустуҷӯ одатан танҳо бо системаи ҷустуҷӯӣ ҳамкорӣ мекунад ва ба пойгоҳи додаҳои асосӣ дастрасӣ надорад. Яке аз нуктаҳои муҳимтарин дар ин ҷо ин аст, ки чӣ гуна ин ҳамоҳангсозиро боэътимод ташкил кардан мумкин аст. Ҳамааш ба талаботи "вақти реаксия" вобаста аст. Агар ваќти байни таѓйир додани базаи базаи асосї ва «зоњир»-и он дар љустуљў љињатнок набошад, шумо метавонед хадамотеро созед, ки њар чанд даќиќа сабтњои ба наздикї таѓйирёфтаро љустуљў мекунад ва онњоро индексатсия мекунад. Агар шумо хоҳед, ки кӯтоҳтарин вақти вокуниш ба даст оред, шумо метавонед чизе монанди амал кунед паёмдони транзаксионӣ барои фиристодани навсозиҳо ба хидмати ҷустуҷӯ.