标签: database-performance

SQLite:实际限制是什么?

在您将此问题标记为重复之前,请听我说!
我已经阅读过这里提出的关于如何提高性能的问题,例如,提一下提高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万行,将它们与另一个表连接起来,按照用户的要求对记录进行分组并返回结果.有什么输入是为这些结果优化数据库的最佳方法.

我不能缓存先前查询的结果,因为它在我的情况下没有意义.点击缓存的可能性相当低.

sqlite select database-performance

7
推荐指数
1
解决办法
8775
查看次数

没有索引!=?

考虑以下两个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?是什么导致=语句能够利用索引而不是!=

mysql sql performance database-performance

7
推荐指数
1
解决办法
147
查看次数

Google Cloud SQL:无法执行语句

我的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秒异常.当桌子变大时如何克服这个问题.

mysql database-performance google-cloud-sql

7
推荐指数
1
解决办法
724
查看次数

通过/ distinct查询firebird慢速顺序

我对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)

mysql sql performance firebird database-performance

7
推荐指数
1
解决办法
1168
查看次数

2dsphere vs 2d指数表现

我需要快速查询以查找某点的某个GPS半径内的所有文档.半径很小,精度不是那么关键,所以我不需要考虑球面几何形状.会有很多写作.使用2d索引而不是2dsphere,我会获得更好的性能吗?

gps mongodb database-performance

7
推荐指数
1
解决办法
3674
查看次数

使用Qt/MySQL批处理模式时的性能

我正在使用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)

mysql sql qt database-performance

7
推荐指数
1
解决办法
1748
查看次数

INSERT INTO在SQL Server 2012中随着时间的推移变得慢得多

我们有一个非常大的数据库WriteDB,存储原始交易数据,我们使用此表来快速写入.然后使用sql脚本我将数据导入WriteDBReadDB相对相同的表中,但扩展了一些额外的值+关系添加.导入脚本是这样的:

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

7
推荐指数
1
解决办法
768
查看次数

AWS Redshift列限制?

我一直在为一个新的应用程序做一些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)

我的三个问题是:

  1. 这是怎么回事?如果Redshift声称是一个专栏店,为什么会有这个限制?
  2. 有关解决此限制的任何建议吗?多个较小表的连接似乎最终接近单个表的性能.我还没有尝试过旋转数据.
  3. 有没有人建议快速,实时的性能,水平可扩展的列存储数据库没有上述限制?我们所做的只是对大约10M(行)×2500(列)数据进行限制的简单计数查询.

sql database-performance amazon-redshift

7
推荐指数
1
解决办法
4109
查看次数

选择前1*vs选择前1 1

我知道有很多这些问题,但我找不到与我的问题有关的问题.

看看这个问题,将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)

t-sql sql-server database-performance

7
推荐指数
2
解决办法
2万
查看次数

为什么我的实体框架查询单慢?

我有一个非常简单的查询非常慢.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

6
推荐指数
1
解决办法
798
查看次数