CREATE TABLE t1 (
id INT NOT NULL,
dt DATE,
PRIMARY KEY (id)
);
CREATE INDEX idx1 ON t1(dt);
SELECT *
FROM t1
WHERE TO_CHAR(dt, 'YYYY') = '2019'; -- Oracle、PostgreSQL
-- WHERE YEAR(dt) = '2019'; -- MySQL
-- WHERE datepart(yyyy, dt) = '2019'; -- SQL Server
CREATE TABLE t2 (
id INT NOT NULL,
i INT
dt DATE,
v VARCHAR(50),
PRIMARY KEY (id)
);
CREATE INDEX idx2 ON t2(i, dt);
SELECT *
FROM t2
WHERE i = 99
ORDER BY dt DESC
FETCH FIRST 5 ROW ONLY; -- Oracle、SQL Server、PostgreSQL
-- OFFSET 0 ROWS FETCH FIRST 5 ROW ONLY; -- SQL Server
-- LIMIT 5; -- MySQL
CREATE TABLE t3 (
id INT NOT NULL,
col1 INT,
col2 INT,
col3 VARCHAR(50),
PRIMARY KEY (id)
);
CREATE INDEX idx3 ON t3(col1, col2);
SELECT *
FROM t3
WHERE col1 = 99
AND col2 = 10;
SELECT *
FROM t3
WHERE col2 = 10;
CREATE TABLE t4 (
id INT NOT NULL,
col1 INT,
col2 VARCHAR(50),
PRIMARY KEY (id)
);
CREATE INDEX idx4 ON t4(col2);
SELECT *
FROM t4
WHERE col2 LIKE '%sql%';
CREATE TABLE t5 (
id INT NOT NULL,
col1 INT,
col2 INT,
col3 VARCHAR(50),
PRIMARY KEY (id)
);
CREATE INDEX idx5 ON t5(col1, col3);
SELECT col3, count(*)
FROM t5
WHERE col1 = 99
GROUP BY col3;
SELECT col3, count(*)
FROM t5
WHERE col1 = 99
AND col2 = 10
GROUP BY col3;
-- Oracle
EXPLAIN PLAN FOR
SELECT *
FROM t1
WHERE TO_CHAR(dt, 'YYYY') = '2019';
SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT |
--------------------------------------------------------------------------|
Plan hash value: 3617692013 |
|
--------------------------------------------------------------------------|
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time ||
--------------------------------------------------------------------------|
| 0 | SELECT STATEMENT | | 1 | 22 | 2 (0)| 00:00:01 ||
|* 1 | TABLE ACCESS FULL| T1 | 1 | 22 | 2 (0)| 00:00:01 ||
--------------------------------------------------------------------------|
|
Predicate Information (identified by operation id): |
--------------------------------------------------- |
|
1 - filter(TO_CHAR(INTERNAL_FUNCTION("DT"),'YYYY')='2019') |
|
Note |
----- |
- dynamic statistics used: dynamic sampling (level=2) |
-- MySQL
EXPLAIN SELECT *
FROM t1
WHERE YEAR(dt) = '2019';
id|select_type|table|partitions|type |possible_keys|key |key_len|ref|rows|filtered|Extra |
--|-----------|-----|----------|-----|-------------|----|-------|---|----|--------|------------------------|
1|SIMPLE |t1 | |index| |idx1|4 | | 1| 100|Using where; Using index|
-- SQL Server
SET STATISTICS PROFILE ON
SELECT *
FROM t1
WHERE datepart(yyyy, dt) = '2019';
Rows|Executes|StmtText |StmtId|NodeId|Parent|PhysicalOp|LogicalOp |Argument |DefinedValues |EstimateRows|EstimateIO |EstimateCPU |AvgRowSize|TotalSubtreeCost |OutputList |Warnings|Type |Parallel|EstimateExecutions|
----|--------|---------------------------------------------------------------------------------------------------------|------|------|------|----------|----------|----------------------------------------------------------------------------------------|----------------------------------------------|------------|---------------------|---------------------|----------|---------------------|----------------------------------------------|--------|--------|--------|------------------|
0| 1|SELECT * FROM t1 WHERE datepart(yyyy, dt) = '2019' | 1| 1| 0| | | | | 1| | | |0.0032830999698489904| | |SELECT | 0| |
0| 1| |--Index Scan(OBJECT:([hrdb].[dbo].[t1].[idx1]), WHERE:(datepart(year,[hrdb].[dbo].[t1].[dt])=(2019)))| 1| 2| 1|Index Scan|Index Scan|OBJECT:([hrdb].[dbo].[t1].[idx1]), WHERE:(datepart(year,[hrdb].[dbo].[t1].[dt])=(2019))|[hrdb].[dbo].[t1].[id], [hrdb].[dbo].[t1].[dt]| 1|0.0031250000465661287|1.5809999604243785E-4| 14|0.0032830999698489904|[hrdb].[dbo].[t1].[id], [hrdb].[dbo].[t1].[dt]| |PLAN_ROW| 0| 1|
-- PostgreSQL
EXPLAIN SELECT *
FROM t1
WHERE TO_CHAR(dt, 'YYYY') = '2019';
QUERY PLAN |
--------------------------------------------------------------------------------|
Seq Scan on t1 (cost=0.00..49.55 rows=11 width=8) |
Filter: (to_char((dt)::timestamp with time zone, 'YYYY'::text) = '2019'::text)|
SELECT *
FROM t
WHERE dt BETWEEN DATE '2019-01-01' AND DATE '2019-12-31';
CREATE INDEX idx3 ON t3(col2, col1);
SELECT *
FROM t4
WHERE col2 LIKE 'sql%';
-- PostgreSQL
CREATE INDEX idx4 ON t4(col2 varchar_pattern_ops);
原文作者:SQL编程思想;如有侵权,请联系管理员删除。