მონაცემთა ბაზებში პირველად გასაღებად (primary key) შემთხვევითი UUID-ების გამოყენება გავრცელებული პრაქტიკაა. თუმცა, ანდერს მერფის ბოლოდროინდელი კვლევა ცხადყოფს, რომ ამ მიდგომას შესრულების სერიოზული ხარჯები ახლავს თან.

მთავარი პრობლემა UUID4-ის შემთხვევით ბუნებაშია. როდესაც მონაცემებს B-tree სტრუქტურაში შემთხვევითი თანმიმდევრობით ვამატებთ, სისტემას მუდმივად უწევს ბალანსის ხელახლა დაცვა, რაც ზედმეტ დატვირთვას იწვევს.

SQLite-ში ჩვეულებრივი ცხრილები იყენებენ 64-ბიტიან მთელი რიცხვის ტიპის გასაღებს, რომელსაც rowid ეწოდება. ეს არის ეფექტური, კლასტერული ინდექსი, რომელიც მონაცემების ფიზიკურ შენახვას განსაზღვრავს. შედარებისთვის, WITHOUT ROWID ცხრილებში, სადაც თავად ვუთითებთ პირველად გასაღებს, B-tree სტრუქტურა განსხვავებულად მუშაობს.

total rowstime in ms
10000000838
20000000762
30000000819
40000000713
50000000721
60000000757
70000000692
80000000702
90000000696
100000000715

კვლევის ფარგლებში ჩატარებულმა ტესტმა აჩვენა, რომ 10 მილიონი ჩანაწერის დამატებისას, სტანდარტული rowid-ის შემთხვევაში სისტემა წამში დაახლოებით მილიონ ოპერაციას ასრულებს.

total rowstime in ms
100000002649
200000005644
300000007137
400000008352
500000009359
600000009817
7000000010490
8000000011130
9000000011668
10000000012586

როდესაც იგივე ოპერაცია UUID4-ით ჩატარდა, შედეგი გამანადგურებელი აღმოჩნდა: პროცესი 14-16-ჯერ შენელდა. პროფილერით ჩატარებულმა ანალიზმა დაადასტურა, რომ სისტემა მთელ რესურსს ხარჯავს ხის სტრუქტურის ბალანსირებაზე, კითხვასა და წერაზე.

პრობლემის გადასაჭრელად მერფი UUID7-ის გამოყენებას გვთავაზობს. ვინაიდან UUID7 დროზეა დამოკიდებული, ის გამორიცხავს UUID4-ისთვის დამახასიათებელ არეულობას. მიუხედავად იმისა, რომ ეს მეთოდი უფრო სწრაფია, ის მაინც ჩამოუვარდება სტანდარტულ rowid-ს, ძირითადად 16-ბაიტიანი UUID-ის ზომის გამო (8-ბაიტიან მთელ რიცხვთან შედარებით).

total rowstime in ms
100000001372
200000001280
300000001365
400000001250
500000001256
600000001270
700000001246
800000001257
900000001245
1000000001258

კიდევ ერთი ვარიანტია UUID4-ის გამოყენება rowid-თან ერთად. თუმცა, ამ შემთხვევაშიც ვიღებთ „ჩაწერის ამპლიფიკაციას“, რადგან ცხრილს უკვე ორი ინდექსი აქვს, რაც საერთო მუშაობაზე ნეგატიურად აისახება.

დასკვნა ნათელია: სანამ UUID-ს პირველად გასაღებად აირჩევთ, გაითვალისწინეთ შესრულების ის ხარჯები, რომელსაც SQLite-ის არქიტექტურული თავისებურებები განაპირობებს.

total rowstime in ms
100000002003
200000002324
300000003285
400000004399
500000005194
600000005659
700000006215
800000006467
900000006924
1000000007119