询问:
Select *
from `t_event`
where `create_user_id`=7
and (`event_create_date`)=('2012-12-18 00:00:00')
and `event_type_cd`=11
and `domain_id` =602
and `job_id` =1
limit 1
Run Code Online (Sandbox Code Playgroud)
表结构:
mysql> show create table t_event\G
*************************** 1. row ***************************
Table: t_event
Create Table: CREATE TABLE `t_event` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`create_user_id` int(11) DEFAULT NULL,
`event_create_date` date DEFAULT NULL,
`event_type_cd` int(11) NOT NULL,
`event_desc` varchar(512) NOT NULL,
`IsGlobalEvent` int(2) DEFAULT NULL,
`event_start_date` datetime NOT NULL,
`event_end_date` datetime NOT NULL,
`job_id` int(11) DEFAULT NULL,
`domain_id` int(11) NOT NULL,
PRIMARY …Run Code Online (Sandbox Code Playgroud) 我有下表交易。该表如下所示:
CREATE TABLE [dbo].[Transactions](
[TransactionID] [bigint] IDENTITY(1,10) NOT NULL,
[PlayerID] [bigint] NOT NULL,
[BalanceTransactionTypeID] [int] NOT NULL,
[BalanceTransactionSubTypeID] [int] NULL,
[PointDelta] [money] NULL,
[TransactionDate] [datetime] NOT NULL,
Run Code Online (Sandbox Code Playgroud)
该表包含以下约束和索引。
CONSTRAINT [PK_Transactions] PRIMARY KEY CLUSTERED
(
[TransactionID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_Transactions_PlayerID] ON [dbo].
[Transactions]
(
[PlayerID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,
DROP_EXISTING = OFF, …Run Code Online (Sandbox Code Playgroud) 我即将开始从事电话词典类项目。它确认字典表中将有数十亿条记录,并且该字典表中的每个条目可能有参考字典表的进一步库存表。我之前没有使用过如此庞大的数据库。
InnoDB 有利于维护关系数据库。有类别和子类别引用,所以我将使用 InnoDB。会出现一种情况,我需要根据类别或子类别,甚至根据州和城市来显示总数。等等……它可以是任意组合。
我熟悉在大多数搜索列上创建索引。我听说过表分区也有助于加快查询速度。
我的问题是在创建此类将有数十亿行的数据库表时,在早期阶段我应该考虑哪些要点,以便以后当表变大时,我可以通过选择查询和 DML 查询将表性能保持在高水平(插入,更新)。
指导会给我很大帮助。
mysql performance database-design database-recommendation query-performance
我有一个奇怪的问题,我真的不明白。简单地说,我有一个包含 4 个表连接的连接,我相信它们都有适当的索引,但是查询需要大量的时间,除非我删除它的一部分。
更大的图片是,有 3 种类型的对象 A、B 和 C,每个对象都有自己的表,并且相关联,A 是孩子,B 是父母,C 是祖父母。除此之外,还有一个关系表 R,允许多个 B 与多个 C 相关,并且由于关系 R 属于特定类型,因此还有一个附加表 T。
现在在有问题的查询中,我试图获取类型 A 的记录列表,谁的父母与祖父母有特定类型的关系,祖父母的名字 ILIKE 另一个字符串。
表A有~700k条记录,表B有~60k条记录,表C有~8k条记录,表R有~90k条记录,表T有~100条记录。
由于 A 包含链接到字段 B.id 的字段 parent_id,因此 B 不需要直接包含在查询中。
所以查询是这样的:
SELECT DISTINCT A.id, A.name
FROM A
JOIN R ON A.parent_id=R.lhs
JOIN T ON R.type=T.id AND T.alias='type-name'
JOIN C ON R.rhs=C.id
WHERE A.flag=1 AND A.strvalue='value' AND C.name ILIKE '%substr%'
ORDER BY A.name ASC
LIMIT 25;
Run Code Online (Sandbox Code Playgroud)
像这样运行查询需要超过 10 秒(我从来没有让它运行完成,因为它需要太长时间)。
在我的实际设置中,我在关键 ID 字段中有类型,所以查询实际上挂在类型中的一个字段上,但索引也会这样做。
奇怪的是我已经尝试从查询中取出位,因此尝试确定花费太长时间的位,并删除 T 部分或 ILIKE 部分似乎使其在正常时间范围内执行。 …
已经有一个问题“如何使用 psql 为 SQL 查询计时? ”但我缺少如何从命令行执行此操作的答案。如何从命令行运行带有(可选)计时\timing [on|off]的脚本- 请不要在脚本中运行?
这是我的完整表格:
CREATE TABLE [dbo].[tblCrawlUrls](
[cl_IdUrl] [int] IDENTITY(1,1) NOT NULL,
[cl_CrawlNormalizedUrl] [nvarchar](200) NOT NULL,
[cl_RooSiteId] [smallint] NOT NULL,
[cl_ExploreDate] [datetime] NOT NULL CONSTRAINT [DF_tblCrawlUrls_cl_ExploreDate] DEFAULT (sysutcdatetime()),
[cl_LastCrawlDate] [datetime] NOT NULL CONSTRAINT [DF_tblCrawlUrls_cl_LastCrawlDate] DEFAULT ('2000-08-11 15:18:47.407'),
[cl_CrawlSource] [nvarchar](max) NOT NULL CONSTRAINT [DF_tblCrawlUrls_cl_CrawlSource] DEFAULT ('null'),
[cl_CrawlOrgUrl] [nvarchar](200) NOT NULL CONSTRAINT [DF_tblCrawlUrls_cl_CrawlOrgUrl] DEFAULT ('null'),
[cl_ExploredURL] [nvarchar](200) NOT NULL CONSTRAINT [DF_tblCrawlUrls_cl_ExploredURL] DEFAULT ('null'),
[cl_Ignored_By_Containing_Word] [bit] NOT NULL CONSTRAINT [DF_tblCrawlUrls_cl_Ignored_By_Containing_Word] DEFAULT ((0)),
[cl_CrawlFailedTimes] [int] NOT NULL CONSTRAINT [DF_tblCrawlUrls_cl_CrawlFailedTimes] DEFAULT ((0)),
[cl_TotalCrawlTimes] [int] NOT NULL CONSTRAINT [DF_tblCrawlUrls_cl_TotalCrawlTimes] …Run Code Online (Sandbox Code Playgroud) 编辑:
我知道这个问题已经结束,但我希望它会对某人有所帮助。
问题出在我们的磁盘( cluster )上。
使用 PerfMon,我可以创建一些计数器(磁盘读取和写入)并且读取计数器固定为 100%。
我看到以下等待sp_WhoIsActive:
PAGEIOLATCH_SH:Database_Name:1(*)
Run Code Online (Sandbox Code Playgroud)
我在这里看到一些帖子,说这个警告是因为高 I/O。SQL Server 联机丛书将 SQL 等待类型 PAGEIOLATCH_SH 定义为:
当任务正在等待 I/O 请求中的缓冲区的闩锁时发生。锁存请求处于共享模式。
和这个:
用户进程将请求一些当前不在缓冲区缓存中的数据。此时——SQL Server 将尝试分配一个缓冲区页——当数据从磁盘移动到缓冲区缓存时,在缓冲区上创建了一个独占的 PAGEIOLATCH_EX。同时从用户进程的角度在缓冲区上创建一个 PAGEIOLATCH_SH。
我创建了索引和统计信息,还使用了 SQL Server Profiler 来帮助我。
有什么办法可以改进查询吗?我怎样才能改进大量的处理ANDs?
我们已经遇到这个问题大约一个星期了,我不知道该怎么办。
SELECT TOP 30 codCliente
FROM (
SELECT t1.CodCliente
, codcampo
, valor
, t1.chavealeat
FROM tblCliente AS t1 WITH(NOLOCK)
INNER JOIN tblClienteDetalhe AS t2 WITH (NOLOCK)
ON t1.codcliente = t2.codcliente
AND CodCampo IN (-1, 4)
WHERE codStatus IN(0)
AND t1.ChavePeriodo < getdate() …Run Code Online (Sandbox Code Playgroud) 我有以下查询。有没有一种方法可以将其放入一个查询中?如果没有,我可以进一步缩小它吗?请指教。
DECLARE @highRegion TABLE(regionId INT, countR INT)
DECLARE @lowRegion TABLE(regionId INT, countR INT)
DECLARE @midRegion TABLE(regionId INT, countR INT)
INSERT INTO @highRegion
SELECT c.fRegionID,
COUNT(1) AS VALUE
FROM census.Country c
INNER JOIN census.IncomeGroup ig
ON c.fIncomeGroupID = ig.IncomeGroupID
WHERE ig.Name IN ('High income: nonOECD', 'High income: OECD')
GROUP BY
c.fRegionID
INSERT INTO @lowRegion
SELECT c.fRegionID AS VALUE,
COUNT(1)
FROM census.Country c
INNER JOIN census.IncomeGroup ig
ON c.fIncomeGroupID = ig.IncomeGroupID
WHERE ig.Name = 'Upper middle income'
GROUP BY
c.fRegionID
INSERT INTO …Run Code Online (Sandbox Code Playgroud) performance sql-server optimization sql-server-2012 query-performance
我有一个查询,即使使用SQL Sentry,也无法消除索引扫描。
这是查询:
SELECT TOP 30 codCliente FROM (
SELECT t1.CodCliente, codcampo, valor, t1.chavealeat
FROM tblCliente AS t1 WITH(NOLOCK)
INNER JOIN tblClienteDetalhe AS t2 WITH(NOLOCK)
ON t1.codcliente = t2.codcliente
AND CodCampo IN(-1, 4)
WHERE codStatus IN (0)
AND t1.ChavePeriodo < GETDATE()
AND t1.CodStatusLigacao = 0
AND EXISTS
(
SELECT codcliente FROM tblclientedetalhe WITH(NOLOCK)
WHERE codcampo = 3 AND valor = '2'
AND codcliente = t1.codcliente
)
AND EXISTS
(
SELECT codcliente FROM tblclientedetalhe WITH(NOLOCK)
WHERE codcampo = 6
AND CONVERT(DATETIME, …Run Code Online (Sandbox Code Playgroud) performance sql-server-2008 sql-server clustered-index query-performance
我有一个categories表,它有两列,id和name.
我有一个types表,其中包含三列id,category_id和points。
我有一个products表,其中包含三列id,type_id和customer_id。
这意味着每个产品都有一个类型,每个类型都有一个类别。一个品类有多种类型,一种类型有多种产品。
我正在使用 MySQL 和 PHP。
从 PHP 中,给定customer_id,我想知道客户在每个类别中分别拥有多少分(例如,向用户显示一个表格)。
我的解决方案:我首先会做一个查询来查找所有类别 id,然后对于每个category_id我会找到该类别中的所有类型(即,所有具有给定 的类型category_id);然后对于每一个,type_id我会计算有多少产品同时具有那个type_id和给定的customer_id,我会把那个数量乘以给定的点数type_id。将每个结果的所有结果相加type_id,我最终得到了给定客户在这方面的总分category_id。正如我所说,我必须为每个category_id. 我的解决方案会起作用,但在我看来它会非常慢。我正在寻找有关如何以更好的方式解决此问题的建议 - 使用更少的查询,或更快的查询,或两者兼而有之。 按照现在的方式,它可能会执行与类别数量一样多的查询。
例子:
/* TABLE: categories */
name id
A 1
B 2
C 3
/* TABLE: types */
points id category_id …Run Code Online (Sandbox Code Playgroud) performance ×10
sql-server ×4
mysql ×3
index-tuning ×2
optimization ×2
postgresql ×2
count ×1
join ×1
php ×1
psql ×1