समस्या
BENCHMARK(count, expr) में expr एक **स्केलर एक्सप्रेशन** (एकल मान) होना चाहिए। यदि सबक्वेरी एकाधिक पंक्तियाँ लौटाती है, तो त्रुटि होती है:
ERROR 1242 (21000): Subquery returns more than 1 row
समाधान: एकल पंक्ति/स्केलर मान सुनिश्चित करें
सबक्वेरी को संशोधित करें ताकि यह केवल एक पंक्ति/मान लौटाए (उदाहरण के लिए LIMIT 1 या विशिष्ट WHERE क्लॉज के साथ)।
व्यावहारिक उदाहरण
टेबल बनाना
mysql> CREATE TABLE UserDemo (
UserId INT,
UserName VARCHAR(20),
RegisteredCourse VARCHAR(10)
);
डेटा डालना
mysql> INSERT INTO UserDemo VALUES(1, 'John', 'Java'); mysql> INSERT INTO UserDemo VALUES(2, 'Larry', 'C'); mysql> INSERT INTO UserDemo VALUES(3, 'Carol', 'C++'); mysql> INSERT INTO UserDemo VALUES(4, 'Mike', 'C#');
गलत: एकाधिक पंक्तियाँ लौटाने वाली सबक्वेरी
mysql> SELECT BENCHMARK(1000, (SELECT RegisteredCourse FROM UserDemo)); ERROR 1242 (21000): Subquery returns more than 1 row
सही: एकल पंक्ति लौटाने वाली सबक्वेरी
mysql> SELECT RegisteredCourse FROM UserDemo WHERE UserId = 1;
+------------------+ | RegisteredCourse | +------------------+ | Java | +------------------+
BENCHMARK के साथ सही उपयोग
mysql> SELECT BENCHMARK(1000, (SELECT RegisteredCourse FROM UserDemo WHERE UserId = 1));
BENCHMARK() सिंटैक्स
BENCHMARK(count, expression)
count— अभिव्यक्ति को दोहराने की संख्या।expression— मूल्यांकन की जाने वाली स्केलर अभिव्यक्ति।- लौटाता है: हमेशा
0(समय मापने के लिए उपयोग किया जाता है)।
सर्वोत्तम अभ्यास
- सबक्वेरी में हमेशा
LIMIT 1या अद्वितीयWHEREशर्त उपयोग करें। BENCHMARKकेवल अभिव्यक्ति मूल्यांकन गति मापता है; I/O या लॉक नहीं।- प्रदर्शन परीक्षण के लिए,
BENCHMARKके बजायEXPLAIN ANALYZE(MySQL 8.0.18+) या प्रोफाइलिंग टूल्स पर विचार करें।