在探索 InnoDB 的聚集 B 树索引系统时,我认为许多 NULL(或小)列的存在对 InnoDB 性能没有显着影响。
多余列的存在是否会降低 mysql 的性能?
PS我尝试了实际测试,但没有显着效果。不过我觉得应该是在重载的情况下比较的。这就是我很想了解关于这件事的技术推理的原因。
我有一个包含 NULL 值的表,但问题是某些值实际上是字符串“NULL”而不是实际的 NULLS,因此当您尝试类似
where date is null
Run Code Online (Sandbox Code Playgroud)
它不会返回具有“NULL”字符串的字段。
我需要做的是运行整个表的更新,将所有字符串“NULLS”转换为实际的 NULL 值。“NULL”字符串出现在表的所有列中,因此需要更新的不仅仅是 1 列。我不确定如何处理这种情况。我想我可能需要使用循环,因为我有很多列,但同样可能有一个简单的解决方案而不必使用循环。解决此问题的最佳方法是什么?
这个问题遵循我的另一个问题的答案: 插入与子查询表相关的输出
Person.LastName 列有一个 NOT NULL 约束。当我执行此代码时:
CREATE TABLE tempIDs
( PersonId INT,
FinancialInstitutionId INT
);
MERGE INTO Person
USING FinancialInstitution AS fi
ON 1 = 0
WHEN NOT MATCHED THEN
INSERT (CreationDate, AdministrativeStatus, LastName, Street1, Number1, City1, State1, PostCode1, CountryId1, WorkDirectPhone1, Fax1, Email1)
VALUES (GetDate(), 'Legal', fi.Name, fi.Street, fi.Number, fi.City, fi.[State], fi.PostCode, fi.CountryId, fi.PhoneNumber, fi.Fax, fi.Email)
OUTPUT inserted.Id, fi.Id INTO tempIDs;
UPDATE fi
SET fi.PersonId = t.PersonId
FROM FinancialInstitution AS fi
JOIN tempIDs AS t
ON fi.Id = t.FinancialInstitutionId …Run Code Online (Sandbox Code Playgroud) 我刚刚经历了一些旧的存储过程,做了一些优化,偶然发现了这个奇怪的地方:
SELECT ISNULL(bt.BusinessTypeID, 0) AS BusinessTypeID
FROM BusinessType bt
LEFT JOIN Business b
ON b.BusinessTypeID = ISNULL(bt.BusinessTypeID, NULL)
Run Code Online (Sandbox Code Playgroud)
这是一个稍微简化的版本,但第 4 行是有问题的行。我无法想象这有什么作用?我已经检查了带有和不带有此 NULL 检查的 exec 计划和结果,一切似乎都一样。
这只是完全的疯狂还是有一些模糊的原因为什么离开它可能是有益的?
更新:
为了回应评论,在下面添加了完整的查询(匿名),在这个完整版本中,这ON Object4.Column9 = Function4(Object1.Column4, ?)对应于这个ON b.BusinessTypeID = ISNULL(bt.BusinessTypeID, NULL)。另外 Object4.Column9 是一个可以为空的外键 & Object1.Column4 是一个不可为空的主键
SELECT Function1() AS Column1,
Function2(Function3(Function2((
SELECT Column2 AS Column3
FROM
(
SELECT ? AS Column4,
? AS Column2
WHERE (Variable1 IS NULL OR ? = Variable1)
UNION ALL
SELECT Function4(Object1.Column4, ?) AS Column4,
Function4(Object1.Column5,?) + …Run Code Online (Sandbox Code Playgroud) 我有下表(在 SQL Fiddle 上查看)(我创建是为了解决我的问题):
| ID | word |
----------------
| 5 | "Hello" |
| 6 | NULL |
| 7 | "World" |
| 8 | "World" |
Run Code Online (Sandbox Code Playgroud)
现在我想使用GROUP BY word WITH ROLLUP. ROLLUP 生成的行的列 word 中的 NULL 应替换为“total”:
SELECT
ID,
ifnull(word, "total") as word,
count(*) as occurrences
FROM test
GROUP BY word WITH ROLLUP;
Run Code Online (Sandbox Code Playgroud)
问题是它还会用NULL单词为 NULL 的行数替换记录中的 :
| ID | word | occurrences |
|----|-------|-------------|
| 6 | total | …Run Code Online (Sandbox Code Playgroud) 我是 PostgreSQL 的新手,这就是我问这个问题的原因。我有一个表app_client_users和一个名为client_id. 最初我将其设置为NOT NULL,现在我想将其更改为允许 NULL。我试过了
alter table app_client_users alter column client_id int NULL ;
Run Code Online (Sandbox Code Playgroud)
和
alter table app_client_users alter column client_id NULL ;
Run Code Online (Sandbox Code Playgroud)
这是行不通的。我该如何解决?
我正在使用 postgres 表验证规则并尝试CHECK为数组列设置约束。一个想法是只允许长度 > 0 的数组。
这是我想要实现它的方式:
create table words_table (
id serial primary key,
words varchar(20)[] CHECK (array_length(words, 1) > 0)
);
Run Code Online (Sandbox Code Playgroud)
但看起来它不起作用。o_o
insert into words_table (words) values ('{}');
//INSERT 0 1
Run Code Online (Sandbox Code Playgroud)
如何实现这样的约束?
我有一个关于这个查询计划的问题。
我们在测试环境中有一个表 Order_Details_Taxes,它有 11,225,799 行。该表有一个列 OrdTax_PLTax_LoadDtl_Key,它在每一行上都是 NULL。此测试环境的配置方式使此列始终为 NULL。此列上有一个索引。
我使用列的 NULL 值对该表运行了一些查询。NULL INNER JOIN 永远不会产生任何结果。
declare @Keys table (KeyValue decimal(15,0))
insert into @Keys (KeyValue) values (null)
select OrdTax_PLTax_LoadDtl_Key
from @Keys
inner join Order_Details_Taxes
on OrdTax_PLTax_LoadDtl_Key = KeyValue
select *
from @Keys
inner join Order_Details_Taxes
on OrdTax_PLTax_LoadDtl_Key = KeyValue
Run Code Online (Sandbox Code Playgroud)
这些是查询计划中的第一个查询。第一个select从亿行表开始并连接到@Keys。第二个select从@Keys 开始,但它对这个表进行聚集索引扫描。
我知道在大多数情况下临时@Tables 是有问题的,所以我将查询更改为使用临时 #Table:
if object_id ('tempdb..#Keys') is not null
drop table #Keys
create table #Keys (KeyValue decimal(15,0))
insert into #Keys (KeyValue) values (null)
select OrdTax_PLTax_LoadDtl_Key …Run Code Online (Sandbox Code Playgroud) 我有一个查询,用于生成一些文本以创建一些 VALUES 文本以放入 .sql 文件以插入一些行。我在结果中得到一个空行:
postgres=# SELECT ' (' || obj_id || ', ''' || obj_type || '''),' FROM il2.objects WHERE obj_id < 11 ORDER BY obj_id;
?column?
-------------------------
(1, 'ScienceDomain'),
(3, 'PIs'),
(10, 'Instrument'),
(4 rows)
Run Code Online (Sandbox Code Playgroud)
执行 a select *,很明显它是由obj_typeNULL 为obj_id2引起的:
postgres=# SELECT * FROM il2.objects WHERE obj_id < 11;
obj_id | obj_type
--------+---------------
10 | Instrument
1 | ScienceDomain
2 |
3 | PIs
(4 rows)
Run Code Online (Sandbox Code Playgroud)
(确认它是NULL):
postgres=# SELECT * FROM il2.objects WHERE …Run Code Online (Sandbox Code Playgroud) 使用 PostgreSQL 11,我有下表,大约有 4.5 亿行:
postgres=> \d+ sales
Table "public.sales"
Column | Type | Modifiers | Storage | Stats target | Description
-----------------------------------+-----------------------------+------------------------------------+----------+--------------+-------------
created_terminal_id | integer | not null | plain | |
company_id | integer | not null | plain | |
customer_id | integer | | plain | |
sale_no | character varying(20) | not null | extended | |
sale_type | smallint | not null | plain | |
source_type | smallint | not null | plain …Run Code Online (Sandbox Code Playgroud) null ×10
postgresql ×4
sql-server ×4
mysql ×2
alter-table ×1
concat ×1
constraint ×1
group-by ×1
index ×1
innodb ×1
join ×1
mysql-5 ×1
order-by ×1
performance ×1
select ×1