规范化字符串是否会增加SQLite中的SELECT性能?

时间:2013-06-17 12:12:49

标签: sql performance sqlite normalization

我刚刚阅读Coding Horror: Maybe Normalizing Isn't Normal,他们特别指出,由于许多INNER JOIN语句,规范化会降低SELECT查询的性能。

但是我有一个表,我打算将几个TEXT列放在不同的表中,这样我就可以比较整数索引而不是字符串,但现在我读了这篇文章,我不确定是否应该这样做。

例如,如果我们比较这个非规范化表:

CREATE TABLE addresses (country TEXT, city TEXT, address TEXT);
SELECT address FROM addresses WHERE Country=? AND City=?;

使用标准化形式:

CREATE TABLE countries (name TEXT UNIQUE);
CREATE TABLE cities (name TEXT UNIQUE);
CREATE TABLE addresses (country INT, city INT, address TEXT);
SELECT addresses.address FROM addresses INNER JOIN countries ON countries.ROWID=addresses.country INNER JOIN cities ON cities.ROWID==addresses.city WHERE countries.name=? AND cities.name=?;

第二种形式是否比SQLite的第一种形式更慢,更快或更快?

1 个答案:

答案 0 :(得分:2)

大多数人不知道规范化意味着什么。

如果您要求每个表中的每一行都有一个ID号,并且您使用这些ID号作为外键,则需要执行 lot 连接以获取有用信息。 (在这个意义上,身份证号码不是有用的信息。)

但规范化与识别依赖关系和预测新关系有关。规范化 与ID号无关。

在表格中,您用ID号替换了文字。那不是正常化;这只是用ID号替换文本。

在大多数情况下,文本的性能优于ID号和连接。我自己测试了这个,并在stackoverflow.com和dba.stackexchange.com上多次写了这篇文章。