在您将此问题标记为重复之前,请听我说!
我已经阅读过这里提出的关于如何提高性能的问题,例如,提一下提高SQLite的每秒INSERT性能?和什么是源码的非常大的数据库文件的性能特点?
我正在努力使sqlite工作的数据库文件大小为5千兆字节.相反,那里有人,即使数据库大小高达160 GB,他们声称sqlite对他们来说"很棒".我自己没有尝试过,但是从提出的问题来看,我想所有的基准测试都可能只用数据库中的表来完成.
我使用的数据库
- 20页左右的表
-表中有一半以上的15列
-每个15或那么列的表都有6/7的外键列-其中的几个表已经长大在一个月内拥有2700万条记录
我使用的开发机器是3 GHz四核机器,有4 GB RAM,但只需要3分钟就可以查询这些大表中的row_count.
我找不到任何方法来水平划分数据.我拥有的最佳镜头是将数据分成多个数据库文件,每个表一个.但在这种情况下,据我所知,外键列约束不能使用,所以我将不得不创建一个自足表(没有任何外键).
所以我的问题是
a)我是否使用错误的数据库进行工作?
b)你觉得我哪里出错了?
c)我还没有在外键上添加索引,但如果只是行计数查询需要四分钟,外键索引如何帮助我?
编辑提供更多信息,即使没有人要求它:)我使用SQLite版本3.7.9与system.data.sqlite.dll版本1.0.77.0
EDIT2:我认为我与160位演员的不同之处在于他们可以选择单独的唱片或小范围的唱片.但是我必须在表中加载所有2700万行,将它们与另一个表连接起来,按照用户的要求对记录进行分组并返回结果.有什么输入是为这些结果优化数据库的最佳方法.
我不能缓存先前查询的结果,因为它在我的情况下没有意义.点击缓存的可能性相当低.
考虑以下两个EXPLAIN:
EXPLAIN SELECT * FROM sales WHERE title != 'The'
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE sales ALL title NULL NULL NULL 41707 Using where
Run Code Online (Sandbox Code Playgroud)
而且 -
EXPLAIN SELECT * FROM sales WHERE title = 'The'
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE sales ref title title 767 const 1 Using where
Run Code Online (Sandbox Code Playgroud)
为什么!=查询有NULL密钥?它为什么不用title?是什么导致=语句能够利用索引而不是!=?
我的Google云sql表目前有1126571行,每天最少添加3万行.执行查询时:
select count(distinct sno) as tot from visits
Run Code Online (Sandbox Code Playgroud)
sql提示它会生成以下错误:
Error 0: Unable to execute statement
Run Code Online (Sandbox Code Playgroud)
.Cloud SQL Query是否容易超过60秒异常.当桌子变大时如何克服这个问题.
我对Firebird中的查询速度有疑问.缓慢是在排序和清晰.
如果我在MySQL中尝试查询,那么他会快一秒.
Firebird - > 1,3s a 1,6s MySQL - > 0,3s a 0,4s
我们在Web服务器/网站上使用Firebird数据库,因此速度很重要.
规格: - Firebird 2.5.1或2.5.2(SuperClassic)64位 - 2,13 Ghz(2个处理器) - RAM 4,00 GB
我能做什么?
我有以下表格:
================================================== ==
CREATE TABLE ARTICLE3_1
(
IDARTICLE Integer NOT NULL,
ITEMSTATUS Integer,
ITEMENTRYDATE Integer,
ITEMFILTER Integer,
ARTIKELNUMMER Varchar(250),
ARTIKELNAAM1 Varchar(250),
ARTIKELNAAM2 Varchar(250),
OMSCHRIJVING_DETAIL Blob sub_type 1,
OMSCHRIJVING1 Varchar(250),
OMSCHRIJVING2 Varchar(250),
ARTIKELNR_LEVERANCIER Varchar(250),
MERK Varchar(250),
LEVERANCIER Varchar(250),
EAN Varchar(250),
LINKAANGROEP Varchar(250),
LINKAANAANBIEDINGGROEP Varchar(250),
LINKAANPOPULAIRGROEP Varchar(250),
LINKAANART Varchar(250),
ARTGRPNR Varchar(250),
SUBGROEP Varchar(250),
PRIJSPER Integer, …Run Code Online (Sandbox Code Playgroud) 我需要快速查询以查找某点的某个GPS半径内的所有文档.半径很小,精度不是那么关键,所以我不需要考虑球面几何形状.会有很多写作.使用2d索引而不是2dsphere,我会获得更好的性能吗?
我正在使用Qt 5.3.1(Win 7,VS2013)的SQL模块将数据插入到MySQL 5.6数据库中.在我注意到一些性能问题后,我执行了三个测试代码片段并测量了它们的运行时间,以便更好地理解SQL性能.结果令人困惑.
为了测试,我使用了一个"测试"表,其中包含VARCHAR列"test"和每行唯一递增的id.
第一个片段看起来基本上是这样的:
const QString uploadQueryString("INSERT INTO test (test) VALUES ('%1')");
for (int i=0; i<1000; i++)
{
QSqlQuery uploadQuery(uploadQueryString.arg("A: test text"), dataBase);
if (uploadQuery.lastError().isValid())
{
qDebug() << tr("Query execution failed (%1)").arg(uploadQuery.lastError().text());
}
}
Run Code Online (Sandbox Code Playgroud)
第二个是这样的:
const QString uploadQueryString("INSERT INTO test (test) VALUES %1");
QStringList values;
for (int j=0; j<1000; j++)
{
values.append("\"B: test text\"");
}
QString valuesString = "("+ContainerToString(values, "), (")+")";
QSqlQuery uploadQuery(uploadQueryString.arg(valuesString), dataBase);
if (uploadQuery.lastError().isValid())
{
qDebug() << tr("Query execution failed (%1)").arg(uploadQuery.lastError().text());
}
Run Code Online (Sandbox Code Playgroud)
第三个是这样的:
const QString uploadQueryString("INSERT …Run Code Online (Sandbox Code Playgroud) 我们有一个非常大的数据库WriteDB,存储原始交易数据,我们使用此表来快速写入.然后使用sql脚本我将数据导入WriteDB到ReadDB相对相同的表中,但扩展了一些额外的值+关系添加.导入脚本是这样的:
TRUNCATE TABLE [ReadDB].[dbo].[Price]
GO
INSERT INTO [ReadDB].[dbo].[Price]
SELECT a.*, 0 as ValueUSD, 0 as ValueEUR
from [WriteDB].[dbo].[Price] a
JOIN [ReadDB].[dbo].[Companies] b ON a.QuoteId = b.QuoteID
Run Code Online (Sandbox Code Playgroud)
所以最初有大约130万.此表中的行(~50GB).每天他们中的一些人都会添加,其中一些会发生变化,所以现在我们决定不会复杂化逻辑并重新导入所有数据.出于某种原因,由于某种原因,这个脚本的工作时间越来越长,几乎相同数量的数据.首先运行需要~1h,现在已经花了3h
另外SQL Server导入后工作也不顺利.导入(或在其中)如果我尝试运行不同的查询,即使是最简单的,它们通常也会因超时错误而失败.
这种不良行为的原因是什么以及如何解决这个问题?
sql database sql-server sql-server-2008 database-performance
我一直在为一个新的应用程序做一些AWS Redshift的负载测试,我注意到它的每个表的列限制为1600.更糟糕的是,随着表中列数的增加,查询速度会变慢.
这里没有任何意义的是Redshift应该是一个列存储数据库,理论上不应该是在特定where子句中未选择的列的I/O命中.
更具体地说,当TableName是1600列时,我发现下面的查询比TableName例如1000列和相同行数要慢得多.随着列数的减少,性能提高.
SELECT COUNT(1) FROM TableName
WHERE ColumnName LIKE '%foo%'
Run Code Online (Sandbox Code Playgroud)
我的三个问题是:
我知道有很多这些问题,但我找不到与我的问题有关的问题.
看看这个问题,将IF EXIST(SELECT 1 FROM)更改为IF EXIST(SELECT TOP 1 FROM)是否有任何副作用?
在答案中特别提到这一节:
select * from sys.objects
select top 1 * from sys.objects
select 1 where exists(select * from sys.objects)
select 1 where exists(select top 1 * from sys.objects)
Run Code Online (Sandbox Code Playgroud)
我正在运行一些自己的测试来正确理解它.如答案所示:
select 1 where exists(select top 1 * from sys.objects)
select 1 where exists(select top 1 1 from sys.objects)
Run Code Online (Sandbox Code Playgroud)
两者都导致相同的执行计划,并导致相同的计划
select 1 where exists(select * from sys.objects)
select 1 where exists(select 1 from sys.objects)
Run Code Online (Sandbox Code Playgroud)
从我对这个问题的研究,"SELECT TOP 1 1"VS"IF EXISTS(SELECT 1".我推断这是商定的最佳实践:
select …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的查询非常慢.Entity Framework Profiler表示大约需要100毫秒.
dbContext.Users.Single(u => u.Id == userId);
Run Code Online (Sandbox Code Playgroud)
尝试了一下后,我发现了一个非常相似但速度更快的查询(大约3毫秒).
dbContext.Users.Where(u => u.Id == userId).ToList().Single();
Run Code Online (Sandbox Code Playgroud)
当我比较两个查询的sql时,第二个查询不使用嵌套的SELECT而不使用TOP操作.但是我不希望它因为这两件事而快30倍.此外,使用SQL Server Management Studio执行查询时,没有可测量的差异.
当我查看执行计划时,他们都会创建一个具有100%查询成本的聚簇索引查找.而附加select和Top操作的查询成本为0%.来自EFProfiler的查询计划表明它不应该有任何区别.
在这种情况下,我该怎么做才能更好地理解查询性能?
下面是第一个查询的结果SQL.
SELECT [Limit1].[Id] AS [Id],
[Limit1].[EmailAddress] AS [EmailAddress],
[Limit1].[FirstName] AS [FirstName],
[Limit1].[LastName] AS [LastName]
FROM (SELECT TOP (2) [Extent1].[Id] AS [Id],
[Extent1].[EmailAddress] AS [EmailAddress],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[LastName] AS [LastName]
FROM [dbo].[Users] AS [Extent1]
WHERE ([Extent1].[Id] = 'b5604f88-3e18-42a5-a45e-c66cc2a632d3' /* @p__linq__0 */)
AND ('b5604f88-3e18-42a5-a45e-c66cc2a632d3' /* @p__linq__0 */ IS NOT NULL)) AS [Limit1]
Run Code Online (Sandbox Code Playgroud)
这里是第二个(更快)查询的sql.
SELECT [Extent1].[Id] AS [Id],
[Extent1].[EmailAddress] AS [EmailAddress],
[Extent1].[FirstName] …Run Code Online (Sandbox Code Playgroud) sql sql-server performance entity-framework database-performance