Laravel ನಲ್ಲಿ N+1 ಸಮಸ್ಯೆಗಳನ್ನು ಪತ್ತೆಹಚ್ಚುವುದು ಮತ್ತು ವ್ಯರ್ಥವಾದ ಕ್ವೆಯರಿಗಳನ್ನು ನಿವಾರಿಸುವುದು
ಪರ್ಫಾರ್ಮೆನ್ಸ್ (Performance) ಕೆಲಸವು ಹೆಚ್ಚಾಗಿ ಬೇಸರ ತರಿಸುವಂತದ್ದು.
ಇದು ಯಾವಾಗಲೂ ನೀವು 80% ಲೇಟೆನ್ಸಿಯನ್ನು (latency) ಕಡಿಮೆ ಮಾಡಿದಂತಹ ಹೀರೋ ಕಥೆಗಳ ಬಗ್ಗೆ ಇರುವುದಿಲ್ಲ. ಹೆಚ್ಚಿನ ದಿನಗಳಲ್ಲಿ, ಇದು ಕೇವಲ ಸ್ವಚ್ಛಗೊಳಿಸುವಿಕೆಯ (cleaning up) ಕೆಲಸವಾಗಿರುತ್ತದೆ. ನೀವು ರನ್ ಮಾಡುತ್ತಿದ್ದೀರಿ ಎಂದು ನಿಮಗೆ ತಿಳಿಯದ ಕ್ವೆಯರಿಗಳನ್ನು ನೀವು ಪತ್ತೆಹಚ್ಚುತ್ತೀರಿ. ನಂತರ, ಅವುಗಳನ್ನು ಡಿಲೀಟ್ ಮಾಡುತ್ತೀರಿ.
ನಿಮ್ಮ Laravel ಅಪ್ಲಿಕೇಶನ್ ಬೆಳೆಯುತ್ತಿದ್ದರೆ, ನೀವು ಬಹುಶಃ ಈ ಮೂರು ಸಮಸ್ಯೆಗಳನ್ನು ಎದುರಿಸುತ್ತಿರಬಹುದು.
1. ಅಡಗಿರುವ N+1 ಕ್ವೆಯರಿಗಳು (Hidden N+1 Queries)
ನೀವು ನೋಡಲಾಗದ ವಸ್ತುವನ್ನು ಸರಿಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಲೋಕಲ್ ಎನ್ವಿರಾನ್ಮೆಂಟ್ನಲ್ಲಿ (local environment) beyondcode/laravel-query-detector ನಂತಹ ಟೂಲ್ ಅನ್ನು ಬಳಸಿ. ನೀವು ಯಾವಾಗ 'loop-and-lazy-load' ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ಬಳಸುತ್ತಿದ್ದೀರಿ ಎಂದು ಇದು ನಿಮಗೆ ತಿಳಿಸುತ್ತದೆ.
ಇದನ್ನು ಪ್ರೊಡಕ್ಷನ್ನಲ್ಲಿ (production) ಬಳಸಬೇಡಿ. ಇದು ಓವರ್ಹೆಡ್ (overhead) ಅನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ. ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ ಲೋಕಲ್ ಅಥವಾ ಟೆಸ್ಟಿಂಗ್ ಮೋಡ್ನಲ್ಲಿರುವಾಗ ಮಾತ್ರ ಇದನ್ನು ರಿಜಿಸ್ಟರ್ ಮಾಡಿ.
2. ಈಗರ್ ಲೋಡಿಂಗ್ ವ್ಯರ್ಥ (Eager Loading Waste)
ಜನರು ಹೆಚ್ಚಾಗಿ with() ಅನ್ನು ಸೇರಿಸುವ ಮೂಲಕ N+1 ಸಮಸ್ಯೆಗಳನ್ನು ಸರಿಪಡಿಸುತ್ತಾರೆ. ಆದರೆ ಇದು ಹೊಸ ಸಮಸ್ಯೆಯನ್ನು ಸೃಷ್ಟಿಸುತ್ತದೆ. ನಿಮ್ಮ ವ್ಯೂ (view) ಇನ್ನು ಮುಂದೆ ಬಳಸದ ರಿಲೇಶನ್ಶಿಪ್ ಅನ್ನು ನೀವು ಈಗರ್-ಲೋಡ್ (eager-load) ಮಾಡಬಹುದು.
ಒಂದು ವೇಳೆ ಡಿಸೈನ್ ಬದಲಾವಣೆಯಿಂದ ಟೇಬಲ್ನಿಂದ ಒಂದು ಕಾಲಮ್ ಅನ್ನು ತೆಗೆದುಹಾಕಿದರೆ, ನೀವು ನಿಮ್ಮ ಕಂಟ್ರೋಲರ್ನಲ್ಲಿ ಅದಕ್ಕೆ ಸಂಬಂಧಿಸಿದ with() ಕಾಲ್ ಅನ್ನು ತೆಗೆದುಹಾಕಲೇಬೇಕು. ನೀವು ಬಳಸದ ಡೇಟಾಕ್ಕಾಗಿ ಅನಗತ್ಯವಾಗಿ ಸಂಪನ್ಮೂಲಗಳನ್ನು ವ್ಯಯಿಸುತ್ತಿದ್ದೀರಿ.
ಪ್ರತಿಯೊಂದು ಈಗರ್ ಲೋಡ್ ಅನ್ನು ಒಂದು ಕ್ಲೈಮ್ (claim) ಎಂದು ಪರಿಗಣಿಸಿ. ನೀವು ಆ ಡೇಟಾವನ್ನು ಬಳಸದಿದ್ದರೆ, ಆ ಕ್ಲೈಮ್ ಅನ್ನು ತೆಗೆದುಹಾಕಿ.
3. ಒಂದೇ ಡೇಟಾವನ್ನು ಪದೇ ಪದೇ ಲೆಕ್ಕ ಹಾಕುವುದು (Recomputing the Same Data)
ಕೆಲವು ವ್ಯಾಲ್ಯೂಗಳು ಇಡೀ ರಿಕ್ವೆಸ್ಟ್ (request) ಕಾಲದವರೆಗೆ ಒಂದೇ ಆಗಿರುತ್ತವೆ. ನೀವು ಅವುಗಳನ್ನು ಪದೇ ಪದೇ ಲೆಕ್ಕ ಹಾಕಿದರೆ, CPU ವ್ಯರ್ಥವಾಗುತ್ತದೆ. ಇದನ್ನು ಸರಿಪಡಿಸಲು ಮೆಮೊಯೈಸೇಶನ್ (memoization) ಬಳಸಿ.
ಉದಾಹರಣೆ:
protected ?string $defaultConnection = null;
public function getDefaultConnectionName(): string
{
return $this->defaultConnection ??= $this->resolveDefaultConnection();
}
??= ಆಪರೇಟರ್ ವ್ಯಾಲ್ಯೂ ಅನ್ನು ಒಮ್ಮೆ ಮಾತ್ರ ಲೆಕ್ಕ ಹಾಕುತ್ತದೆ ಮತ್ತು ಉಳಿದ ರಿಕ್ವೆಸ್ಟ್ಗಾಗಿ ಅದನ್ನು ಮರುಬಳಕೆ ಮಾಡುತ್ತದೆ.
4. ಡ್ಯಾಶ್ಬೋರ್ಡ್ ಕ್ವೆಯರಿ ಬಲೆಗಳು (Dashboard Query Traps)
ಡ್ಯಾಶ್ಬೋರ್ಡ್ಗಳು ಹೆಚ್ಚಾಗಿ ಪ್ರತಿಯೊಂದು ಕಾರ್ಡ್ಗಾಗಿ ಪ್ರತ್ಯೇಕ count() ಕ್ವೆಯರಿಯನ್ನು ರನ್ ಮಾಡುತ್ತವೆ. ನಿಮ್ಮ ಬಳಿ ಆರು ಕಾರ್ಡ್ಗಳಿದ್ದರೆ, ನೀವು ಆರು ಕ್ವೆಯರಿಗಳನ್ನು ರನ್ ಮಾಡುತ್ತೀರಿ.
ಬದಲಾಗಿ ಈ ಎರಡು ಕೆಲಸಗಳನ್ನು ಮಾಡಿ:
- ನಿಮ್ಮ ಕೌಂಟ್ಗಳನ್ನು ಗ್ರೂಪ್ ಮಾಡಿ: ಒಂದೇ ಟೇಬಲ್ನ ಎಲ್ಲಾ ಒಟ್ಟು ಮೊತ್ತವನ್ನು (totals) ಒಂದೇ ಕ್ವೆಯರಿಯಲ್ಲಿ ಪಡೆಯಿರಿ.
- ಅಲ್ಪಾವಧಿಯ ಕ್ಯಾಶ್ (cache) ಬಳಸಿ: ಡ್ಯಾಶ್ಬೋರ್ಡ್ ಅಂಕಿಅಂಶಗಳು ಪ್ರತಿ ಸೆಕೆಂಡಿಗೂ ಲೈವ್ ಆಗಿರಬೇಕಾಗಿಲ್ಲ. ಅವುಗಳನ್ನು ಐದು ನಿಮಿಷಗಳ ಕಾಲ ಕ್ಯಾಶ್ ಮಾಡಿ.
ಒಬ್ಬ ವೀಕ್ಷಕ ಕ್ವೆಯರಿಯ ವೆಚ್ಚವನ್ನು ಪಾವತಿಸಿದರೆ, ಉಳಿದವರೆಲ್ಲರೂ ಕ್ಯಾಶ್ ಮಾಡಿದ ಫಲಿತಾಂಶವನ್ನು ಪಡೆಯುತ್ತಾರೆ.
ಅಂತಿಮ ಸಲಹೆ: ರಿಗ್ರೆಷನ್ಗಳನ್ನು ತಡೆಯಿರಿ (Prevent Regressions)
ನಂತರದ ದಿನಗಳಲ್ಲಿ ಡೆವಲಪರ್ಗಳು ಮತ್ತೆ ಕೆಟ್ಟ ಕೋಡ್ ಅನ್ನು ಸೇರಿಸಿದರೆ, ಕ್ಲೀನಪ್ ಪ್ರಕ್ರಿಯೆ ವಿಫಲವಾಗುತ್ತದೆ. ನಿಮ್ಮ ಕ್ವೆಯರಿ ಸಂಖ್ಯೆಯನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು (assert) Pest ಬಳಸಿ. ಒಂದು ಪೇಜ್ ಎಷ್ಟು ಕ್ವೆಯರಿಗಳನ್ನು ರನ್ ಮಾಡಬಹುದು ಎಂಬುದಕ್ಕೆ ಒಂದು ಮಿತಿಯನ್ನು (ceiling) ನಿಗದಿಪಡಿಸಿ. ಒಬ್ಬ ಡೆವಲಪರ್ N+1 ಅನ್ನು ಸೇರಿಸಿದರೆ, ಟೆಸ್ಟ್ ಫೇಲ್ ಆಗುತ್ತದೆ.
ಆಪ್ಟಿಮೈಸೇಶನ್ (Optimization) ಎಂದರೆ ಹೆಚ್ಚಾಗಿ ತೆಗೆದುಹಾಕುವಿಕೆಯ ಬಗ್ಗೆಯಾಗಿದೆ. ಬಳಕೆಯಾಗದ ಲೋಡ್ಗಳನ್ನು ತೆಗೆದುಹಾಕಿ. ಪದೇ ಪದೇ ಲೆಕ್ಕ ಹಾಕುವ ವ್ಯಾಲ್ಯೂಗಳನ್ನು ತೆಗೆದುಹಾಕಿ. ಅನಗತ್ಯ ಕ್ವೆಯರಿಗಳನ್ನು ತೆಗೆದುಹಾಕಿ.
