CHIDOMASTER BLACK BELT · L6S

The provider is constructed and the contracts are invented. The problem is not: the symptoms, the stack and the shape of the findings are drawn from live reporting work. Figures attributed to Kestrel are the worked example. The decomposition, the hypotheses and the measurement plan are the part intended to travel, and any reader with a different stack should be able to use those without using any of these numbers.

Instruction 03

One model, three different kinds of waiting

The brief for the third decision. A reporting model that takes an hour to refresh, ten minutes to open and a minute to answer a click, and the first job is to notice that those are three separate problems wearing one complaint.

This instruction is about a reporting model, and it is written for anybody who has one. The particular figures below belong to Kestrel. The way the problem is taken apart does not, and that part is meant to be lifted and used elsewhere.

It is stated as a problem met for the first time. No previous attempt is assumed, nothing has been measured yet, and the brief is written from the position most readers will actually be in.

Chapter 1 · What is being commissioned

The ask

Fix the process inside the reporting model, so that refreshing it, reading a report built on it, and working on it all stop costing what they currently cost.

The scope is set by the practitioner’s own words: the primary ask is to fix the process in the model. Not to buy more capacity, not to change tool, and not to reduce what the model reports. Those appear in the comparison and are scored, but the instruction is about the work the model does to itself on every cycle.

The target, in the practitioner’s words: "not more than 5 secs, waiting for visuals (at least 80% of the time)", "5 mins refresh", "10 secs to open".

So three figures against three of the needs. A visual answers a click in five seconds or less, at least eighty per cent of the time. A refresh completes in five minutes, from an hour. The model opens in ten seconds, from ten minutes, which is the most demanding of the three by a wide margin and the one most likely to decide whether the others are reachable at all.

The eighty per cent is deliberate and it is not the same as an average. It says that one interaction in five is allowed to miss, which for somebody clicking through a report fifty times a day is ten slow interactions daily. That is a defensible trade and it is a choice rather than an oversight, and it carries one obligation: the answer reports the distribution rather than the mean, because a mean of four seconds can hide a tail that is the entire complaint.

No figure is set for the response while editing. That need stands in the brief without a number, which is honest rather than an omission, and an answer should report it against the baseline even though it is not being graded against a threshold.

How the figures may be reached is constrained by the practitioner’s other words on the target: cheapest cost for quality. Quality is held rather than traded, and two routes to the numbers are therefore closed. Speed may not be bought with capacity, and it may not be bought by removing capability, which matters here because capability has already been given up once and the current timings are what remains after that concession. An option that hits five seconds by dropping a data range has not met the target, it has changed the question.

Chapter 2 · The decomposition, which is the part worth stealing

Three needs, not one problem

A performance complaint arrives as a single grievance: it is slow. It is almost never one problem, and taking it apart before doing anything else is the highest value move available, because the three parts have different populations, different costs and quite possibly different causes.

Refreshing is scheduled work that nobody waits on directly. Rendering is what happens when a reader clicks something, and it is paid by the largest population. Editing is what the maintainers experience, a small group carrying a heavy individual load. They share a model and they may share nothing else.

The consequence that matters: refresh time and render time can move in opposite directions. Pre-computing more at refresh makes reports faster and refreshes slower. Simplifying the refresh can push work into query time and slow every reader down. An answer that optimises one without measuring the others has not improved the system, it has moved the cost onto somebody with less standing to complain.

This is the piece of the brief most directly transferable. A reader with an entirely different stack can take this decomposition, apply it to their own complaint, and be further forward before they have measured anything.

