这是场景
SQL> exec dbms_stats.gather_table_stats(user,'TM', cascade=>true)
PL/SQL procedure successfully completed.
SQL> SELECT SEGMENT_NAME , SEGMENT_TYPE , BYTES / 1024 / 1024 MB , BLOCKS FROM DBA_SEGMENTS WHERE SEGMENT_NAME IN ('TM', 'TM_LD_IX');
SEGMENT_NAME SEGMENT_TYPE MB BLOCKS
------------------------------------------ ---------- ----------
TM TABLE 296 37888
TM_LD_IX INDEX 46 5888
SQL> select index_name , column_name from user_ind_columns where index_name = 'TM_LD_IX';
INDEX_NAME COLUMN_NAME
------------ ------------------------------
TM_LD_IX LD
SQL> explain plan for select distinct LD from TM;
Explained.
SQL> @ex
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 4241255022 …Run Code Online (Sandbox Code Playgroud) 我有一张表,上面有东西的关税;在这种情况下,关税表并不重要,“关税值”很重要。在此演示 SQL Fiddle 中,tariff_plan是tariffplans表的 FK (未包含在示例中)。每个“东西”的关税是tariff_type(出于演示目的简化为一个简单的字符)。
例如,我有一个默认的关税计划(key = default);这是适用于每个客户的资费,除非为该客户定义了另一个值tariff_type。为客户分配了关税计划(plan_x在我的示例中为键 = )。
如果有定义项目的关税a,b,c并且d在默认的计划。在 plan_x 中,我为a和定义了“覆盖”值c。
所以,我做的是我选择default计划(化名p低于p rimary)和左加入“覆盖”计划(plan_x)把它(别名s下面小号econdary):
select *
from tariff_values as p
left outer join tariff_values s
on (p.tariff_type = s.tariff_type) and (s.tariff_plan = 'plan_x')
where (p.tariff_plan = 'default')
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,这导致:
id tariff_plan …Run Code Online (Sandbox Code Playgroud) 是否可以使用 T-SQL 判断查询上次访问统计信息的时间?我试图确定查询中涉及哪些统计信息,我知道我可以检查可视化查询计划,但我想知道是否有一个表(或多个表)包含这些信息。
过去两天我一直为此而头疼。
CREATE TABLE `clients` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`guarantor_name` varchar(50) NOT NULL,
`guarantor_dob` date DEFAULT NULL,
`guarantor_relationship` int(11) DEFAULT '14',
`telephone_number` varchar(50) DEFAULT NULL,
`telephone_type` int(11) DEFAULT '7',
`state` varchar(50) DEFAULT '',
`pincode` mediumint(6) unsigned NOT NULL,
`income` int(11) DEFAULT NULL,
`family_income` int(11) DEFAULT NULL,
`name` varchar(100) NOT NULL,
`gender` int(11) DEFAULT '2',
`marital_status` int(11) DEFAULT '1',
`reference` varchar(100) DEFAULT NULL,
`reference_type` int(11) DEFAULT '4',
`reference2` varchar(50) DEFAULT NULL,
`reference2_type` int(11) DEFAULT '2',
`spouse_name` varchar(100) DEFAULT NULL, …Run Code Online (Sandbox Code Playgroud) 我们使用 Postgres 进行分析(星型模式)。每隔几秒钟,我们就会收到大约 500 种指标类型的报告。最简单的模式是:
timestamp metric_type value
78930890 FOO 80.9
78930890 ZOO 20
Run Code Online (Sandbox Code Playgroud)
我们的 DBA 提出了一个建议,将所有相同 5 秒的报告展平为:
timestamp metric1 metric2 ... metric500
78930890 90.9 20 ...
Run Code Online (Sandbox Code Playgroud)
一些开发人员反驳这种说法,称这增加了开发的巨大复杂性(批处理数据,以便一次性编写)和可维护性(仅查看表或添加字段更复杂)。
DBA 模型是此类系统中的标准做法还是仅在原始模型显然不够可扩展时的最后手段?
编辑:最终目标是为用户绘制折线图。因此,查询主要是选择几个指标,按小时/分钟折叠它们,然后选择每小时(或任何其他时间段)的最小值/最大值/平均值。
编辑:DBA 的主要论点是将行数减少 x500 次将允许更高效的索引和内存(在此优化之前,该表将包含数亿行)。然后在选择多个度量标准时,建议的架构将允许一个通过数据而不是每个度量的单独索引搜索。
编辑:500 个指标是一个“上限”,但实际上大部分时间每 5 秒只报告约 40 个指标(虽然不是相同的 40)
好吧,我的问题很简单。
假设当我单击数据库并将鼠标悬停在收缩上时,它表示可以减少 1 GB 空间。
现在当我备份这个数据库时,这个空间是否也被添加到备份文件或备份过程有点特殊并且它已经缩小了?
SQL 服务器 2012
我有一个查询,例如-
select x, sum(y) from xyz where z>=100 group by x order by sum(y) desc;
Run Code Online (Sandbox Code Playgroud)
如果我要在 x 上添加索引会更快吗?
为什么 MySQL 说即使我的服务器只有大约 2GB 的内存也可以使用大约 16GB 的内存?
# ./mysqltuner.pl
>> MySQLTuner 1.2.0 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering
-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.5.34-cll
[OK] Operating on 32-bit architecture with less than 2GB RAM
-------- Storage Engine Statistics -------------------------------------------
[--] Status: +Archive -BDB -Federated +InnoDB -ISAM -NDBCluster
[--] Data in MyISAM …Run Code Online (Sandbox Code Playgroud) 换句话说,是否可以声明一列VARCHAR(n)并使其估计大小不是n/2?
一个示例用例可能是存储 URL - 您希望大多数是相对的并且少于 20 个字符左右(例如“About/AboutUs”),但希望偶尔支持带有大量查询字符串参数的长 URL。
我正在尝试优化几个在其中一个WHERE子句上都使用类似模式的查询:
AND (DATEADD(DAY
, ISNULL(a.[due_days], 30) + 30
, [dbo].[CalcDate]([type], date1, date2, date3, date4, NULL))
) < GETDATE()
Run Code Online (Sandbox Code Playgroud)
CalcDate基于type字段值的udf进行一些比较并返回一个日期。然后将天数添加到该日期并与当前日期进行比较。为了能够使用现有的索引,due_days我想转换操作以将所有转换应用到GETDATE(),假设我想sargable在可能的情况下实现它。另外,如果有一些关于可以做些什么来更好地改进 udf 的使用的建议。
optimization ×10
sql-server ×4
mysql ×3
performance ×2
backup ×1
group-by ×1
index ×1
index-tuning ×1
memory ×1
oracle ×1
order-by ×1
postgresql ×1
shrink ×1
star-schema ×1
statistics ×1
t-sql ×1