I would say to a degree that it depends on the volume of data in your system - how many active projects and resources do you have? How many custom time slices do you have and how many periods of data are they processing? Check you don't have duplicate or redundant custom time slices too. There are some guidelines in a TEC Document which are a good starting point, I don't have the reference to hand though.
We run time slicing every 5 minutes in production (approx 1000 users, 600 active projects or so, probably <10 custom time slices) and it runs quite happily just taking a few seconds each time usually. Remember that time slicing only looks for changed or new slices to process so it very rarely has to process lots of records. Exception would be if we change global calendars to add public holidays (which would update the availability slice for every user) or if for some reason we have to amend a time slice definition. But if you do these out of hours, it should not have an impact.
I have heard of other sites where it is run every minute.
You can count the records in prj_blb_slices to check the progress on the Timeslice rebuild. The Last Run date will be populated when the slices are completed.
You can also use the query below to check the status. The status will go from 1 (needs to be sliced) or status 3 (needs to roll-over) to status 2 (processing) then to NULL (completed). It will go table by table and process 1000 rows at a time. If you get nothing back then time slicing job has finished.
SELECT 'Assignment' Slice_Object,
Count(*), SLICE_STATUS, max(last_updated_date) as lud
FROM prassignment WHERE SLICE_STATUS in (1,2,3,4)
GROUP BY SLICE_STATUS
UNION
SELECT 'Allocation' Slice_Object,
Count(*), SLICE_STATUS, max(last_updated_date) as lud
FROM prteam WHERE SLICE_STATUS in (1,2,3,4)
GROUP BY SLICE_STATUS
UNION
SELECT 'Availability' Slice_Object,
Count(*), SLICE_STATUS, max(last_updated_date) as lud
FROM prj_resources WHERE SLICE_STATUS in (1,2,3,4)
GROUP BY SLICE_STATUS
Union
SELECT 'Timeentries' Slice_Object,
Count(*), SLICE_STATUS, max(prmodtime) as lud
FROM prtimeentry
WHERE SLICE_STATUS in(1, 2,3,4)
GROUP BY SLICE_STATUS
Not sure about time posting every 15 minutes - we only do posting once a week as timesheeting tends to be done on a Friday and our project managers don't need the actuals to be visible any more often than weekly, but I presume you have different business rules.
Owen