The needWho is waitingWhat it costs themWhat it is measured in
Reduce the time to refresh the model Nobody, while it runs. The schedule. Freshness. A long refresh forces a choice between current numbers and a window in which the model is unavailable, and it consumes infrastructure whether or not anybody is reading anything. Elapsed time per refresh, and its variance. A refresh that is sometimes an hour is harder to plan around than one that always is. TARGET: five minutes.
Reduce the time a report takes to render Everybody who reads a report, which is the largest population by a wide margin. Twenty to sixty seconds and more, per interaction, across every user and every working day. This is almost certainly the largest cost in the instruction and the one least likely to be counted, because it is spread thinly across people who do not complain formally. Time from interaction to a rendered visual, sampled across the reports in use, separated by visual type since detail heavy visuals behave differently from summaries, and reported as a distribution rather than a mean. TARGET: five seconds or less, at least eighty per cent of the time.
Reduce the response time while working on the model The developers who maintain it, a small population carrying a heavy individual load. Ten minutes to open, up to a minute between clicks. It destroys the ability to hold a problem in your head, which is most of what the work consists of, and it is how specialists decide to leave. Time to open, and response during ordinary editing, timed against a fixed sequence of actions rather than an impression. TARGET: ten seconds to open. No figure is set for the response while editing, and it is reported against the baseline regardless.

summary: the single most useful move in this brief, and the one worth stealing. A performance complaint arrives as one grievance and is almost always three. Separating them first stops an answer fixing the cheapest one and claiming the whole.

Chapter 3 · Symptoms, and the fact that they are symptoms

What was observed

Seven observations, all reported from the live function, none of them yet timed. That distinction is why the last column exists. "Up to ten minutes" and "ten minutes routinely" point at different causes, and an hour that is one long operation is a different problem from an hour of short operations queueing.

Two rows deserve attention beyond their own line. Occasional failures are treated here as evidence rather than as incidents: intermittent failure in a system under memory pressure is telling you something about the cause. And the last row is the one that is easiest to miss, because it is not a delay at all.

Capability has already been given up. Some data ranges are unavailable to some roles, which means scope was narrowed at some point to keep the thing usable. Every timing in this brief is therefore what remains after a concession that no performance metric records. Any answer that narrows scope further is doing the same thing again, and the brief requires that to be declared rather than counted as a win.

What was observedHow badWhich need it belongs toHow it is known
Opening the model Up to ten minutes Working on the model. Reported, not timed. Whether it is ten minutes routinely or ten minutes at worst points at different causes.
Editing the model Up to a minute between clicks Working on the model. Reported. Not yet separated into interface response, query execution and model load.
Using a report Twenty to sixty seconds and more Rendering a report. Reported. The population size and the frequency are not established, and they are what decide whether this is the largest cost here or a minor one.
Refreshing Up to an hour Refreshing the model. Reported. No per table or per phase timing exists, so it is not known whether this is one long operation or many short ones waiting on each other.
Detail heavy visuals Slower than the rest Rendering a report. Reported. Useful because it is a within report contrast: the same model, the same user, different cost, which narrows the cause considerably.
Occasional failures Intermittent Refreshing the model. Reported. Intermittent failure in a system under memory pressure is a symptom rather than an accident, and the brief treats it as evidence rather than as noise.
Capability already given up Some data ranges are unavailable to some roles All three, indirectly. The state of the current design. It matters because it is the cost that no performance metric shows: scope has already been narrowed to keep the thing usable, so the current timings are what remains AFTER a functional concession.

sourced: reported from the live function. None has been measured with a clock or a trace, which is itself one of the findings and the reason the first constraint below exists.

Chapter 4 · The stack, and what each part rules in

What the model is made of

Import mode against SQL Server with a small amount of spreadsheet data. Inside: summary tables holding millions of rows, and query chains containing steps and joins. More than one report is served from the one model.

Three rows are findings rather than description. A summary table with millions of rows is either summarising at a grain that removes almost nothing or is not a summary. Transformation inside the model means that work is repeated in full on every refresh rather than performed once at the source. And a model serving several audiences has to satisfy the widest requirement any of them holds, so the heaviest consumer sets the cost for everybody.

The last two rows are the ones to establish first and the ones most often skipped, and together they carry the most transferable finding in this instruction.

This model was a minor consumer, around a tenth of the platform, while a different and much larger one was the problem. That larger model was taken through exactly this kind of improvement and has performed well ever since. Meanwhile this one grew past it, and is now worse than the original problem ever was. Nothing raised a hand while that happened.

Two lessons come out of it and neither is about this model. The first is that a properly diagnosed repair holds, so the anxiety about whether a fix will stick is usually misplaced. The second is that fixing an instance does not change the practice that produced it, so the estate simply grows another one, and the absence of anything watching means it is discovered by its victims rather than by its owners. The thing worth building may not be a faster model at all. It may be the trigger that fires when any model starts climbing.

