Hi! Could we please enable some services and cookies to improve your experience and our website?

SQLize | PHPize | SQLtest

Online Sandbox for SQL and PHP: Write, Run, Test, and Share SQL Queries and PHP Code

A A A
Login    Share code      Blog   FAQ
Copy Format Clear
-- 1. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ с ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ индСксами ΠΈ ограничСниями DROP TABLE IF EXISTS order_items CASCADE; DROP TABLE IF EXISTS orders CASCADE; DROP TABLE IF EXISTS customers CASCADE; -- Π’Π°Π±Π»ΠΈΡ†Π° customers с ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ индСксами CREATE TABLE customers ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, -- ЗамСняСм Π΄Π²Π° индСкса Π½Π° UNIQUE CONSTRAINT created_at TIMESTAMP DEFAULT now() NOT NULL ); -- Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ индСкс для email CREATE INDEX idx_customers_email ON customers(email); -- Π’Π°Π±Π»ΠΈΡ†Π° orders с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ индСксами ΠΈ внСшними ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ CREATE TABLE orders ( id SERIAL PRIMARY KEY, customer_id INT NOT NULL REFERENCES customers(id), amount DECIMAL(10,2) CHECK (amount >= 0), order_date DATE NOT NULL, status VARCHAR(20) NOT NULL, notes TEXT, CONSTRAINT valid_status CHECK (status IN ('pending', 'completed', 'canceled')) ); -- Π˜Π½Π΄Π΅ΠΊΡΡ‹ для частых запросов CREATE INDEX idx_orders_customer_id ON orders(customer_id); CREATE INDEX idx_orders_order_date ON orders(order_date); CREATE INDEX idx_orders_status ON orders(status); -- Π’Π°Π±Π»ΠΈΡ†Π° order_items с ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ индСксами CREATE TABLE order_items ( id SERIAL PRIMARY KEY, order_id INT NOT NULL REFERENCES orders(id) ON DELETE CASCADE, product_id INT NOT NULL, quantity INT NOT NULL CHECK (quantity > 0), price DECIMAL(10,2) NOT NULL CHECK (price >= 0) ); -- Π˜Π½Π΄Π΅ΠΊΡΡ‹ для соСдинСний ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ CREATE INDEX idx_order_items_order_id ON order_items(order_id); CREATE INDEX idx_order_items_product_id ON order_items(product_id); CREATE INDEX idx_order_items_quantity ON order_items(quantity); -- 2. ЗаполняСм Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ тСстовыми Π΄Π°Π½Π½Ρ‹ΠΌΠΈ INSERT INTO customers (name, email) SELECT 'Customer ' || i, 'customer' || i || CASE WHEN i%2=0 THEN '@gmail.com' ELSE '@example.com' END FROM generate_series(1, 10000) AS i; -- 100,000 Π·Π°ΠΊΠ°Π·ΠΎΠ² (ΠΏΠΎ 10 Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°) INSERT INTO orders (customer_id, amount, order_date, status) SELECT (random() * 9999)::int + 1, (random() * 1000)::numeric(10,2), (now() - (random() * 365)::int * '1 day'::interval)::date, CASE WHEN random() > 0.5 THEN 'completed' ELSE 'pending' END FROM generate_series(1, 100000); -- 300,000 ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ Π·Π°ΠΊΠ°Π·ΠΎΠ² (ΠΏΠΎ 3 Π½Π° Π·Π°ΠΊΠ°Π·) INSERT INTO order_items (order_id, product_id, quantity, price) SELECT (random() * 99999)::int + 1, (random() * 100)::int + 1, (random() * 10)::int + 1, (random() * 500)::numeric(10,2) FROM generate_series(1, 300000); -- 3. АнализируСм статистику Ρ‚Π°Π±Π»ΠΈΡ† ANALYZE customers; ANALYZE orders; ANALYZE order_items; -- 4. ЗапускаСм ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹Π΅ запросы с EXPLAIN ANALYZE -- Запрос 1: Π―Π²Π½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€ ΠΏΠΎΠ»Π΅ΠΉ + ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ JOIN EXPLAIN ANALYZE SELECT o.id AS order_id, o.order_date, c.name AS customer_name, c.email, oi.product_id, oi.quantity FROM orders o JOIN customers c ON o.customer_id = c.id JOIN order_items oi ON o.id = oi.order_id WHERE c.email LIKE '%@gmail.com' AND o.order_date BETWEEN '2023-01-01' AND CURRENT_DATE ORDER BY o.order_date DESC; -- Запрос 2: Π—Π°ΠΌΠ΅Π½Π° подзапроса Π½Π° JOIN EXPLAIN ANALYZE SELECT c.name, COUNT(o.id) AS order_count FROM customers c LEFT JOIN orders o ON c.id = o.customer_id WHERE c.created_at > '2023-01-01' GROUP BY c.id; -- Запрос 3: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ индСкс EXPLAIN ANALYZE SELECT id, name, email FROM customers WHERE LOWER(name) = 'customer 5000'; -- Запрос 4: ΠŸΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΡ ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎ прСфиксу EXPLAIN ANALYZE SELECT c.id AS customer_id, c.name, o.id AS order_id, oi.product_id FROM customers c LEFT JOIN orders o ON c.id = o.customer_id LEFT JOIN order_items oi ON o.id = oi.order_id WHERE c.name LIKE 'Customer 1%' LIMIT 100; -- Запрос 5: ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ условия Π΄Π°Ρ‚Ρ‹ EXPLAIN ANALYZE UPDATE orders SET notes = 'processed' WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'; -- Запрос 6: ИспользованиС индСкса для Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° EXPLAIN ANALYZE DELETE FROM order_items WHERE quantity < 2;

Stuck with a problem? Got Error? Ask AI support!

Copy Clear