Най-добрият подход към данни за пейджинг база данни в ASP.Net (SQL база данни срещу уеб сървър)

Вече внедрих два доста бързи начина за страниране на голяма таблица с база данни на MS SQL Server, която съдържа поне 1,000,000 записа, но не успях да определя плюсовете и минусите на нито един от методите, съветите за всеки от тях ще бъдат високо оценени:

Първият е да изпълните SQL заявката и да върнете само стойностите на първичния ключ на филтрираните записи, като посочите клауза TOP от може би 100-1000. След това те могат да бъдат поставени в променлива на сесията на уеб сървъра и съответно да бъдат преглеждани чрез предоставяне на подмножество от стойности на първичен ключ обратно на сървъра.

Една положителна страна за това е, че филтрирането на записите се случва само веднъж, когато потребителят първоначално извършва търсене и второ, дава възможност да прелиствате целия набор от записи един по един елемент, ако е необходимо, като например при визуализации на предстоящи записи, и т.н. Този метод също така предоставя някои предимства по отношение на по-нататъшното филтриране на вече филтрирани записи, тъй като опциите за филтриране могат да бъдат определени чрез предоставяне на списъка със стойности на първичен ключ обратно на SQL Server - като общи атрибути, заглавие, директори и т.н.

Втората опция е да извършите както филтрирането, така и странирането чрез SQL Server, предоставяйки променливи като „записи на страница“ и „номер на страница“ и т.н.

Ползата от това е, че няма нужда да задръствате уеб сървъра с потребителски сесии, чийто размер несъмнено ще бъде най-малко 1000+ байта всяка, което само ще причини проблеми в дългосрочен план, тъй като броят на потребителите на уеб сайта се увеличава. За разлика от това, недостатъците в крайна сметка са това, което изброих като положителни за първата опция, като например липсата на възможност за определяне на опции за филтриране за целия набор от записи, като има само една страница или подмножество от стойности на първичен ключ за работа с на уеб сървъра.

Какви са мислите на всички предвид горното, особено по отношение на съхраняването на стойностите на първичния ключ за резултатите в променлива на сесия, памет, алтернативни опции и т.н.?


person Nathan    schedule 09.07.2013    source източник


Отговори (1)


Аз съм от хората, които смятат, че времето за база данни е по-ценно от времето за уеб сървър. Но това е моят подход. Във вашия случай как извличате данните? Използвате ли DataSet/DataTables или използвате Strong typed контейнери? Защо не използвате linq или друга техника за филтриране от страната на уеб сървъра или дори от страната на клиента? (Можете да покажете целия запис на потребителя и да използвате javascript за филтриране).

person mtzaldo    schedule 09.07.2013
comment
Съгласен съм с предпоставката, че db обикновено е тясното място. Винаги можете да добавите повече уеб сървъри към ферма, за да достигнете до същата база данни. - person granadaCoder; 09.07.2013
comment
или повече RAM към текущите уеб сървъри. - person mtzaldo; 09.07.2013
comment
Данните се извличат най-вече чрез основни CRUD функции, които използват класове на SqlClient, връщат се в XML формат и след това се десериализират в строго типизирани обекти - въпреки че това се прави само когато се връщат сложни обекти с взаимоотношения дете/родител. Процесът на извличане на данни е доста добър и връща данни от първичната заявка изключително бързо, основната ми грижа ще бъде задръстването на паметта на сървъра с безброй променливи на сесията и след това необходимостта от повторно внедряване по-късно по линията. - person Nathan; 09.07.2013
comment
Опитайте се да запазите данните в сесията в уеб сървъра, в случай че трябва да бъдат извлечени от кеша. Също така направете страниране, филтриране и сортиране и други неща в клиента, използвайки js (може би можете да използвате възможности за съхранение на html5). Така че с това удряте паметта на вашия уеб сървър, но цялата обработка, свързана с манипулирането на данните, се случва в клиента. - person mtzaldo; 09.07.2013