ComponentWhat it isWhat this tells usWhat is not yet known
Storage mode Import The model is held in memory, so open time and interaction cost track its size, and refresh is paid in full on a schedule rather than per query. Nothing material. This one is settled.
Primary source A SQL Server database A source capable of set based work against indexes, so work happening elsewhere is a choice rather than a necessity. Whether it is on premises, which decides whether a gateway sits in the path of every refresh and can move the cause out of the model entirely.
Secondary source Spreadsheets, described as minimal Minimal by volume. Significance is not proportional to size here; it depends on where they enter the processing rather than how many rows they hold. How many, where they join, and whether anything connects them to a large table.
What the model contains Summary tables holding millions of rows A summary with millions of rows is either summarising at a grain that removes almost nothing, or is not a summary. The row count is the finding, before anybody opens it. Each summary’s rows as a proportion of its source rows, and whether the detail it summarises also sits in the same model.
How the tables are built Query steps and joins inside the model Transformation lives in the model, so it is performed again in full on every refresh rather than once at the source. How many queries, how long the chains, which steps join, and whether queries feed other queries.
What the model serves More than one report, with different audiences and different needs One model carrying both an operational report and an audit oriented one has to satisfy the widest requirement of any consumer, so the heaviest audience sets the cost for everybody. How many reports, which audiences, and whether any of them needs the full data range that the others are paying for.
Its share of the estate Large now. Small not long ago. This model was a minor consumer, around a tenth of capacity, and is now the heaviest thing on the platform. Its share today is less interesting than its trajectory, and nothing in the platform raised a hand while it crossed over. The growth curve: this model’s capacity share by month for as far back as the telemetry goes, and the same curve for every other model on the platform.
The rest of the estate Many models, one shared capacity A previous model on this platform was taken through exactly this kind of improvement and has performed well ever since, so the method is not in doubt. What was never changed is how models get built, which is why a second one grew into the same condition unobserved. Whether any other model is on the same trajectory today, and what would have to be true for somebody to notice before it arrives.

sourced: stated by the practitioner. The unknown column is not padding, because each entry changes which explanation below survives.

Chapter 5 · Six candidates, written down before the evidence

The explanations in play

Six candidate causes, listed before any evidence is gathered rather than after, so that the answer cannot quietly settle on whichever one is cheapest to fix.

Writing the disproof next to each is the discipline that makes the list worth anything. Any hypothesis can be confirmed by somebody motivated to confirm it, particularly in a system where almost any change produces some improvement. Stating in advance what would rule each one out is the only practical defence, and it costs nothing at this stage and is impossible later.

Note that these are not mutually exclusive and the answer should not assume one winner. The likeliest outcome in a model in this condition is that two or three are true at once, with different weights against each of the three needs.

Candidate explanationWhat it would meanWhat would prove itWhat would rule it out
The order things process in Tables wait on other tables, so what could run at once runs in sequence, and the refresh is as slow as the longest chain rather than the slowest table. A timeline of one refresh drawn per table against the clock, showing a staircase with little overlap. The same timeline showing wide parallel bars and one long one, which would make it a single expensive object instead.
Work that should not be in the model The model is doing a warehouse’s job at refresh time, so the cost is paid every cycle rather than once. The share of refresh time spent transforming rather than reading, and the number of steps that cannot be delegated to the source. Thin chains and time spent purely reading, which would move the question to the source or the transport.
One dominant object A single table or column accounts for most of the model and most of the time, and everything else is noise. A column by column analysis showing a small number of objects dominating. A flat distribution, which would mean there is no single win and the answer must be structural.
The model serves too many masters One model satisfying several audiences carries the union of all their requirements, so the least demanding user pays the cost of the most demanding one. A requirement held by one audience and by no other that materially drives size or complexity. Finding the audiences need substantially the same data, which would make separation pointless.
The transport rather than the model If the source is on premises, every refresh passes through a gateway, and an undersized or shared one produces these symptoms with nothing wrong in the model. Gateway resource use and queueing during a refresh. A hosted source, or a gateway sitting idle while the refresh runs.
Size alone, and capacity contention The model does not comfortably fit the memory available, so everything is slow for one reason, and it competes with every other model on the same capacity. Model size against available memory, and whether interaction times worsen when other models refresh. A model that fits with room, and timings indifferent to what else is running.

