本文目錄一覽:
VBA遍歷比較問題
在外面再套一個For
Sub 遍歷比較問題()
Dim rg As Range
Dim counter As Double
Dim i As Long
For i = 1 To Range(“A65536”).End(xlUp).Row
counter = 0
For Each rg In Range(“A” i “:Z” i)
If rg.Value = Range(“AA” i).Value Then
If rg.Value = Range(“AB” i).Value Then
counter = counter + 1
End If
End If
Range(“AC” i) = counter
Next
Next
End Sub
請教VBA中的FOR EACH語句
dim ws as worksheet
dim int_index as integer
int_index = 2
dim wsJoin as worksheet
set wsJoin = worksheets(“練習3”).
for each ws in worksheets
if ws.name “練習3” then
ws.range(“A3:F3”).copy
int_index = int_index + 1
wsJoin.cells(int_index,1).select
ActiveSheet.Paste
End If
next
set wsJoin = Nothing
VBA中的range問題
有幾個地方不足,改正如下;
Sub rng()
Dim rng As Range
Dim i%
i = 1
For Each rng In Worksheets(“sheet1”).Range(“A1”, Cells(Rows.Count, 1).End(xlUp))
Worksheets(“sheet2”).Range(“A” CStr(i)) = rng
i = i + 1
Next rng
End Sub
Mysql分區表Partition
一、背景
話說風和日麗的一天,為提高隨着業務增長的大表(3510449行吧)的訪問效率,於是決定對錶分區,記錄如下。
二、實操
結合業務,若干條記錄會集中在一個日期,查詢時也往往只查詢一個日期內的數據,於是選取分區字段為時間。
創建分區 比如
CREATE TABLE message_all (
id int(10) NOT NULL AUTO_INCREMENT,
……
createtime datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘創建時間’
PRIMARY KEY ( id , createtime )
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE (YEAR(createtime))
(PARTITION p2015 VALUES LESS THAN (2016) ENGINE = InnoDB,
PARTITION p2016 VALUES LESS THAN (2017) ENGINE = InnoDB,
PARTITION p2017 VALUES LESS THAN (2018) ENGINE = InnoDB,
PARTITION p2018 VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
不過我們表已經有了當然不能這麼建,除非你想導一次數據。
如下操作 :
1、
ALTER TABLE message_all PARTITION BY RANGE (to_days(createtime))
(
PARTITION p2015 VALUES LESS THAN (to_days(‘2016-01-01’)),
PARTITION p2016 VALUES LESS THAN (to_days(‘2017-01-01’)),
PARTITION p2017 VALUES LESS THAN (to_days(‘2018-01-01’)),
PARTITION p2018 VALUES LESS THAN MAXVALUE
);
或者
2、ALTER TABLE message_all PARTITION BY RANGE (YEAR(createtime))
(
PARTITION p2015 VALUES LESS THAN (YEAR(‘2016-01-01’))
);
然後追加。
ALTER TABLE message_all ADD PARTITION
(
PARTITION p2016 VALUES LESS THAN (YEAR(‘2017-01-01’)),
PARTITION p2017 VALUES LESS THAN (YEAR(‘2018-01-01’)),
PARTITION p2018 VALUES LESS THAN MAXVALUE
);
這裡會有幾種錯誤情況:
1、ALTER TABLE message_all PARTITION BY RANGE (to_days(createtime)) ;
[Err] 1492 – For RANGE partitions each partition must be defined
解釋:必須指定至少一個分區。
2、[Err] 1492 – A PRIMARY KEY must include all columns in the table’s partitioning function
解釋:分區字段必須是主鍵之一。
3、[Err] 1492 – Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed
解釋:分區字段為timestamp,換成datetime。
4、[Err] 1526 – Table has no partition for value xxxx
解釋:用追加方式第一次必須覆蓋目前所有數據。
總結:
1、創建時必須指定至少一個分區。
2、key必須為主鍵之一。
3、RANGE處必須為INT型,時間字段用函數轉——YEAR()、YEARWEEK()、TO_DAYS()。
4、THAN處必須為INT型,時間字段用函數轉——TO_DAYS、TO_SECONDS()、UNIX_TIMESTAMP()。
5、它就是以兩個INT比大小劃分的文件。
6、所有ENGINE必須一樣。
7、範圍分區添加只能在最大值後面追加。
8、分區是有上限的貌似1024個。
用到的其他操作
1、刪除分區(直接扔掉分區文件,數據也沒了)
ALTER TABLE message_all DROP PARTITION p2016;
2、清空分區數據
ALTER TABLE message_all TRUNCATE PARTITION p2017;
3、重定義(可實現:分區拆分、合併、重命名)
ALTER TABLE message_all REORGANIZE PARTITION p201601,p201602,p201603,p201604 INTO
(
PARTITION p2016012 VALUES less than(TO_DAYS(‘2016-03-01’)),
PARTITION p2016034 VALUES less than(TO_DAYS(‘2016-05-01’))
);
檢查/查看你的分區
1、SHOW TABLE STATUS LIKE ‘message_all’;
2、SELECT * FROM information_schema.partitions WHERE table_name=’message_all’;
3、SHOW CREATE TABLE message_all;
4、EXPLAIN SELECT COUNT(1) FROM message_all WHERE createtime= ‘2016-01-01’ AND createtime ‘2016-12-30’;如果用到了分區partitions里會有顯示。
5、指定分區查
SELECT COUNT(1) FROM message_all PARTITION (p2016) 表別名 WHERE ……;
到這裡就結束啦,馬鈴薯白。
一些概念
水平分區Partition有以下幾種模式
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/304155.html