从没有存储varchar或其他可变长度数据的表中读取通常会更快吗?在MySQL中,这更快,因为它可以准确计算磁盘上存储行的位置.
我正在使用外部存储器在等待发送到服务器时将事件存储在数据库中.
我在插入记录时看到了非常糟糕的表现.我知道外部存储器可能很慢,但我想看到一些数字,所以我写了一个测试它的小应用程序.
这是代码:
public static final int INSERTS = 100;
File dbFile = new File(Environment.getExternalStorageDirectory(), "test.sqlite3");
// File dbFile = new File(getFilesDir(), "test.sqlite3");
dbFile.delete();
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
db.execSQL("CREATE TABLE events (_id integer primary key autoincrement, event_type TEXT NOT NULL, timestamp BIGINT, data TEXT);");
db.execSQL("CREATE INDEX mainIndex ON events (event_type, timestamp ASC);");
InsertHelper helper = new InsertHelper(db, "events");
final int eventTypeCol = helper.getColumnIndex("event_type");
final int timestampCol = helper.getColumnIndex("timestamp");
final int dataCol = helper.getColumnIndex("data");
long start = System.currentTimeMillis();
String eventType …Run Code Online (Sandbox Code Playgroud) 在您将此问题标记为重复之前,请听我说!
我已经阅读过这里提出的关于如何提高性能的问题,例如,提一下提高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万行,将它们与另一个表连接起来,按照用户的要求对记录进行分组并返回结果.有什么输入是为这些结果优化数据库的最佳方法.
我不能缓存先前查询的结果,因为它在我的情况下没有意义.点击缓存的可能性相当低.
我似乎无法弄清楚为什么在将我的代码包装在ITVF中时,SQL Server采用完全不同的执行计划.在ITVF内部运行代码时,查询将在5秒内运行.如果我将其保存为ITVF,它将运行20分钟而不会产生结果.我更喜欢在ITVF中使用它来进行代码重用.将代码保存为ITVF的任何想法都会导致严重的性能问题?
CREATE FUNCTION myfunction
(
@start_date date,
@stop_date date
)
RETURNS TABLE
AS
RETURN
(
with
ad as (
select [START_DATE]
,[STOP_DATE]
,ID
,NAME
,'domain1\' + lower(DOMAIN1_NAME)
collate database_default as ad_name
from EMP_INFO
where DOMAIN1_NAME != ''
union
select [START_DATE]
,[STOP_DATE]
,ID
,NAME
,'domain2\' + lower(DOMAIN2_NAME)
collate database_default as ad_name
from EMP_INFO
where DOMAIN2_NAME != ''
)
select ad.ID
,ad.NAME
,COUNT(*) as MONITORS
from scores
join users
on (scores.evaluator_id = users.[user_id])
join ad
on (lower(users.auth_login) = ad.ad_name and
scores.[start_date] …Run Code Online (Sandbox Code Playgroud) t-sql sql-server user-defined-functions database-performance
我在postgresql中有一个表,其中包含一个不断更新的数组.
在我的应用程序中,我需要获取该数组列中不存在特定参数的行数.我的查询如下所示:
select count(id)
from table
where not (ARRAY['parameter value'] <@ table.array_column)
Run Code Online (Sandbox Code Playgroud)
但是当增加行的数量和该查询的执行量(每秒几次,可能是数百或数千)时,性能会下降很多,在我看来,postgresql中的计数可能具有线性执行顺序(I我不完全确定这一点.
基本上我的问题是:
是否有一种我不知道的现有模式适用于这种情况?什么是最好的方法呢?
你能给我的任何建议都会非常感激.
postgresql count database-performance postgresql-performance
列长度的倍增因子是否会以某种方式影响数据库性能?
换句话说,以下两个表的性能有什么区别:
TBL1:
- CLMN1 VARCHAR2(63)
- CLMN2 VARCHAR2(129)
- CLMN3 VARCHAR2(250)
Run Code Online (Sandbox Code Playgroud)
和
TBL2:
- CLMN1 VARCHAR2(64)
- CLMN2 VARCHAR2(128)
- CLMN3 VARCHAR2(256)
Run Code Online (Sandbox Code Playgroud)
我们是否应该总是尝试将列的长度设置为某个功率,2或者只考虑最大值?
一些开发人员声称数据库中列长度的倍增因子之间存在某种联系,因为它影响Oracle如何分配和保存磁盘上的数据并在内存中共享其缓存.有人可以证明或反驳这一点吗?
有没有人知道Hive中左连接与内连接的性能是否有差异,通过hive.auto.convert.join = True启用Map Join?
外连接提供了更多挑战.由于map-join运算符只能流式传输一个表,因此流表必须是所有行都需要的表.对于左外连接,这是连接左侧的表; 对于右外连接,右侧的表等.这意味着即使内连接可以转换为地图连接,也无法转换外连接.如果除了需要流式传输的表之外的表可以适合大小配置,则只能转换外部联接.
似乎这是说(a)外连接根本无法转换为内连接,(b)只有在不需要流式传输的表是"左连接"表时才能转换它(S).有谁知道它是哪一个?
另外,在Hive中INNER JOIN和LEFT JOIN的性能是否存在差异,就像在SQL中一样?当涉及多个左连接时,这种差异是否会变得更加放大(或者,或者,首先开始存在)?我问的原因是我正在考虑在一些左连接查找表中添加几个虚拟条目以将我的连接转换为内部...直观地看起来它可能会有所不同,性能明智,但我找不到任何文档或讨论无论如何.好奇,如果有人有这方面的经验.
我希望创建非规范化的数据访问,主要用于报告目的(从而避免连接和获得性能).我有两个解决方案,但我正在寻找(a)其他可能的解决方案,以及(b)我应该考虑的权衡.我正在使用SQL Server 2008 R2.
在一个解决方案中,我可以在查询上创建索引视图,该视图执行我关心的连接.我的理解是,这确实在幕后实现,但是很棘手,可能无法保证良好的性能(并且对于视图的性能存在激烈的争论).
在另一个解决方案中,我可以构建机器来创建一个表,用我关心的数据填充它,并在事务中将它交换为现有表.
前者对我来说似乎有风险/神奇; 后者看起来很笨拙,容易出错,并可能影响查询计划之类的事情.有人可以帮忙解释一下吗?
我的网站有很大的读取流量.比写入流量重很多.
为了提高我的网站的性能,我想到了主/从数据库配置.
在octupus gem似乎提供我想要的,但因为我的应用是巨大的,我不能去虽然数百万行源代码的更改查询分发(发送读取查询从服务器和写入查询主服务器).
MySQL Proxy 似乎是解决此问题的好方法,但由于它是alpha版本,我不想使用它.
所以我的问题是什么是跨主/从服务器分割读/写查询的最佳方法?
是否可以在不使用rails中的任何gems的情况下拆分读/写查询?
mysql ruby-on-rails master-slave database-performance octopus
我们有一个非常大的数据库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
sql-server ×3
sqlite ×3
database ×2
android ×1
count ×1
hadoop ×1
hive ×1
left-join ×1
master-slave ×1
mysql ×1
octopus ×1
oracle ×1
performance ×1
postgresql ×1
select ×1
sql ×1
t-sql ×1