summary: the explanations in play, written down before the evidence is gathered so the answer cannot quietly settle on whichever is easiest to fix. The answer is required to reach a finding on each, including those it rejects. This table is the part of the brief most directly reusable elsewhere.

Chapter 6 · Six unknowns, and what each costs to close

What has not been measured

Every figure in this brief is a report. Nothing has been traced, timed or profiled. The answer closes these before it scores anything.

The effort column makes the point that this is cheap. The whole list is a few days of one person’s time against a problem costing many people a part of every day. There is no version of this decision in which measuring first is the expensive option.

The first row is the one that decides the weights, and it is the one nobody thinks to ask for. Until somebody counts how many people wait and how often, the relative importance of the three needs is an assumption, and every weight resting on it is an assumption too. It takes half a day.

What has not been measuredWhy it decides the answerHow it would be measuredEffort
How many people wait, and how often It sets the weights. A minute lost by two hundred readers several times a day is a different instruction from a minute lost by three developers, and at present nobody knows which this is. Report usage: distinct users, sessions, interactions per session, from the platform’s own telemetry. Half a day.
Where the refresh time goes It separates the ordering explanation from a single expensive object, and those have different answers. A trace of one refresh, plotted per table and per phase against the clock. Under a day.
What the model is made of, by size It identifies whether a few objects dominate or the problem is spread across everything. A column by column analysis of the published model. Half a day.
How much work leaves the source It establishes whether the source is being used or bypassed, which is the difference between tuning and redesign. For each query, the point in its chain at which processing stops being delegated to the database. A day.
The growth curve, for every model This model went from a tenth of capacity to the heaviest on the platform without anything flagging it. The rate of change is the early warning that was missing, and the same curve for every other model says whether the next one is already on its way. Capacity consumption per model per month, plotted as a trajectory rather than a snapshot, against users per model. A day, and it is the row most likely to change what the answer recommends.
Why nothing raised a hand A model crossing from minor to dominant is an event, and no event was recorded. Whatever would have caught it does not exist, and building it is probably worth more than fixing this model. What is currently monitored on the platform, what thresholds exist, and who receives them. Half a day.
What the failures are Intermittent failure under load is evidence about the cause, not a separate incident to be logged and closed. The failure records, correlated with refresh timing and concurrent load. Half a day.

derived: each row changes which explanation above survives. The brief requires them closed before any option is scored, because an option chosen without them is a preference rather than a decision.

Chapter 7 · What is scored, and what was excluded

The boundary of the comparison

Six options are in the comparison. Naming them here rather than in the answer is deliberate: choosing which alternatives you score against is the second way to rig a rubric, and unlike the weights, nobody audits it.

Do nothing, and keep paying what is currently being paid. It is in the set because it is the option actually being exercised, and because its cost has never been added up.

Add capacity. More memory, a larger tier, faster hardware. In the set because it is what somebody credible will argue for, because it is the fastest to execute, and because an answer that does not score it honestly will not be believed. It should be scored on what it fixes and on what it leaves untouched.

Repair the model in place, without changing where the processing happens.

Move the processing, so the model stops performing work on every cycle that could be performed once elsewhere.

Split the model, so that audiences with different requirements stop paying for each other.

Rebuild, treating the current model as evidence about requirements rather than as a thing to be corrected.

Two exclusions, stated rather than implied. Changing the reporting tool is excluded: the symptoms described are not properties of the tool, and the same design would reproduce them elsewhere, so it would be an expensive way of not answering the question. Reducing what the model reports is excluded as a first resort, because capability has already been given up once and doing it again is a decision for the people who lose the data rather than for a performance project.

Chapter 8 · Weights, proposed and awaiting confirmation

How the answer will be graded

These weights are a draft and the table says so. They are the argument rather than the arithmetic, so they belong to the practitioner, and nothing is scored until he has confirmed or changed them.

