我们有如下表格
CREATE TABLE "ABC"(
"ID" NUMBER (18, 0) NOT NULL,
"ID2" VARCHAR2(15 char) NULL,
"VERSION" VARCHAR2(30 char) NULL,
"TIMESTAMP" DATE NULL,
CONSTRAINT "PK_ABC" PRIMARY KEY ("ID")
);
ALTER TABLE ABC ADD CONSTRAINT CK_ABC_ID2_VERSION UNIQUE(ID2, VERSION);
CREATE UNIQUE INDEX IDX1_ABC ON ABC
(
ID2,
VERSION
);
CREATE INDEX "IDX2_ABC" ON ABC
(
VERSION ASC,
ID2 ASC,
TIMESTAMP ASC
);
假设同一张表上有大量数据。您能否帮助得出下面哪个查询的性能更好的结论,以及为什么?
第一个查询:
SELECT ID, ID2, VERSION, TIMESTAMP
FROM ABC WHERE ID2=123
AND VERSION =54321
第二个查询:
SELECT ID, ID2, VERSION, TIMESTAMP
FROM ABC
WHERE ID2='123'
AND VERSION ='54321'
1)
如您所见,这很糟糕,因为您有数字文字,但列的类型是
varchar2
. 这些列被隐式转换为带有 的数字TO_NUMBER
。因此,无法使用索引,因为索引包含列ID2
andVERSION
,而不是TO_NUMBER(ID2)
andTO_NUMBER(VERSION)
。在这种情况下可以使用基于函数的索引,但这不是正确的解决方案。2)
使用适当的类型,一切正常,可以使用索引。
这不是单引号的问题,而是使用正确数据类型的问题,所以 2) 更好。
代码审查
ID2
并VERSION
定义为VARCHAR2
。NUMBER
SQL 1在右侧使用数据类型。正在发生隐式转换。依赖隐式转换的结果被认为是“不好的做法”。使用 SQL 2。
此外,只要您有匹配的行,SQL 1 就会失败
性能说明
就性能而言,我看不出计划应该有所不同的理由。任何实际的性能差异都是由于数据类型转换造成的,并且会以Jiffies进行衡量。