One dependency is worth naming because it is unusual. The first two weights cannot honestly be set until somebody counts the readers. They are drafted on the assumption that report readers outnumber maintainers heavily, which is normally true and is not yet established here. If the reader population turns out to be small, the first weight is wrong and the answer should say so rather than score against a number it has quietly stopped believing.

Honesty of measurement carries ten per cent and functions as a veto, because every figure in this brief is currently a report, and an improvement nobody can demonstrate on a clock is not one.

CriterionWeightWhy it carries that weightHow it is scored
Time returned to report readers 30% Provisionally the largest weight because it is provisionally the largest population. If the reader count turns out to be small, this weight is wrong and should fall. Rendering time across the reports in use, timed before and after against the same interactions.
Time returned to the people maintaining it 20% A small population carrying a heavy individual load, and the one that decides whether the team can still be staffed in two years. Time to open, and response during a fixed editing sequence.
Refresh duration, reliability and cost 20% Freshness, the window in which the model is unusable, the intermittent failures, and the infrastructure the refresh consumes whether or not anybody is reading. Elapsed refresh time and its variance, failure rate, and capacity consumed per cycle.
Whether the next model avoids this 20% Not whether the repair holds on this model, which the evidence suggests it will, but whether the practice that produced it changes. A model fixed properly stays fixed. The question is what stops a third one arriving in the same condition, and whether anything would notice it on the way. Whether the answer changes how models are built and what is monitored, scored against a stated test, and whether either survives without somebody remembering to enforce it.
Honesty of the measurement 10% Small weight, veto in practice. Every figure in this brief is currently a report rather than a measurement, and an improvement nobody can demonstrate on a clock is not an improvement. Whether a before and after can be produced by somebody other than the person who made the change.

PROVISIONAL, and deliberately left so. The targets are set; these weights are not, because the first two cannot honestly be fixed until somebody counts how many people wait and how often, which is the first row of the unknowns. They are published provisionally rather than withheld, so that a reader can see what the scoring would rest on and disagree with it early. Nothing is scored until the count exists. Weights are published before scoring and are the argument, so they belong to the practitioner. These are a draft to confirm or change, and nothing should be scored until he has. Note the dependency: the first two weights cannot honestly be set until the population question in the unknowns is closed.

Chapter 9 · What any answer has to live inside

The constraints that are not negotiable

Reporting does not stop. The outputs the operation and the commissioners depend on keep being produced, on time, throughout whatever is changed.

Report layout and the insight on the page do not change. This is a performance instruction, not a redesign, and a change that forces every reader to be retrained has failed a requirement rather than met one.

No figure changes meaning without it being declared. If a redesign alters how a measure is calculated, that is a definition change, it goes through the register, and the people who rely on it are told. A performance project does not quietly restate history.

A baseline is captured before anything changes, for all three needs, timed and recorded. This constraint exists because the temptation to start fixing on the first day is very strong and the baseline is unrecoverable once the work begins.

Any capability given up is declared as a cost against the gain, with a named person agreeing to it. Scope reduction is a legitimate answer and an illegitimate way of hitting a target quietly.

Every improvement is demonstrated on a clock by somebody other than the person who made the change.

And the answer reaches a finding on every hypothesis, including those it rejects. Silence on a hypothesis is not a finding.

Chapter 10 · Six, and the first is the reason the brief is structured this way

The risks this decision has to address

The first risk is why this brief opens with three needs rather than one problem. They arrive as a single complaint, one number is far easier to report than three, and the collapse back into one is the most likely way this goes wrong while looking like it went right.

The last is not technical and is the most likely to be fatal. Every summary table and every step in those chains was somebody competent solving a real problem under a deadline. An answer written as a list of defects will be resisted by the people whose knowledge it depends on, and it will be resisted quietly, which is the hardest kind to argue with.

  • The three needs get collapsed back into one

    Unquantified
    Mechanism
    They arrive as one complaint and it is much easier to report one number. An answer halves the refresh, the headline says the model is twice as fast, and the readers are still waiting a minute for a visual because nothing that was done touched query time.
    Who carries it
    The report readers, who are the largest group and the least likely to be asked.
    To measure it
    Whether the answer reports a before and after separately for each of the three needs, and says plainly where it did not move.
  • The fix is chosen before the cause is known

    Unquantified
    Mechanism
    Every symptom here has several plausible causes, and almost any change to a model in this condition produces some improvement. That combination makes it very easy to prove something that was never tested.
    Who carries it
    The same people, a year later, when the real cause reasserts itself.
    To measure it
    Whether the answer reaches a finding on every hypothesis, including those it rejects, with the evidence for each.
  • Improvement is claimed against no baseline

    Unquantified
    Mechanism
    Nothing here has been timed. Start fixing before capturing a baseline and afterwards there is a faster model and an anecdote, with no way to say what any individual change was worth.
    Who carries it
    Whoever has to justify the effort, and the next person proposing similar work.
    To measure it
    A recorded baseline for all three needs, taken before any change.
  • Capacity is bought instead

    Unquantified
    Mechanism
    More memory is the fastest option to execute and the easiest to approve, and it will produce a real improvement for a while. It also raises the running cost permanently and leaves every cause intact, so the next model built the same way arrives on a bigger machine.
    Who carries it
    The budget, quietly and indefinitely.
    To measure it
    Whether the answer scores capacity honestly as an option, including what it does and does not fix, rather than dismissing it or defaulting to it.
  • Scope is cut and counted as a win

    Unquantified
    Mechanism
    Data ranges have already been narrowed for some roles to keep the model usable. That is a real cost that no performance metric records, and the cheapest way to hit any target here is to quietly remove more capability.
    Who carries it
    Whoever needed the data that was removed, who will not be in the room.
    To measure it
    Whether any capability is given up, stated explicitly as a cost against the gain, and who agreed to it.
  • This model gets fixed and the next one is already growing

    Unquantified
    Mechanism
    A model is repaired, it performs well, the project closes and everybody is satisfied. Nothing changed about how models are built or what is watched, so another one is quietly crossing the same threshold while the improvement is being celebrated. It is not a hypothetical: this model was a minor consumer when a different one was the problem, and it overtook without anything raising a hand.
    Who carries it
    Whoever is handed the next one, which on the pattern so far is the same team about two years later.
    To measure it
    Whether the answer delivers a change to how models are built and a trigger that fires on a growth trajectory rather than on a threshold, and whether the growth curve of every other model has been looked at before the project closes.
  • The people who built it read this as a judgement on them

    Unquantified
    Mechanism
    Every summary table and every step in those chains was a competent person solving a real problem under a deadline with the tools in front of them. An answer written as a catalogue of defects will be resisted by exactly the people whose knowledge it needs.
    Who carries it
    The change itself, which quietly does not happen.
    To measure it
    Whether the current design is explained rather than blamed, which is a property of the document and can be checked by giving it to one of them to read.

Chapter 11 · The completeness test

What a complete answer has to contain

A recorded baseline for all three needs, taken before any change: refresh duration, rendering time across the reports in use, and a fixed editing sequence, all timed.

A count of who waits and how often, because the weights depend on it and it takes half a day.

The six unknowns closed, with the evidence attached rather than summarised.

A finding on every hypothesis, including those rejected, with what proved or ruled out each one, and an explicit position on whether more than one is true at once.

A statement of cause, in one sentence, that somebody could disagree with. "A number of factors" is not a finding.

All six comparator options scored against the confirmed weights, including doing nothing and including buying capacity, each costed as a range with its basis given.

A before and after per need, reported separately, including any need that did not move. One number improving is not permitted to stand for the other two.

A sequenced plan in the order the work would be done, with the measurement that closes each stage and the point at which the approach would be abandoned if the numbers did not move.

What it costs the people doing it, in days, and what stops being delivered while it happens.

What changes about how the next model is built, and what makes that hold without anybody having to remember it. This is the part most often left out and the part that decides whether the problem returns.

And it is written so that somebody with a different stack can follow the reasoning and apply it to their own model. That is a requirement of this instruction rather than a courtesy, because the point of the exercise is to be useful to people who will never see this one.

Instruction 03 is open

The criteria and weights on this page are proposed and await confirmation, and no target has been set. No answer exists yet, and nothing has been scored.

Back to the case study